Mail Archives: djgpp/1997/10/05/16:48:19
I have been doing some things like this myself, and I find it easiest to
think of the two rectangles as being two pairs of intervals. One
interval is on the x line (x1,x2) for both rectangles, and (y1,y2) is on
the y-line. Only if both pairs of intervals overlap (the two x
intervals, and the two y intervals) will there be an overlap.
Testing for the corners being included in the other rectangle isn't
useful: think of the red cross sign as being made up of two overlapping
rectangles.
With the rule x1 <= x2 and y1 <= y2 (and inclusive coords) we have;
bool
overlap(RECT a, RECT b)
{
return (a.x1 <= b.x2 && a.x2 >= b.x1) &&
(a.y1 <= b.y2 && a.y2 >= b.y1);
}
If this is correct (from memory, as I don't have the code in front of
me), I think is it close to being optimal as the eight scalar quantities
involved are used only once, and there are only 4 tests.
G DOT DegliEsposti AT ads DOT it wrote:
> Andrew Deren wrote:
> > Does anyone know how to detect if two rectangles overlap each
> > other at some point. Let's say we have something like this:
> >
> > typedef struct RECT {
> > int x1, y1, x2, y2;
> > } RECT;
> I alway use another way, which costs almost the same but is simplier
> to write:
> if A and B overlap each other then they have an intersection, so I
> test if they intersect and the intersection is a real rectangle:
>
> This tests if the intersection of A and B is a valid rectangle (ie
> x1<x2 and y1<y2)
>
> // A and B must be valid rectangles...
> bool overlap(RECT A, RECT B)
> {
> // I = intersect(A,B); return isvalid(I);
> return (min(A.x2,B.x1) < max(A.x1,B.x2)) && (min(A.x2,B.x1) <
> max(A.x1,B.x2))
> }
- Raw text -