int msIntersectPolygons(shapeObj *p1, shapeObj *p2) { int c1,v1,c2,v2; /* STEP 1: polygon 1 completely contains 2 (only need to check one point from each part) */ for(c2=0; c2<p2->numlines; c2++) { if(msIntersectPointPolygon(&(p2->line[c2].point[0]), p1) == MS_TRUE) // this considers holes and multiple parts return(MS_TRUE); } /* STEP 2: polygon 2 completely contains 1 (only need to check one point from each part) */ for(c1=0; c1<p1->numlines; c1++) { if(msIntersectPointPolygon(&(p1->line[c1].point[0]), p2) == MS_TRUE) // this considers holes and multiple parts return(MS_TRUE); } /* STEP 3: 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); /* ** At this point we know there are are no intersections between edges. There may be other tests necessary ** but I haven't run into any cases that require them. */ return(MS_FALSE); }
int msIntersectPolygons(shapeObj *p1, shapeObj *p2) { int i; /* STEP 1: polygon 1 completely contains 2 (only need to check one point from each part) */ for(i=0; i<p2->numlines; i++) { if(msIntersectPointPolygon(&(p2->line[i].point[0]), p1) == MS_TRUE) /* this considers holes and multiple parts */ return(MS_TRUE); } /* STEP 2: polygon 2 completely contains 1 (only need to check one point from each part) */ for(i=0; i<p1->numlines; i++) { if(msIntersectPointPolygon(&(p1->line[i].point[0]), p2) == MS_TRUE) /* this considers holes and multiple parts */ return(MS_TRUE); } /* STEP 3: look for intersecting line segments */ if (msIntersectPolylines(p1, p2) == MS_TRUE) return(MS_TRUE); /* ** At this point we know there are are no intersections between edges. There may be other tests necessary ** but I haven't run into any cases that require them. */ return(MS_FALSE); }
int msIntersectMultipointPolygon(multipointObj *points, shapeObj *poly) { int i; for(i=0; i<points->numpoints; i++) { if(msIntersectPointPolygon(&(points->point[i]), poly) == MS_TRUE) return(MS_TRUE); } return(MS_FALSE); }
int msIntersectPolylinePolygon(shapeObj *line, shapeObj *poly) { int i; /* STEP 1: polygon might competely contain the polyline or one of it's parts (only need to check one point from each part) */ for(i=0; i<line->numlines; i++) { if(msIntersectPointPolygon(&(line->line[i].point[0]), poly) == MS_TRUE) /* this considers holes and multiple parts */ return(MS_TRUE); } /* STEP 2: look for intersecting line segments */ if (msIntersectPolylines(line, poly) == MS_TRUE) return (MS_TRUE); return(MS_FALSE); }
int msIntersectMultipointPolygon(shapeObj *multipoint, shapeObj *poly) { int i,j; /* The change to loop through all the lines has been made for ticket * #2443 but is no more needed since ticket #2762. PostGIS now put all * points into a single line. */ for(i=0; i<multipoint->numlines; i++ ) { lineObj points = multipoint->line[i]; for(j=0; j<points.numpoints; j++) { if(msIntersectPointPolygon(&(points.point[j]), poly) == MS_TRUE) return(MS_TRUE); } } return(MS_FALSE); }
int msIntersectPolylinePolygon(shapeObj *line, shapeObj *poly) { int c1,v1,c2,v2; // STEP 1: polygon might competely contain the polyline or one of it's parts (only need to check one point from each part) for(c1=0; c1<line->numlines; c1++) { if(msIntersectPointPolygon(&(line->line[c1].point[0]), poly) == MS_TRUE) // this considers holes and multiple parts return(MS_TRUE); } // STEP 2: look for intersecting line segments for(c1=0; c1<line->numlines; c1++) for(v1=1; v1<line->line[c1].numpoints; v1++) for(c2=0; c2<poly->numlines; c2++) for(v2=1; v2<poly->line[c2].numpoints; v2++) if(msIntersectSegments(&(line->line[c1].point[v1-1]), &(line->line[c1].point[v1]), &(poly->line[c2].point[v2-1]), &(poly->line[c2].point[v2])) == MS_TRUE) return(MS_TRUE); return(MS_FALSE); }
double msDistancePointToShape(pointObj *point, shapeObj *shape) { int i, j; double dist, minDist=-1; switch(shape->type) { case(MS_SHAPE_POINT): for(j=0;j<shape->numlines;j++) { for(i=0; i<shape->line[j].numpoints; i++) { dist = msDistancePointToPoint(point, &(shape->line[j].point[i])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } break; case(MS_SHAPE_LINE): for(j=0;j<shape->numlines;j++) { for(i=1; i<shape->line[j].numpoints; i++) { dist = msDistancePointToSegment(point, &(shape->line[j].point[i-1]), &(shape->line[j].point[i])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } break; case(MS_SHAPE_POLYGON): if(msIntersectPointPolygon(point, shape)) minDist = 0; // point is IN the shape else { // treat shape just like a line for(j=0;j<shape->numlines;j++) { for(i=1; i<shape->line[j].numpoints; i++) { dist = msDistancePointToSegment(point, &(shape->line[j].point[i-1]), &(shape->line[j].point[i])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } } break; default: break; } return(minDist); }
double msDistanceShapeToShape(shapeObj *shape1, shapeObj *shape2) { int i,j,k,l; double dist, minDist=-1; switch(shape1->type) { case(MS_SHAPE_POINT): // shape1 for(i=0;i<shape1->numlines;i++) { for(j=0; j<shape1->line[i].numpoints; j++) { dist = msDistancePointToShape(&(shape1->line[i].point[j]), shape2); if((dist < minDist) || (minDist < 0)) minDist = dist; } } break; case(MS_SHAPE_LINE): // shape1 switch(shape2->type) { case(MS_SHAPE_POINT): for(i=0;i<shape2->numlines;i++) { for(j=0; j<shape2->line[i].numpoints; j++) { dist = msDistancePointToShape(&(shape2->line[i].point[j]), shape1); if((dist < minDist) || (minDist < 0)) minDist = dist; } } break; case(MS_SHAPE_LINE): for(i=0;i<shape1->numlines;i++) { for(j=1; j<shape1->line[i].numpoints; j++) { for(k=0;k<shape2->numlines;k++) { for(l=1; l<shape2->line[k].numpoints; l++) { // check intersection (i.e. dist=0) if(msIntersectSegments(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])) == MS_TRUE) return(0); // no intersection, compute distance dist = msDistanceSegmentToSegment(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } } } break; case(MS_SHAPE_POLYGON): // shape2 (the polygon) could contain shape1 or one of it's parts for(i=0; i<shape1->numlines; i++) { if(msIntersectPointPolygon(&(shape1->line[0].point[0]), shape2) == MS_TRUE) // this considers holes and multiple parts return(0); } // check segment intersection and, if necessary, distance between segments for(i=0;i<shape1->numlines;i++) { for(j=1; j<shape1->line[i].numpoints; j++) { for(k=0;k<shape2->numlines;k++) { for(l=1; l<shape2->line[k].numpoints; l++) { // check intersection (i.e. dist=0) if(msIntersectSegments(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])) == MS_TRUE) return(0); // no intersection, compute distance dist = msDistanceSegmentToSegment(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } } } break; } break; case(MS_SHAPE_POLYGON): // shape1 switch(shape2->type) { case(MS_SHAPE_POINT): for(i=0;i<shape2->numlines;i++) { for(j=0; j<shape2->line[i].numpoints; j++) { dist = msDistancePointToShape(&(shape2->line[i].point[j]), shape1); if((dist < minDist) || (minDist < 0)) minDist = dist; } } break; case(MS_SHAPE_LINE): // shape1 (the polygon) could contain shape2 or one of it's parts for(i=0; i<shape2->numlines; i++) { if(msIntersectPointPolygon(&(shape2->line[i].point[0]), shape1) == MS_TRUE) // this considers holes and multiple parts return(0); } // check segment intersection and, if necessary, distance between segments for(i=0;i<shape1->numlines;i++) { for(j=1; j<shape1->line[i].numpoints; j++) { for(k=0;k<shape2->numlines;k++) { for(l=1; l<shape2->line[k].numpoints; l++) { // check intersection (i.e. dist=0) if(msIntersectSegments(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])) == MS_TRUE) return(0); // no intersection, compute distance dist = msDistanceSegmentToSegment(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } } } break; case(MS_SHAPE_POLYGON): // shape1 completely contains shape2 (only need to check one point from each part) for(i=0; i<shape2->numlines; i++) { if(msIntersectPointPolygon(&(shape2->line[i].point[0]), shape1) == MS_TRUE) // this considers holes and multiple parts return(0); } // shape2 completely contains shape1 (only need to check one point from each part) for(i=0; i<shape1->numlines; i++) { if(msIntersectPointPolygon(&(shape1->line[i].point[0]), shape2) == MS_TRUE) // this considers holes and multiple parts return(0); } // check segment intersection and, if necessary, distance between segments for(i=0;i<shape1->numlines;i++) { for(j=1; j<shape1->line[i].numpoints; j++) { for(k=0;k<shape2->numlines;k++) { for(l=1; l<shape2->line[k].numpoints; l++) { // check intersection (i.e. dist=0) if(msIntersectSegments(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])) == MS_TRUE) return(0); // no intersection, compute distance dist = msDistanceSegmentToSegment(&(shape1->line[i].point[j-1]), &(shape1->line[i].point[j]), &(shape2->line[k].point[l-1]), &(shape2->line[k].point[l])); if((dist < minDist) || (minDist < 0)) minDist = dist; } } } } break; } break; } return(minDist); }