intersect_circle

  discussion on how to detect intersections
intersection math game




  circles and rectanges - formula and algorithm
At 21/42 30/06/99 +0100, darrell wilkins wrote:

In lingo it is fairly east to detect if two rectangles intersect
using something like:

if intersect(rect1,rect2) <> rect(0,0,0,0) then whatever...

It is also fairly straight forward to detect if two circles
intersect. (if the distance between the two centers < the two radius
added together you have a intersect.)

But how do you test for the intersect of a circle and a rectange? I'm
*not* talking about intersecting sprites thats easy. Rather I want
the formula or an algorithm for testing the these sort of intersects.

While we are on the subject of algorithms, does anyone know a
resource where I can find more on coding techniques. I know there are
different sorting algorithms (like bubble sorts etc.) but does anyone
know where I might find some other useful routines, ideally with a
bit of theory on how they work. (anything that could be useful for
games programming would be especially good.) I'm not looking for
lingo code neccessarily but rather pseudo code that could be
converted into any language.

To which Ike Eisenhauer responded:

Here is a pseudocode for testing if a circle centered at Xc,Yc with a Radius
of R is intersecting a Rectangle centered at Xr,Yr with a height H and a
Width W.

This assumes computer display coordinate system (ie. X increases to the
right and Y increases downward)

Step 1.  Test intersection of rectangles [Xc-R,Yc-R,Xc+r,Yc+r] and
[Xr-W/2,Yr-H/2,Xr+W/2,Yr+H/2]
Step 2.  If Step 1 is
     a.     False -- Return NotIntersected
     b.     True  -- Go to Step 3
Step 3.  Calculate
     a.     Value1=(Xr-W/2-Xc)^2 + (Yr-H/2-Yc)^2) 
     b.     Value2=(Xr+W/2-Xc)^2 + (Yr-H/2-Yc)^2)
     c.     Value3=(Xr-W/2-Xc)^2 + (Yr+H/2-Yc)^2)
     d.     Value4=(Xr+W/2-Xc)^2 + (Yr+H/2-Yc)^2)
Step 4.  If all values calculated in Step 3 are > R^2 then Return
NotIntersected
     a.  Else Return IntersectionDetected

That should get you started.  Obviously you need to translate this to Lingo.
It's not optimized because I wanted to make it clear not confusing.  Any
questions on how this works just email me off list.

Two good books for algorithms are:

A Programmer's Geometery  ISBN 0408012420
Intro to Algorithms ISBN 0070131430

Although the last one is nasty deep in math and neither one of them
pertained to this problem.


And then Darrel Plant said:

There are some great articles in recent issues of Game Developer magazine
on intersection testing for both 2D and 3D, but here's how I'd start:

First test to see whether the rectangle and the bounding box for the circle
intersect. If they don't then you know there's no intersection.

Pre-generate a series of points for the perimeter of the circle (stored as
offsets from the center of the circle, so it can move), and if the bounding
box intersect fails, start checking those points for being inside the
rectangle. The number of points you generate will obviously slow things
down, but 10-30 per circle should suffice, depending on the size of your
circles (I did 100000 raw inside () tests in 513ms on a 300 MHz G3).


to which Mark Whybird answered:

Darrel Plant wrote:
        > Pre-generate a series of points for the perimeter of the circle (stored as
        > offsets from the center of the circle, so it can move), and if the bounding
        > box intersect fails, start checking those points for being inside the
        > rectangle

This is a good solution, but it will fail if the ellipse can completely
enclose the rectangle.

The deeply mathematical solution would be to find the area of the
intersection of the two shapes - if it's > 0, they intersect. Other
mathematical solutions that come to mind, like finding any intersections of
the line segments and the ellipse fall prey to the same kinds of problems as
above - like if the oval encloses the rect, or vice versa - but you could
quickly check for these two special cases using the good old rectangle
intersects routines (if the intersection rect equals either one of the ones
you started with, then one encloses the other.).  In fact, you'd do the rect
intersects trick first anyway, as a quick way of rejecting cases where they
are nowhere near each other, as everyone has pointed out already.

Or you could use Danial Plant's very practical solution with the additional
test for enclosure with the intersecting rects.

I hope this helps,
-- Mark Whybird

Home shock + cgi Bits 'n pieces Director Lingo ShockLets Contact