home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
RISC DISC 3
/
RISC_DISC_3.iso
/
resources
/
etexts
/
gems
/
gemsi
/
circlerect.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-08
|
2KB
|
46 lines
/*
Fast Circle-Rectangle Intersection Checking
by Clifford A. Shaffer
from "Graphics Gems", Academic Press, 1990
*/
#include "GraphicsGems.h"
boolean Check_Intersect(R, C, Rad)
/* Return TRUE iff rectangle R intersects circle with centerpoint C and
radius Rad. */
Box2 *R;
Point2 *C;
double Rad;
{
double Rad2;
Rad2 = Rad * Rad;
/* Translate coordinates, placing C at the origin. */
R->max.x -= C->x; R->max.y -= C->y;
R->min.x -= C->x; R->min.y -= C->y;
if (R->max.x < 0) /* R to left of circle center */
if (R->max.y < 0) /* R in lower left corner */
return ((R->max.x * R->max.x + R->max.y * R->max.y) < Rad2);
else if (R->min.y > 0) /* R in upper left corner */
return ((R->max.x * R->max.x + R->min.y * R->min.y) < Rad2);
else /* R due West of circle */
return(ABS(R->max.x) < Rad);
else if (R->min.x > 0) /* R to right of circle center */
if (R->max.y < 0) /* R in lower right corner */
return ((R->min.x * R->min.x) < Rad2);
else if (R->min.y > 0) /* R in upper right corner */
return ((R->min.x * R->min.x + R->min.y + R->min.y) < Rad2);
else /* R due East of circle */
return (R->min.x < Rad);
else /* R on circle vertical centerline */
if (R->max.y < 0) /* R due South of circle */
return (ABS(R->max.y) < Rad);
else if (R->min.y > 0) /* R due North of circle */
return (R->min.y < Rad);
else /* R contains circle centerpoint */
return(TRUE);
}