GEOS
3.8.0dev

Counts the number of segments crossed by a horizontal ray extending to the right from a given point, in an incremental fashion. More...
#include <RayCrossingCounter.h>
Public Member Functions  
RayCrossingCounter (const geom::Coordinate &p_point)  
void  countSegment (const geom::Coordinate &p1, const geom::Coordinate &p2) 
bool  isOnSegment () 
int  getLocation () 
bool  isPointInPolygon () 
Static Public Member Functions  
static int  locatePointInRing (const geom::Coordinate &p, const geom::CoordinateSequence &ring) 
static int  locatePointInRing (const geom::Coordinate &p, const std::vector< const geom::Coordinate * > &ring) 
Semantically equal to the above, just different args encoding.  
static int  orientationIndex (const geom::Coordinate &p1, const geom::Coordinate &p2, const geom::Coordinate &q) 
Returns the index of the direction of the point q relative to a vector specified by p1p2 . More...  
Counts the number of segments crossed by a horizontal ray extending to the right from a given point, in an incremental fashion.
This can be used to determine whether a point lies in a Polygonal geometry. The class determines the situation where the point lies exactly on a segment. When being used for PointInPolygon determination, this case allows shortcircuiting the evaluation.
This class handles polygonal geometries with any number of shells and holes. The orientation of the shell and hole rings is unimportant. In order to compute a correct location for a given polygonal geometry, it is essential that all segments are counted which
The only exception is when the pointonsegment situation is detected, in which case no further processing is required. The implication of the above rule is that segments which can be a priori determined to not touch the ray (i.e. by a test of their bounding box or Yextent) do not need to be counted. This allows for optimization by indexing.
void geos::algorithm::RayCrossingCounter::countSegment  (  const geom::Coordinate &  p1, 
const geom::Coordinate &  p2  
) 
Counts a segment
p1  an endpoint of the segment 
p2  another endpoint of the segment 
int geos::algorithm::RayCrossingCounter::getLocation  (  ) 
Gets the Location of the point relative to the ring, polygon or multipolygon from which the processed segments were provided.
This method only determines the correct location if all relevant segments must have been processed.

inline 
Reports whether the point lies exactly on one of the supplied segments. This method may be called at any time as segments are processed. If the result of this method is true
, no further segments need be supplied, since the result will never change again.
bool geos::algorithm::RayCrossingCounter::isPointInPolygon  (  ) 
Tests whether the point lies in or on the ring, polygon or multipolygon from which the processed segments were provided.
This method only determines the correct location if all relevant segments must have been processed.

static 
Determines the Location of a point in a ring. This method is an exemplar of how to use this class.
p  the point to test 
ring  an array of Coordinates forming a ring 

static 
Returns the index of the direction of the point q
relative to a vector specified by p1p2
.
p1  the origin point of the vector 
p2  the final point of the vector 
q  the point to compute the direction to 