BOOL8 C_OUTLINE::operator< ( //winding number const C_OUTLINE & other //other outline ) const { inT16 count = 0; //winding count ICOORD pos; //position of point inT32 stepindex; //index to cstep if (!box.overlap (other.box)) return FALSE; //can't be contained if (stepcount == 0) return other.box.contains(this->box); pos = start; for (stepindex = 0; stepindex < stepcount && (count = other.winding_number (pos)) == INTERSECTING; stepindex++) pos += step (stepindex); //try all points if (count == INTERSECTING) { //all intersected pos = other.start; for (stepindex = 0; stepindex < other.stepcount && (count = winding_number (pos)) == INTERSECTING; stepindex++) //try other way round pos += other.step (stepindex); return count == INTERSECTING || count == 0; } return count != 0; }
BOOL8 OUTLINE::operator< ( //winding number OUTLINE & other //other outline ) { inT16 count; //winding count POLYPT_IT it = &outline; //iterator if (!box.overlap (other.box)) return FALSE; //can't be contained do { count = other.winding_number (FCOORD (it.data ()->pos)); //get winding number if (count != INTERSECTING) return count != 0; it.forward (); } while (!it.at_first ()); //switch lists it.set_to_list (&other.outline); do { //try other way round count = winding_number (FCOORD (it.data ()->pos)); if (count != INTERSECTING) return count == 0; it.forward (); } while (!it.at_first ()); return TRUE; }
static int is_inside_polygon( Point P, Point *polygon, long n) { int cleanup_needed=0; int wn; Point *copy=malloc((n+1)*sizeof(Point)); memcpy(copy,polygon,n*sizeof(Point)); /* as we are searching for inclusion, close the polygon...*/ if ( (copy[0].lat == copy[n-1].lat) && (copy[0].lon == copy[n-1].lon) ) { n--; } else { copy[n].lat= copy[0].lat; copy[n].lon= copy[0].lon; } if ( (P.lat != 0.0) || (P.lon != 0.0) ) { copy= shift_polygon(P,copy,n); } wn= winding_number(copy,n); free(copy); if (wn == 0) { return 0; } else { return 1; } }
BOOL8 POLY_BLOCK::overlap( // do polys overlap POLY_BLOCK *other) { inT16 count; //winding count ICOORDELT_IT it = &vertices; //iterator ICOORD vertex; if (!box.overlap (*(other->bounding_box ()))) return FALSE; //can't be any overlap /* see if a vertex of this is inside other */ do { vertex = *it.data (); //get winding number count = other->winding_number (vertex); if (count != INTERSECTING) if (count != 0) return (TRUE); it.forward (); } while (!it.at_first ()); /* see if a vertex of other is inside this */ //switch lists it.set_to_list (other->points ()); do { vertex = *it.data (); //try other way round count = winding_number (vertex); if (count != INTERSECTING) if (count != 0) return (TRUE); it.forward (); } while (!it.at_first ()); return FALSE; }
BOOL8 POLY_BLOCK::contains( //other outline POLY_BLOCK *other) { inT16 count; //winding count ICOORDELT_IT it = &vertices; //iterator ICOORD vertex; if (!box.overlap (*(other->bounding_box ()))) return FALSE; //can't be contained /* check that no vertex of this is inside other */ do { vertex = *it.data (); //get winding number count = other->winding_number (vertex); if (count != INTERSECTING) if (count != 0) return (FALSE); it.forward (); } while (!it.at_first ()); /* check that all vertices of other are inside this */ //switch lists it.set_to_list (other->points ()); do { vertex = *it.data (); //try other way round count = winding_number (vertex); if (count != INTERSECTING) if (count == 0) return (FALSE); it.forward (); } while (!it.at_first ()); return TRUE; }