gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:15 25 4
gpt4 key购买 nike

有没有人在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com