I'm working on a project, and I need to be able to detect collisions between circles. I already found a mathematical formula for that : http://cgp.wikidot.com/circle-to-circle-collision-detection
But I've got a question, how can I detect if there is a rectangle in this area ? Or just a part of a rectangle inside ?
I've got : coordinates of the center of a circle and the radius, and for the rectanble I've got a x and y coordinate, and width an height. I guess that x and y are just a point and with that I'm able to guess the form with the width and the height.
Any idea ?
Thanks a lot !
Write a method to check whether a point lies within a circle or not.
Call that method for all corner points of the rectangle (calculated from x, y, width and height) on both circles.
Use your existing circle intersection detector method to prune calls.
Hope this helps.
Good luck.
You can use java.awt.geom.Area class.
It has a constructor to create an Area from Shape
public Area(Shape s)
So create simple areas for your circles and rectangle. Then you can either combine areas using the methods to obtain new areas.
public void add(Area rhs)
public void subtract(Area rhs)
And check whether area intersects or contains another area via
public void intersect(Area rhs)
public boolean contains(Rectangle2D r)
This sounds like a variation of the technique described in this answer.
The same two cases apply (either the circle's centre is in the region, or one or more of the rectangle's edges intersects the region)... the difference is that instead of considering the circle in general, you need to consider the intersection of the circle.
The first case is easy because you can swap centre points. If the rectangle's centre point is in the intersection of the circles, then the rectangle is partly inside. This is easy to determine: find the centre point of the rectangle, see if it's in the first circle, see if it's in the second circle.
The second case is complicated, because it requires you to calculate the curves where the circles intersect. If the edges of the rectangle intersect either of those curves then the rectangle overlaps the intersection. As a special case, if one circle lies completely inside the other one, then the line to check is the border of the smaller circle.
If you don't need an exact answer, then the second case can be approximated. First, find the points where the two circles intersect (or use the method you've already come up with, if you can). These two points can be used to construct a bounding rectangle (they are either the top left/bottom right or top right/bottom left points of a rectangle). If this bounding rectangle intersects with your rectangle, then your rectangle probably overlaps the circle intersection.
All in all, this is fairly complicated if you want to an exact answer that works properly with all of the special cases (one circle completely inside the other, the rectangle intersects both circles but not their intersection, etc). I hope this helps a little.
A library I've used before called the JTS topology suite might be appropriate for your needs. It's orientated more towards GIS operations than pure euclidean geometry, but it can easily do all of these calculations for you once you've got the shapes defined:
import com.vividsolutions.jts.util.*
GeometricShapeFactory gsf = new GeometricShapeFactory();
gsf.setSize(100);
gsf.setNumPoints(100);
gsf.setBase(new Coordinate(100, 100));
//configure the circle as appropriate
Polygon circleA = gsf.createCircle();
//configure again and create a separate circle
Polygon circleB = gsf.createCircle();
//configure a rectangle this time
Polygon rectangle = gsf.createRectangle();
Geometry circleIntersection = circleA.intersection(circleB);
return rectangle.intersects(circleIntersection);
Related
I want to detect when a polygon and a Circle collide. Other possibility that i have think is with rectangle, but it can't be possible because i want to rotate the rectangle, so what is the solution?
Thank you
There is Intersector class in LibGDX, it should work just fine for your needs.
libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html
Use intersectSegmentCircle method.
It does take Vector2 variables as arguments, so you have to use Vector2 for storing x and y coordinates of your points - circle center and polygon vertices.
There are also Polygon and Circle classes, you can use those for storing coordinates as Vector2.
Anyway, lets assume you already have circle and polygon described by set of Vector2 points:
Vector2 circleCenter, PolyVertex1, PolyVertex2, PolyVertex3, ..., PolyVertexN;
There are line segments between polygon vertices, you have to check, if any of those segments intersects with circle. So, for every pair of verices, check, if:
intersectSegmentCircle(PolyVertex1, PolyVertex2, circleCenter, radius^2);
intersectSegmentCircle(PolyVertex2, PolyVertex3, circleCenter, radius^2);
...
intersectSegmentCircle(PolyVertexN-1, PolyVertexN, circleCenter, radius^2);
intersectSegmentCircle(PolyVertexN, PolyVertex1), circleCenter, radius^2);
returns true. If yes, it means your polygon and circle colided.
In some cases (small circle and large polygon), there can be no intersection between polygon edges and circle, whole circle can be inside polygon. Then you will have to use isPointInPolygon() method. It takes Array of Vector2 (polygon vertices) and Vector2 (cirlce center) as arguments.
So, store polygon vertices in array, and check if isPointInPolygon returns true. If yes, then again, there is collision.
Array <Vector2> PolyVertices;
...
isPointInPolygon(PolyVertices,circleCenter);
Dont copy&paste above code, wont work because of lack of initialization and thelike ;) But i hope, idea is clear.
Does anyone have any suggestions on the best way to handle triangle intersections with rectangles and circles in LibGDX? I see the Intersector class has methods for testing intersections with triangles and rays, but I'm not sure how I can directly apply that to rectangles or circles. I also see there's an isPointInTriangle method, which I could perhaps use to cycle through the points of the triangle and rectangle?
http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html
Maybe I'm just missing an easy, already existing function within LibGDX? Any help would be very much appreciated.
Triangles and rectangles are both considered to be polygons so use libGDX Polygon class to describe your triangles and rectangles and then use Intersector class to intersect them.
For circles you can either:
Approximate it with polygon (say 10 points around in circle) and then use Intersector class.
Create your own custom circle to polygon collision checker.
A simple algorithm to check polygon and circle collision that comes to mind:
if center of circle is inside the polygon =>>> they overlap.
else if distance between circle center and any of the polygons vertices is less then circle radius =>>> they overlap.
else =>>> they dont overlap.
This is considering you don't need to know what exactly is the overlapping portion of these figures and you only want to know if they overlap. If you need to know the overlapping portion then approximating your circle with polygon is the only way to go.
I have a program with a Ellipse2D (which is a circle) and a Polygon object. I have decided to use the collision detection solution at this question to handle the detection of collisions.
I want the circle object to remain on top of the polygon at all times.
I now know when the Ellipse2D object intersects the polygon, but I would like to know WHERE they intersect. I don't currently know of any way to detect how high the circle object should move in order to remain on top of the polygon.
My intent is to move the circle upwards to always remain "on top" of the polygon when the two objects move toward each other horizontally.
Is there a tool or method out there that I am not aware of that returns a collision point or is this something I will have to develop on my own?
Subtract one Area from the other. The Bounds of the resulting area will represent the overlap between the two objects. The center of the overlapping Bounds will most likely either be the collision point, or so close as to fool the viewer into thinking it is.
I currently have an arraylist of points from a freehand drawing on a canvas. I was wondering if there is a simple algorithm to detect if that shape represents a circle.I have already researched this a little and the main items I am pointed at are either the Hough transform or having bitmap images but both of these seem a little over the top for what I need it for. Any pointers to algorithms or implementation would be very helpful.
thanks in advance sansoms,
If I interpret your question correctly, you want to know if all the points are on a circle.
As illustrated in the picture, we pick three points A, B, C from the list and compute the origin O of the presumed circle. By checking the distance between O and each point from the list, we can conclude whether these points are on a circle.
If you do not know what the user wanted to draw (e.g., a circle, an ellipse, a line, or a rectangle), you could use some basic optimization algorithm to find the shape best matching the hand-drawn points.
for each basic shape (oval, rectangle, triangle, line, etc.), create a random instance of that shape and measure the error w.r.t. the given points
optimize each of the shapes (individually) until you have the oval best matching the given points, the rectangle best matching the points, the best triangle, etc.
pick the shape that has the lowest error and draw it
Maybe this answer can give you some ideas: https://stackoverflow.com/a/940041/12860
In short: calculate the second derivative. If it is quite constand, it is probably a circle.
Reading your comment, an easier method to draw a circle is for the user to click the center point, then drag the radius of the circle. It's a lot less calculation, and easier for the user to draw.
You can do the same thing with a rectangle, or any other convex polygon.
I'm trying to draw a 5 point star in AWT.
Each point in the 2d grid is 72 degrees apart - so I thought I could draw the polygon using only 5 points by ordering the points 144 degrees apart, so the polygon gets fed the points in order 1,3,5,2,4
Unfortunately, this involves a lot of intersecting lines, and the end result is that there are 5 triangles with my desired colour, circling a pentagon that has not been coloured.
Looking through, it has something to do with an even-odd rule, that intersecting points will not be filled.
I need my star to be drawn dynamically, and using the specific shape described (for scaling and such).
If I manually plot the points where it intersects, I get some human error in my star's shape.
Is there any way to just turn this feature off, or failing that, is there a way to get the polygon to return an array of x[] and y[] where lines intersect so I can just draw another one inside it?
Thanks.
Draw it with ten points, 36 degrees apart, at two alternating radii.
Establish the 10-point Polygon in cartesian coordinates, as suggested by relet and as shown in this example. Note how the coordinate system is centered on the origin for convenience in rotating, scaling and translating. Because Polygon implements the Shape interface, the createTransformedShape() method of AffineTransform may be applied. A more advanced shape library may be found here.
Is there a way to get the polygon to return an array of x[] and y[] where lines intersect?
Although typically unnecessary, you can examine the component coordinates using a Shape's PathIterator. I found it instructive to examine the coordinates before and after invoking createTransformedShape().