Table of Contents

Class RayCrossingCounter

Namespace
NetTopologySuite.Algorithm
Assembly
NetTopologySuite.dll

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 IPolygonal 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.

public class RayCrossingCounter
Inheritance
RayCrossingCounter
Inherited Members

Remarks

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

  • touch the ray
  • lie in in any ring which may contain the point

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.

This implementation uses the extended-precision orientation test, to provide maximum robustness and consistency within other algorithms.

Constructors

RayCrossingCounter(Coordinate)

Creates an instance of this class

public RayCrossingCounter(Coordinate p)

Parameters

p Coordinate

A coordinate.

Properties

IsOnSegment

Reports whether the point lies exactly on one of the supplied segments.

public bool IsOnSegment { get; }

Property Value

bool

Remarks

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.

IsPointInPolygon

Tests whether the point lies in or on the ring, polygon or multipolygon from which the processed segments were provided.

public bool IsPointInPolygon { get; }

Property Value

bool

Remarks

This property only determines the correct location if all relevant segments have been processed

Location

Gets the Location of the point relative to the ring, polygon or multipolygon from which the processed segments were provided.

public Location Location { get; }

Property Value

Location

Remarks

This property only determines the correct location if all relevant segments have been processed.

Methods

CountSegment(Coordinate, Coordinate)

Counts a segment

public void CountSegment(Coordinate p1, Coordinate p2)

Parameters

p1 Coordinate

An endpoint of the segment

p2 Coordinate

Another endpoint of the segment

LocatePointInRing(Coordinate, CoordinateSequence)

Determines the Location of a point in a ring.

public static Location LocatePointInRing(Coordinate p, CoordinateSequence ring)

Parameters

p Coordinate

The point to test

ring CoordinateSequence

A coordinate sequence forming a ring

Returns

Location

The location of the point in the ring

LocatePointInRing(Coordinate, Coordinate[])

Determines the Location of a point in a ring. This method is an exemplar of how to use this class.

public static Location LocatePointInRing(Coordinate p, Coordinate[] ring)

Parameters

p Coordinate

The point to test

ring Coordinate[]

An array of Coordinates forming a ring

Returns

Location

The location of the point in the ring