/* ** Instead of using ring orientation we count the number of parts the ** point falls in. If odd the point is in the polygon, if 0 or even ** then the point is in a hole or completely outside. */ int msIntersectPointPolygon(pointObj *point, shapeObj *poly) { int i; int status=MS_FALSE; for(i=0; i<poly->numlines; i++) { if(msPointInPolygon(point, &poly->line[i]) == MS_TRUE) /* ok, the point is in a line */ status = !status; } return(status); }
/* static int intersectLabelPolygons(shapeObj *p1, shapeObj *p2) { */ int intersectLabelPolygons(shapeObj *p1, shapeObj *p2) { int c1,v1,c2,v2; pointObj *point; /* STEP 0: check bounding boxes */ if(!msRectOverlap(&p1->bounds, &p2->bounds)) { /* from [email protected] */ return(MS_FALSE); } /* STEP 1: look for intersecting line segments */ for(c1=0; c1<p1->numlines; c1++) for(v1=1; v1<p1->line[c1].numpoints; v1++) for(c2=0; c2<p2->numlines; c2++) for(v2=1; v2<p2->line[c2].numpoints; v2++) if(msIntersectSegments(&(p1->line[c1].point[v1-1]), &(p1->line[c1].point[v1]), &(p2->line[c2].point[v2-1]), &(p2->line[c2].point[v2])) == MS_TRUE) { return(MS_TRUE); } /* STEP 2: polygon one completely contains two (only need to check one point from each part) */ for(c2=0; c2<p2->numlines; c2++) { point = &(p2->line[c2].point[0]); for(c1=0; c1<p1->numlines; c1++) { if(msPointInPolygon(point, &p1->line[c1]) == MS_TRUE) /* ok, the point is in a polygon */ return(MS_TRUE); } } /* STEP 3: polygon two completely contains one (only need to check one point from each part) */ for(c1=0; c1<p1->numlines; c1++) { point = &(p1->line[c1].point[0]); for(c2=0; c2<p2->numlines; c2++) { if(msPointInPolygon(point, &p2->line[c2]) == MS_TRUE) /* ok, the point is in a polygon */ return(MS_TRUE); } } return(MS_FALSE); }