Проверьте, находится ли точка на линии в Java Swing - PullRequest
2 голосов
/ 02 февраля 2012

Я нарисовал линию, а затем точку, и затем я хочу проверить, находится ли точка на линии или нет. Я взял координату строки в массиве (так как было более одной строки). Я хочу проверить текущую точку в последней строке или нет?

if (positionX1 == positionX2 && positionY1 == positionY2) {
    float m = line.getSlope(
        drawLines[currentLines - 1][2], drawLines[currentLines - 1][3],
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    m = Float.parseFloat(df.format(m));
    float c = line.getIntercept(
        drawLines[currentLines - 1][2], drawLines[currentLines - 1][3],
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    c = Math.round(c);
    m1 = line.getSlope(positionX2, positionY2,
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    m1 = Float.parseFloat(df.format(m1));
    System.out.println(m + "   " + m1);
    c1 = line.getIntercept(positionX2, positionY2,
        drawLines[currentLines - 1][0], drawLines[currentLines - 1][1]);
    c1 = Math.round(c1);

    if (m == m1 && ((c == c1) || (c == c1 - 1) || (c == c1 + 1))) {
        System.out.println("Point is on Line");
    }
}

Проблема в том, что точка находится рядом с начальной точкой линии или когда линия соответствует вертикальным значениям m1 и c1 изменяется с большой разницей. Таким образом, существует проблема с определением точки на линии или нет. Как я могу проверить эту ситуацию?

Ответы [ 3 ]

9 голосов
/ 02 февраля 2012

Line2D.ptSegDist(x1, y1, x2, y2, xP, yP) возвращает 0.0, если точка (xP, yP) находится на отрезке от (x1, y1) до (x2, y2).Line2D.ptLineDist делает то же самое для бесконечной линии.

2 голосов
/ 02 февраля 2012

Используйте векторную форму расстояния от точки до линии , где линия равна x = a + t n .

Если вместо единичного вектора n используется неединичный вектор N , то d =|| ( a - p ) - (( a - p ) · N ) N / ( N · N ) ||, который устраняет квадратный корень.

Предполагая, что массивы с плавающей точкой, которые вы используете для описания строк,интерпретируется как {x1, y1, x2, y2}, затем a = (x1, y1) и N = (x2 - x1, y2 - y1).

Если рассчитанное расстояние сопоставимо с ошибками измерения или арифметики, точка находится на линии.Опять же, вам не нужно вычислять квадратный корень в модуле, но вы можете сравнить квадратное значение.

1 голос
/ 02 февраля 2012

С точки зрения алгоритма, линия (отличная от вертикальной, которая имеет уравнение типа x = постоянная) имеет вид y = mx + b.Если ваша точка удовлетворяет этому уравнению, то она находится на прямой.Поэтому все, что вам нужно, это найти значение наклона линии, ее y-пересечение и проверить, удовлетворяют ли значения x и y точки уравнению для каждой линии.

РЕДАКТИРОВАТЬ:

Как указано в комментарии выше, вы можете использовать форму уклона-точки (с уклоном (y2-y1) / (x2 / x1)) вместо формы перехвата-наклона.Это дало бы вам уравнение, которое зависит исключительно от y, x и начальной и конечной точек линий, которые было бы намного проще кодировать (так как вы определяете линию по ее начальной и конечной точкам, по крайней мере, в колебании).Единственная причина, по которой я предложил форму перехвата с наклоном, заключается в том, что вы уже пытались использовать ее в своем алгоритме.

...