JTS Topology Suite version 1.12

com.vividsolutions.jts.algorithm
Class RayCrossingCounter

java.lang.Object
  extended by com.vividsolutions.jts.algorithm.RayCrossingCounter

public class RayCrossingCounter
extends java.lang.Object

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 Point-In-Polygon determination, this case allows short-circuiting 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 point-on-segment 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 Y-extent) do not need to be counted. This allows for optimization by indexing.

Author:
Martin Davis

Constructor Summary
RayCrossingCounter(Coordinate p)
           
 
Method Summary
 void countSegment(Coordinate p1, Coordinate p2)
          Counts a segment
 int getLocation()
          Gets the Location of the point relative to the ring, polygon or multipolygon from which the processed segments were provided.
 boolean isOnSegment()
          Reports whether the point lies exactly on one of the supplied segments.
 boolean isPointInPolygon()
          Tests whether the point lies in or on the ring, polygon or multipolygon from which the processed segments were provided.
static int locatePointInRing(Coordinate p, Coordinate[] ring)
          Determines the Location of a point in a ring.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

RayCrossingCounter

public RayCrossingCounter(Coordinate p)
Method Detail

locatePointInRing

public static int locatePointInRing(Coordinate p,
                                    Coordinate[] ring)
Determines the Location of a point in a ring. This method is an exemplar of how to use this class.

Parameters:
p - the point to test
ring - an array of Coordinates forming a ring
Returns:
the location of the point in the ring

countSegment

public void countSegment(Coordinate p1,
                         Coordinate p2)
Counts a segment

Parameters:
p1 - an endpoint of the segment
p2 - another endpoint of the segment

isOnSegment

public boolean isOnSegment()
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.

Returns:
true if the point lies exactly on a segment

getLocation

public int 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.

Returns:
the Location of the point

isPointInPolygon

public boolean 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.

Returns:
true if the point lies in or on the supplied polygon

JTS Topology Suite version 1.12