18 #include <sys/types.h>
19 #include <sys/param.h>
20 #include <sys/times.h>
37 #define TEST_POLYGONS 30
40 #define TEST_POINTS 30
44 #define ANGLE_TEST_TIMES 1000
45 #define BARYCENTRIC_TEST_TIMES 10000
46 #define CROSSINGS_TEST_TIMES 10000
47 #define MACMARTIN_TEST_TIMES 10000
50 int argc;
char *argv[];
53 int angle_flag, barycentric_flag, crossings_flag, macmartin_flag ;
67 #ifdef CENTERED_SQUARE
98 if ( angle_flag != crossings_flag ) {
99 printf(
"angle test says %s, crossings test says %s\n",
100 angle_flag ?
"INSIDE" :
"OUTSIDE",
101 crossings_flag ?
"INSIDE" :
"OUTSIDE" ) ;
108 if ( barycentric_flag != macmartin_flag ) {
109 printf(
"barycentric test says %s, macmartin test says %s\n",
110 barycentric_flag ?
"INSIDE" :
"OUTSIDE",
111 macmartin_flag ?
"INSIDE" :
"OUTSIDE" ) ;
119 inside_tot += crossings_flag ;
122 printf(
"angle test time: %g microseconds per test\n",
124 printf(
"barycentric test time: %g microseconds per test\n",
126 printf(
"crossings test time: %g microseconds per test\n",
128 printf(
"macmartin crossings test time: %g microseconds per test\n",
131 printf(
"%g %% of all points were inside polygons\n",
142 int i,
j, inside_flag ;
146 double *vtx0, *vtx1, angle, len, vec0[2], vec1[2] ;
149 timestart = times( &timebuf ) ;
155 if ( (len = hypot( vec0[
X], vec0[
Y] )) <= 0.0 ) {
167 if ( (len = hypot( vec1[
X], vec1[
Y] )) <= 0.0 ) {
175 if ( vec0[
X] * vec1[
Y] - vec1[
X] * vec0[
Y] >= 0.0 ) {
177 angle += acos( vec0[
X] * vec1[
X] + vec0[
Y] * vec1[
Y] ) ;
180 angle -= acos( vec0[
X] * vec1[
X] + vec0[
Y] * vec1[
Y] ) ;
192 inside_flag = fmod( fabs(angle) + M_PI, 4.0*M_PI ) > 2.0*M_PI ;
194 timestop = times( &timebuf ) ;
199 return (inside_flag) ;
209 int i, tris_hit, inside_flag, p1, p2 ;
213 double tx, ty, u0, u1, u2, v0, v1, alpha, beta, denom ;
216 timestart = times( &timebuf ) ;
224 for ( p1 = 1, p2 = 2 ; p2 <
numverts ; p1++, p2++ ) {
226 if ( ( u1 =
pgon[0][
X] -
pgon[p2][
X] ) == 0.0 ) {
229 if ( ( u2 =
pgon[p1][
X] -
pgon[p2][
X] ) == 0.0 ) {
234 if ( ( ( beta = ( tx -
pgon[p2][
X] ) / u2 ) < 0.0 ) ||
240 if ( ( v1 =
pgon[0][
Y] -
pgon[p2][
Y] ) == 0.0 ) {
244 if ( ( alpha = ( ty -
pgon[p2][
Y] - beta *
245 (
pgon[p1][
Y] -
pgon[p2][
Y] ) ) / v1 ) < 0.0 ) {
250 if ( ( denom = (
pgon[p1][
Y] -
pgon[p2][
Y] ) * u1 -
252 ( v1 =
pgon[0][
Y] -
pgon[p2][
Y] ) ) == 0.0 ) {
258 u0 = tx -
pgon[p2][
X] ;
259 v0 = ty -
pgon[p2][
Y] ;
261 if ( ( ( ( beta = ( v0 * u1 - u0 * v1 ) / denom ) ) < 0.0 ) ||
266 if ( ( alpha = ( u0 - beta * u2 ) / u1 ) < 0.0 ) {
272 if ( alpha + beta <= 1.0 ) {
279 inside_flag = tris_hit & 0x1 ;
281 timestop = times( &timebuf ) ;
286 return (inside_flag) ;
296 int i,
j, inside_flag, xflag0 ;
300 double *vtx0, *vtx1, dv0 ;
301 int crossings, yflag0, yflag1 ;
304 timestart = times( &timebuf ) ;
309 yflag0 = ( dv0 = vtx0[
Y] -
point[
Y] ) >= 0.0 ;
318 yflag0 = ( dv0 = vtx0[
Y] -
point[
Y] ) >= 0.0 ;
321 yflag1 = ( vtx1[
Y] >=
point[
Y] ) ;
325 if ( yflag0 != yflag1 ) {
327 if ( ( xflag0 = ( vtx0[
X] >=
point[
X] ) ) ==
330 if ( xflag0 ) crossings++ ;
335 crossings += (vtx0[
X] -
336 dv0*( vtx1[
X]-vtx0[
X])/(vtx1[
Y]-vtx0[
Y])) >=
point[
X] ;
344 inside_flag = crossings & 0x01 ;
346 timestop = times( &timebuf ) ;
351 return (inside_flag) ;
361 int i, inside_flag, xflag0 ;
370 timestart = times( &timebuf ) ;
379 p = (
double *)
pgon + 1 ;
380 if ( ( y >= ty ) != ( *p >= ty ) ) {
383 ( *(
double *)
pgon >= tx ) ) {
385 if ( xflag0 ) crossings++ ;
397 for ( y=*p,p += 2 ; p < stop ; y=*p,p+=2) {
400 while ( (p < stop) && (*p >= ty) ) p+=2 ;
401 if ( p >= stop )
goto Exit ;
403 if ( ( xflag0 = ( *(p-3) >= tx ) ) ==
406 if ( xflag0 ) crossings++ ;
411 crossings += ( *(p-3) -
412 (*(p-2)-ty)*( *(p-1)-*(p-3))/(*p-*(p-2))) >= tx ;
415 while ( (p < stop) && (*p < ty)) p+=2 ;
416 if ( p >= stop )
goto Exit ;
418 if ( ( xflag0 = ( *(p-3) >= tx ) ) ==
421 if ( xflag0 ) crossings++ ;
426 crossings += ( *(p-3) -
427 (*(p-2)-ty)*( *(p-1)-*(p-3))/(*p-*(p-2))) >= tx ;
437 inside_flag = crossings & 0x01 ;
439 timestop = times( &timebuf ) ;
444 return (inside_flag) ;
printf("fbuf is %s\n", fbuf)
double CrossingsTimeTotal
double BarycentricTimeTotal
int crossingstest(pgon, numverts, point)
int angletest(pgon, numverts, point)
double MacmartinTimeTotal
int macmartintest(pgon, numverts, point)
#define MACMARTIN_TEST_TIMES
int barycentrictest(pgon, numverts, point)
#define CROSSINGS_TEST_TIMES
#define BARYCENTRIC_TEST_TIMES