Результат метода перпендикулярной бисектора

Я новичок в JTS с Java. Я хотел бы получить серединный перпендикуляр к отрезку ab.

  • координата а(2,3)
  • координата b(8,7)

Я использовал метод перпендикулярного бисектора, но не могу понять его результат. Мне кажется, что это вообще не связано с серединным перпендикуляром. Не могли бы вы объяснить значение результата и как использовать результат для перпендикулярной биссектрисы?

package Sui;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Triangle;
import com.vividsolutions.jts.algorithm.HCoordinate;
import com.vividsolutions.jts.algorithm.NotRepresentableException;

public class Suitwo {

    public static void main (String[] args) {

        System.out.println("");
        Suitwo main = new Suitwo();
        main.testCalcCoord();
    }

    public void testCalcCoord() {

        Coordinate[] coords = {new Coordinate(2, 3),
                               new Coordinate(8, 7),
                               new Coordinate(0, 0)};

        Triangle tri = new Triangle(coords[0],coords[1],coords[2]);
        HCoordinate hcoord = tri.perpendicularBisector(coords[0],coords[1]);

        Coordinate calccord = new Coordinate();
        double x = 0.0;
        double y = 0.0;
        try {
            calccord = hcoord.getCoordinate();
            x = hcoord.getX();
            y = hcoord.getY();
        } catch (NotRepresentableException e) {
            System.out.println("NotRepresentableException");
            System.exit(1);
        }

        System.out.print("calccord:");
        System.out.println(calccord);
        System.out.print("X:");
        System.out.println(x);
        System.out.print("Y:");
        System.out.println(y);
    }
}

РЕЗУЛЬТАТ

расчет: (-0,12, -0,08, NaN)

X:-0.12

Y:-0.08


person Junko Shimane    schedule 28.06.2019    source источник
comment
Я думаю, что понял, что означает результат, но он в довольно неудобной форме, если цель состоит в том, чтобы получить фактический отрезок, представляющий серединный перпендикуляр. Если основная цель состоит в том, чтобы объяснить результат, я бы колебался (потому что я не уверен, смогу ли я объяснить его адекватно). Если основная цель состоит в том, чтобы примерно объяснить результат и показать альтернативу вычислениям, я бы опубликовал ответ.   -  person Marco13    schedule 28.06.2019


Ответы (1)


Вас интересует hcoord. Это структура x, y, w, и точка p находится на линии, если

hcoord.x * p.x + hcoord.y * p.y + hcoord.w = 0

Часть (hcoord.x, hcoord.y) описывает нормаль линии. hcoord.w описывает расстояние линии до начала координат, масштабированное на обратную длину нормали.

Если вам известна одна из координат точки на линии, и вы хотите узнать другую, вы можете просто изменить приведенную выше формулу, чтобы получить:

p.x = (-hcoord.w - hcoord.y * p.y) / hcoord.x
p.y = (-hcoord.w - hcoord.x * p.x) / hcoord.y

Помните о делении на ноль, если линия горизонтальная или вертикальная.

Если вместо этого вам нужна биссектриса в параметрической форме (точка p и направление d), вы можете использовать:

p1, p2 = the points of the line segments for which to calculate the bisector
p = 0.5 * (p1 + p2)
d = (p2.y - p1.y, p1.x - p2.x)
person Nico Schertler    schedule 28.06.2019
comment
Что такое p во втором блоке кода? По общему признанию, (я должен знать это, но) я не нашел действительно разумного способа получить некоторую разумную (то есть параметрическую) форму биссектрисы из hcoord. Третий код по существу вычисляет биссектрису, игнорируя hcoord, что довольно тривиально. Я предположил, что основной смысл вопроса заключался в более глубоком понимании того, что hcoord на самом деле является, и как его разумно использовать... - person Marco13; 30.06.2019
comment
Я попытался объяснить это в первой части ответа. p — любая точка на прямой. hcoord — однородное представление линии. Определение этого находится в первом блоке кода. - person Nico Schertler; 30.06.2019
comment
Хорошо, это было недоразумение — смысл второго блока состоял в том, чтобы сказать, что если у вас есть p.x, то вы можете вычислить p.y, а если у вас есть p.y, то вы можете вычислить p.x (на первый взгляд это было непонятно, потому что p появляется с обеих сторон уравнения). Примечание: я нахожу гомогенную форму для hcoord особенно неудобной. Если вы хотите использовать его каким-либо образом, вам нужно вычислить dx, dy и центральную точку линии, а затем, по существу, уже есть то, что вам нужно для биссектриса. Но ладно, вот как это реализовано.... - person Marco13; 30.06.2019
comment
Ну, это зависит от того, как вы хотите его использовать. Линия не имеет центра. Однородная форма особенно полезна, если вы хотите определить, на какой стороне линии лежит данная точка - просто вычислите скалярное произведение с точкой. Она положительна, если точка находится с одной стороны, и отрицательна с другой. И он равен нулю, если точка находится на прямой. - person Nico Schertler; 30.06.2019
comment
Большое спасибо, Marco13 и Нико Шертлер. - person Junko Shimane; 01.07.2019