Я не писал этот алгоритм, но я использую его в своем проекте. Всякий раз, когда две конечные точки линий находятся в одном и том же месте, возвращается значение true. Однако это нежелательно. Я хотел бы, чтобы это возвращало значение false, когда две конечные точки находятся в одном и том же месте, но даже немного прошедшее должно возвращать значение true.
private boolean doLineSegmentsIntersect(Point p, Point p2, Point q, Point q2) {
//Used to calculate intersecting lines
Point r = subtractPoints(p2, p);
Point s = subtractPoints(q2, q);
float uNumerator = crossProduct(subtractPoints(q, p), r);
float denominator = crossProduct(r, s);
if (denominator == 0) {
//Lines are parallel
return false;
}
float u = uNumerator / denominator;
float t = crossProduct(subtractPoints(q, p), s) / denominator;
return (t >= 0) && (t <= 1) && (u > 0) && (u <= 1);
}
private float crossProduct(Point point1, Point point2) {
return point1.x * point2.y - point1.y * point2.x;
}
private Point subtractPoints(Point point1, Point point2) {
Point result = new Point();
result.x = point1.x - point2.x;
result.y = point1.y - point2.y;
return result;
}