GEOS  3.13.0dev
Public Types | Static Public Member Functions | List of all members
geos::algorithm::Orientation Class Reference

Functions to compute the orientation of basic geometric structures including point triplets (triangles) and rings. More...

#include <Orientation.h>

Public Types

enum  {
  CLOCKWISE = -1 , COLLINEAR = 0 , COUNTERCLOCKWISE = 1 , RIGHT = -1 ,
  LEFT = 1 , STRAIGHT = 0
}
 

Static Public Member Functions

static int index (const geom::CoordinateXY &p1, const geom::CoordinateXY &p2, const geom::CoordinateXY &q)
 Returns the orientation index of the direction of the point q relative to a directed infinite line specified by p1-p2. More...
 
static bool isCCW (const geom::CoordinateSequence *ring)
 
static bool isCCWArea (const geom::CoordinateSequence *ring)
 

Detailed Description

Functions to compute the orientation of basic geometric structures including point triplets (triangles) and rings.

Orientation is a fundamental property of planar geometries (and more generally geometry on two-dimensional manifolds).

Orientation is notoriously subject to numerical precision errors in the case of collinear or nearly collinear points. JTS uses extended-precision arithmetic to increase the robustness of the computation.

Author
Martin Davis

Member Function Documentation

◆ index()

static int geos::algorithm::Orientation::index ( const geom::CoordinateXY &  p1,
const geom::CoordinateXY &  p2,
const geom::CoordinateXY &  q 
)
static

Returns the orientation index of the direction of the point q relative to a directed infinite line specified by p1-p2.

The index indicates whether the point lies to the Orientation::LEFT or Orientation::RIGHT of the line, or lies on it Orientation::COLLINEAR. The index also indicates the orientation of the triangle formed by the three points ( Orientation::COUNTERCLOCKWISE, Orientation::CLOCKWISE, or Orientation::STRAIGHT )

Referenced by geos::geom::LineSegment::orientationIndex().

◆ isCCW()

static bool geos::algorithm::Orientation::isCCW ( const geom::CoordinateSequence ring)
static

Computes whether a ring defined by a geom::CoordinateSequence is oriented counter-clockwise.

  • The list of points is assumed to have the first and last points equal.
  • This handles coordinate lists which contain repeated points.
  • This handles rings which contain collapsed segments (in particular, along the top of the ring).

This algorithm is guaranteed to work with valid rings. It also works with "mildly invalid" rings which contain collapsed (coincident) flat segments along the top of the ring. If the ring is "more" invalid (e.g. self-crosses or touches), the computed result may not be correct.

Parameters
ringa CoordinateSequence forming a ring (with first and last point identical)
Returns
true if the ring is oriented counter-clockwise.
Exceptions
IllegalArgumentExceptionif there are too few points to determine orientation (< 4)

◆ isCCWArea()

static bool geos::algorithm::Orientation::isCCWArea ( const geom::CoordinateSequence ring)
static

Tests if a ring defined by a CoordinateSequence is oriented counter-clockwise, using the signed area of the ring.

  • The list of points is assumed to have the first and last points equal.
  • This handles coordinate lists which contain repeated points.
  • This handles rings which contain collapsed segments (in particular, along the top of the ring).
  • This handles rings which are invalid due to self-intersection

This algorithm is guaranteed to work with valid rings. For invalid rings (containing self-intersections), the algorithm determines the orientation of the largest enclosed area (including overlaps). This provides a more useful result in some situations, such as buffering.

However, this approach may be less accurate in the case of rings with almost zero area. (Note that the orientation of rings with zero area is essentially undefined, and hence non-deterministic.)

Parameters
ringa CoordinateSequence forming a ring (with first and last point identical)
Returns
true if the ring is oriented counter-clockwise.

The documentation for this class was generated from the following file: