Package org.joml

Class PolygonsIntersection

java.lang.Object
org.joml.PolygonsIntersection

public class PolygonsIntersection extends Object
Class for polygon/point intersection tests when testing many points against one or many static concave or convex, simple polygons.

This is an implementation of the algorithm described in http://alienryderflex.com and augmented with using a custom interval tree to avoid testing all polygon edges against a point, but only those that intersect the imaginary ray along the same y co-ordinate of the search point. This algorithm additionally also supports multiple polygons.

This class is thread-safe and can be used in a multithreaded environment when testing many points against the same polygon concurrently.

Reference: http://alienryderflex.com

Author:
Kai Burjack
  • Field Details

    • verticesXY

      protected final float[] verticesXY
  • Constructor Details

    • PolygonsIntersection

      public PolygonsIntersection(float[] verticesXY, int[] polygons, int count)
      Create a new PolygonsIntersection object with the given polygon vertices.

      The verticesXY array contains the x and y coordinates of all vertices. This array will not be copied so its content must remain constant for as long as the PolygonPointIntersection is used with it.

      Parameters:
      verticesXY - contains the x and y coordinates of all vertices
      polygons - defines the start vertices of a new polygon. The first vertex of the first polygon is always the vertex with index 0. In order to define a hole simply define a polygon that is completely inside another polygon
      count - the number of vertices to use from the verticesXY array, staring with index 0
  • Method Details

    • testPoint

      public boolean testPoint(float x, float y)
      Test whether the given point (x, y) lies inside any polygon stored in this PolygonsIntersection object.

      This method is thread-safe and can be used to test many points concurrently.

      In order to obtain the index of the polygon the point is inside of, use testPoint(float, float, BitSet)

      Parameters:
      x - the x coordinate of the point to test
      y - the y coordinate of the point to test
      Returns:
      true iff the point lies inside any polygon; false otherwise
      See Also:
    • testPoint

      public boolean testPoint(float x, float y, BitSet inPolys)
      Test whether the given point (x, y) lies inside any polygon stored in this PolygonsIntersection object.

      This method is thread-safe and can be used to test many points concurrently.

      Parameters:
      x - the x coordinate of the point to test
      y - the y coordinate of the point to test
      inPolys - if not null then the i-th bit is set if the given point is inside the i-th polygon
      Returns:
      true iff the point lies inside the polygon and not inside a hole; false otherwise