java - java中求点到边距离的函数

标签 java math

有没有人在 java 中有找到点和线段/边之间的最短距离的函数?我找到的每个例子都是用另一种语言写的,并且使用了一堆子函数。它不能基于它们是垂直的假设。

更新

我将 python 函数移植到 java。如果有人擅长数学并且可以验证我将不胜感激。 x 和 y 是点,其他参数是线段。

public float pDistance(float x, float y, float x1, float y1, float x2, float y2) {

          float A = x - x1;
          float B = y - y1;
          float C = x2 - x1;
          float D = y2 - y1;

          float dot = A * C + B * D;
          float len_sq = C * C + D * D;
          float param = -1;
          if (len_sq != 0) //in case of 0 length line
              param = dot / len_sq;

          float xx, yy;

          if (param < 0) {
            xx = x1;
            yy = y1;
          }
          else if (param > 1) {
            xx = x2;
            yy = y2;
          }
          else {
            xx = x1 + param * C;
            yy = y1 + param * D;
          }

          float dx = x - xx;
          float dy = y - yy;
          return (float) Math.sqrt(dx * dx + dy * dy);
        }

最佳答案

我们可以稍微简化一下。你不需要计算参数。您可以做的是找到与直线成直角的 vector v。将其与 vector (A,B) 进行点积。在 2D 中很容易找到与 (C,D) 正交的 vector ,它只是 (-D,C)。

public float pDistance(float x, float y, float x1, float y1, float x2, float y2) {

      float A = x - x1; // position of point rel one end of line
      float B = y - y1;
      float C = x2 - x1; // vector along line
      float D = y2 - y1;
      float E = -D; // orthogonal vector
      float F = C;

      float dot = A * E + B * F;
      float len_sq = E * E + F * F;

      return (float) Math.abs(dot) / Math.sqrt(len_sq);
    }

如果您担心使用平方距离会更容易处理性能,那么最后一行将是

      return (float) dot * dot / len_sq;

这样就不必计算平方根了。因此,如果您想计算最近的边缘,请找到到每条边缘的平方距离并选择最小的。

此函数查找到无限直线而不是线段的距离。这可能不是你想要的。如果该点超出线段的两端会发生什么,则该问题的解决方案有所不同。在那里找到到最近端点的距离。

关于java - java中求点到边距离的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559799/

相关文章:

java - Android Studio 和 Gradle : Add outside java classes to Android main project

mysql - 在 MySQL 中计算平均意见得分 (MOS)

c++ - SPOJ 处的 CODE1 - 无法解决

java - 是否可以使用 java 更改现有 kafka 主题的复制因子?

JAVA,循环的奇怪结果

java - BufferedReader.readLine()不读取并挂起系统(等待)

java - 即使 JPA 实体不脏,我也可以强制 spring-data 更新可审计字段吗?

math - float 学有问题吗?

java - 如何使用三个点和两个 vector 计算平面方程?

Java 到 Swift - 如何在 Xcode 6 中使用 math.pow 和 math.exp