Алгоритм пересечения линии для возврата false, когда конечные точки находятся точно в одном и том же месте? - PullRequest
0 голосов
/ 08 января 2020

Я не писал этот алгоритм, но я использую его в своем проекте. Всякий раз, когда две конечные точки линий находятся в одном и том же месте, возвращается значение true. Однако это нежелательно. Я хотел бы, чтобы это возвращало значение false, когда две конечные точки находятся в одном и том же месте, но даже немного прошедшее должно возвращать значение true.

enter image description here

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;
}

1 Ответ

1 голос
/ 08 января 2020

Я думаю, вы должны учитывать только открытые интервалы, когда вы return:

return (t > 0) && (t < 1) && (u > 0) && (u < 1);

Это должно заботиться о случае, как на вашей иллюстрации , но также вернет false, если в На вашей иллюстрации вы расширяете горизонтальную линию вправо. Если это не то поведение, которое вы ищете, тогда должно быть условие, что либо t находится в закрытом интервале, либо u находится в закрытом интервале, но не оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...