【问题标题】:Result of perpendicularBisector method垂直平分线法的结果
【发布时间】:2019-06-28 23:42:06
【问题描述】:

我是 Java 的 JTS 新手。 我想得到线段 a-b 的垂直平分线。

  • 坐标a(2,3)
  • 坐标 b(8,7)

我使用了 verticalBisector 方法,但我无法理解它的结果。 对我来说,似乎它根本与垂直平分线无关。 能否请您解释一下结果的含义以及如何将结果用于垂直平分线?

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

【问题讨论】:

  • 我想我明白了结果的含义,但是如果目标是获得表示垂直平分线的实际线段,那么它的形式相当不方便。如果主要目标是解释结果,我会犹豫(因为我不确定我是否能充分解释)。如果主要目标是粗略解释结果并显示计算的替代方案,我会发布答案。

标签: java geometry jts


【解决方案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)

【讨论】:

  • 第二个代码块中的p 应该是什么?诚然,(我应该知道这些东西,但是)我没有找到一种真正合理的方法来从hcoord 获得一些合理的(即参数的)等分线形式。第三个代码基本上计算平分线,忽略hcoord,这是相当微不足道的。我认为问题的重点是“更深入地理解”hcoord 实际上 ,以及如何明智地使用它......
  • 我试图在答案的第一部分解释这一点。 p 是线上的任意一点。 hcoord 是线的齐次表示。它的定义在第一个代码块中。
  • 好吧,那是个误会——第二块的意思是说“如果你有p.x,那么你可以计算p.y,如果你有p.y,那么你可以计算p.x"(乍一看并不清楚,因为p出现在等式的两边)。附注:我发现hcoord 的同质形式特别不方便。如果你想以任何方式使用它,你必须计算dxdy和线的中心点,然后基本上已经拥有什么你需要平分线。但是,这就是它的实现方式......
  • 嗯,这取决于你想如何使用它。一条线没有中心。如果您想确定给定点位于直线的哪一侧,则齐次形式特别有用 - 只需计算与该点的点积。如果点在一侧而在另一侧为负,则为正。如果点在直线上,则为零。
  • 非常感谢“Marco13”和“Nico Schertler”。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 2017-06-30
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多