736{
737 int wn = 0;
738 uint32_t i;
739 double side;
743
744 POSTGIS_DEBUG(2, "point_in_ring called.");
745
747 if (!lines)
748 return -1;
749
750 for (i=0; i<lines->
ngeoms; i++)
751 {
754
756
757 POSTGIS_DEBUGF(3,
"segment: (%.8f, %.8f),(%.8f, %.8f)", seg1->
x, seg1->
y, seg2->
x, seg2->
y);
758 POSTGIS_DEBUGF(3, "side result: %.8f", side);
760
761
762 if (((seg2->
x - seg1->
x)*(seg2->
x - seg1->
x) + (seg2->
y - seg1->
y)*(seg2->
y - seg1->
y)) < 1e-12*1e-12)
763 {
764 POSTGIS_DEBUG(3, "segment is zero length... ignoring.");
765
766 continue;
767 }
768
769
770
771 if (side == 0.0)
772 {
774 {
775 POSTGIS_DEBUGF(3, "point on ring boundary between points %d, %d", i, i+1);
776
777 return 0;
778 }
779 }
780
781
782
783
784
785
786 if ((seg1->
y <= point->
y) && (point->
y < seg2->
y) && (side > 0))
787 {
788 POSTGIS_DEBUG(3, "incrementing winding number.");
789
790 ++wn;
791 }
792
793
794
795
796
797 else if ((seg2->
y <= point->
y) && (point->
y < seg1->
y) && (side < 0))
798 {
799 POSTGIS_DEBUG(3, "decrementing winding number.");
800
801 --wn;
802 }
803 }
804
805 POSTGIS_DEBUGF(3, "winding number %d", wn);
806
807 if (wn == 0)
808 return -1;
809 return 1;
810}
#define FP_CONTAINS_BOTTOM(A, X, B)
static int isOnSegment(const POINT2D *seg1, const POINT2D *seg2, const POINT2D *point)
static double determineSide(const POINT2D *seg1, const POINT2D *seg2, const POINT2D *point)
LWMLINE * RTreeFindLineSegments(RTREE_NODE *root, double value)
Retrieves a collection of line segments given the root and crossing value.
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.