Class Orientation


  • public class Orientation
    extends java.lang.Object
    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).

    Determining triangle 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
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static int CLOCKWISE
      A value that indicates an orientation of clockwise, or a right turn.
      static int COLLINEAR
      A value that indicates an orientation of collinear, or no turn (straight).
      static int COUNTERCLOCKWISE
      A value that indicates an orientation of counterclockwise, or a left turn.
      static int LEFT
      A value that indicates an orientation of counterclockwise, or a left turn.
      static int RIGHT
      A value that indicates an orientation of clockwise, or a right turn.
      static int STRAIGHT
      A value that indicates an orientation of collinear, or no turn (straight).
    • Constructor Summary

      Constructors 
      Constructor Description
      Orientation()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static int index​(Coordinate p1, Coordinate p2, Coordinate q)
      Returns the orientation index of the direction of the point q relative to a directed infinite line specified by p1-p2.
      static boolean isCCW​(Coordinate[] ring)
      Tests if a ring defined by an array of Coordinates is oriented counter-clockwise.
      static boolean isCCW​(CoordinateSequence ring)
      Tests if a ring defined by a CoordinateSequence is oriented counter-clockwise.
      static boolean isCCWArea​(Coordinate[] ring)
      Tests if a ring defined by an array of Coordinates is oriented counter-clockwise, using the signed area of the ring.
      • Methods inherited from class java.lang.Object

        equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • CLOCKWISE

        public static final int CLOCKWISE
        A value that indicates an orientation of clockwise, or a right turn.
        See Also:
        Constant Field Values
      • RIGHT

        public static final int RIGHT
        A value that indicates an orientation of clockwise, or a right turn.
        See Also:
        Constant Field Values
      • COUNTERCLOCKWISE

        public static final int COUNTERCLOCKWISE
        A value that indicates an orientation of counterclockwise, or a left turn.
        See Also:
        Constant Field Values
      • LEFT

        public static final int LEFT
        A value that indicates an orientation of counterclockwise, or a left turn.
        See Also:
        Constant Field Values
      • COLLINEAR

        public static final int COLLINEAR
        A value that indicates an orientation of collinear, or no turn (straight).
        See Also:
        Constant Field Values
      • STRAIGHT

        public static final int STRAIGHT
        A value that indicates an orientation of collinear, or no turn (straight).
        See Also:
        Constant Field Values
    • Constructor Detail

      • Orientation

        public Orientation()
    • Method Detail

      • index

        public static int index​(Coordinate p1,
                                Coordinate p2,
                                Coordinate q)
        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 LEFT or RIGHT of the line, or lies on it COLLINEAR. The index also indicates the orientation of the triangle formed by the three points ( COUNTERCLOCKWISE, CLOCKWISE, or STRAIGHT )
        Parameters:
        p1 - the origin point of the line vector
        p2 - the final point of the line vector
        q - the point to compute the direction to
        Returns:
        -1 ( CLOCKWISE or RIGHT ) if q is clockwise (right) from p1-p2; 1 ( COUNTERCLOCKWISE or LEFT ) if q is counter-clockwise (left) from p1-p2; 0 ( COLLINEAR or STRAIGHT ) if q is collinear with p1-p2
      • isCCW

        public static boolean isCCW​(Coordinate[] ring)
        Tests if a ring defined by an array of Coordinates 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:
        ring - an array of Coordinates forming a ring (with first and last point identical)
        Returns:
        true if the ring is oriented counter-clockwise.
        Throws:
        java.lang.IllegalArgumentException - if there are too few points to determine orientation (< 4)
      • isCCW

        public static boolean isCCW​(CoordinateSequence ring)
        Tests if a ring defined by a 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:
        ring - a CoordinateSequence forming a ring (with first and last point identical)
        Returns:
        true if the ring is oriented counter-clockwise.
      • isCCWArea

        public static boolean isCCWArea​(Coordinate[] ring)
        Tests if a ring defined by an array of Coordinates 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:
        ring - an array of Coordinates forming a ring (with first and last point identical)
        Returns:
        true if the ring is oriented counter-clockwise.