A LineIntersector is an algorithm that can both test whether
two line segments intersect and compute the intersection point
if they do.
The intersection point may be computed in a precise or non-precise manner.
Computing it precisely involves rounding it to an integer. (This assumes
that the input coordinates have been made precise by scaling them to
an integer grid.)
COLLINEAR
public static final int COLLINEAR
DONT_INTERSECT
public static final int DONT_INTERSECT
DO_INTERSECT
public static final int DO_INTERSECT
intLineIndex
protected int[][] intLineIndex
The indexes of the endpoints of the intersection lines, in order along
the corresponding line
isProper
protected boolean isProper
precisionModel
protected PrecisionModel precisionModel
If makePrecise is true, computed intersection coordinates will be made precise
using Coordinate#makePrecise
result
protected int result
computeEdgeDistance
public static double computeEdgeDistance(Coordinate p,
Coordinate p0,
Coordinate p1)
Computes the "edge distance" of an intersection point p along a segment.
The edge distance is a metric of the point along the edge.
The metric used is a robust and easy to compute metric function.
It is
not equivalent to the usual Euclidean metric.
It relies on the fact that either the x or the y ordinates of the
points in the edge are unique, depending on whether the edge is longer in
the horizontal or vertical direction.
NOTE: This function may produce incorrect distances
for inputs where p is not precisely on p1-p2
(E.g. p = (139,9) p1 = (139,10), p2 = (280,1) produces distanct 0.0, which is incorrect.
My hypothesis is that the function is safe to use for points which are the
result of
rounding points which lie on the line,
but not safe to use for
truncated points.
computeIntLineIndex
protected void computeIntLineIndex()
computeIntLineIndex
protected void computeIntLineIndex(int segmentIndex)
computeIntersection
public abstract void computeIntersection(Coordinate p,
Coordinate p1,
Coordinate p2)
Compute the intersection of a point p and the line p1-p2.
This function computes the boolean value of the hasIntersection test.
The actual value of the intersection (if there is one)
is equal to the value of p
.
computeIntersection
public void computeIntersection(Coordinate p1,
Coordinate p2,
Coordinate p3,
Coordinate p4)
Computes the intersection of the lines p1-p2 and p3-p4.
This function computes both the boolean value of the hasIntersection test
and the (approximate) value of the intersection point itself (if there is one).
getEdgeDistance
public double getEdgeDistance(int segmentIndex,
int intIndex)
Computes the "edge distance" of an intersection point along the specified input line segment.
segmentIndex
- is 0 or 1intIndex
- is 0 or 1
- the edge distance of the intersection point
getIndexAlongSegment
public int getIndexAlongSegment(int segmentIndex,
int intIndex)
Computes the index of the intIndex'th intersection point in the direction of
a specified input line segment
segmentIndex
- is 0 or 1intIndex
- is 0 or 1
- the index of the intersection point along the segment (0 or 1)
getIntersection
public Coordinate getIntersection(int intIndex)
Returns the intIndex'th intersection point
- the intIndex'th intersection point
getIntersectionAlongSegment
public Coordinate getIntersectionAlongSegment(int segmentIndex,
int intIndex)
Computes the intIndex'th intersection point in the direction of
a specified input line segment
segmentIndex
- is 0 or 1intIndex
- is 0 or 1
- the intIndex'th intersection point in the direction of the specified input line segment
getIntersectionNum
public int getIntersectionNum()
Returns the number of intersection points found. This will be either 0, 1 or 2.
hasIntersection
public boolean hasIntersection()
Tests whether the input geometries intersect.
- true if the input geometries intersect
isCollinear
protected boolean isCollinear()
isEndPoint
protected boolean isEndPoint()
isInteriorIntersection
public boolean isInteriorIntersection()
Tests whether either intersection point is an interior point of one of the input segments.
true
if either intersection point is in the interior of one of the input segments
isInteriorIntersection
public boolean isInteriorIntersection(int inputLineIndex)
Tests whether either intersection point is an interior point of the specified input segment.
true
if either intersection point is in the interior of the input segment
isIntersection
public boolean isIntersection(Coordinate pt)
Test whether a point is a intersection point of two line segments.
Note that if the intersection is a line segment, this method only tests for
equality with the endpoints of the intersection segment.
It does not return true if
the input point is internal to the intersection segment.
- true if the input point is one of the intersection points.
isProper
public boolean isProper()
Tests whether an intersection is proper.
The intersection between two line segments is considered proper if
they intersect in a single point in the interior of both segments
(e.g. the intersection is a single point and is not equal to any of the
endpoints).
The intersection between a point and a line segment is considered proper
if the point lies in the interior of the segment (e.g. is not equal to
either of the endpoints).
- true if the intersection is proper
nonRobustComputeEdgeDistance
public static double nonRobustComputeEdgeDistance(Coordinate p,
Coordinate p1,
Coordinate p2)
This function is non-robust, since it may compute the square of large numbers.
Currently not sure how to improve this.
setMakePrecise
public void setMakePrecise(PrecisionModel precisionModel)
use setPrecisionModel
instead
Force computed intersection to be rounded to a given precision model
setPrecisionModel
public void setPrecisionModel(PrecisionModel precisionModel)
Force computed intersection to be rounded to a given precision model.
No getter is provided, because the precision model is not required to be specified.
toString
public String toString()