查找最靠近点的多边形顶点的索引

时间:2014-10-06 21:45:55

标签: algorithm math polygon computational-geometry

标题

我需要找到最接近点的多边形的索引

enter image description here

所以在这种情况下,输出将是4和0.这样,如果添加红点,我知道将顶点放在数组中的位置。有谁知道从哪里开始?

(对不起,如果标题有误导性,我不确定如何正确地说出来)

enter image description here
在这种情况下,输出将是0和1,而不是最接近的4。

4 个答案:

答案 0 :(得分:1)

我假设将新点添加到边缘。因此,您将获得点a = (x, y)的坐标,并且您希望找到它所在的边的索引。让我们调用边b, c的顶点。观察到三角形abc的面积为零。

因此迭代所有边并选择最小化三角形abc区域的那个,其中a是您的点,bc是当前边缘。

a = input point
min_area = +infinity
closest_edge = none
n = number of vertices in polygon

for(int i = 1; i <= n; i++)
{   b = poly[ i - 1 ];
    c = poly[ i % n ];
    if(area(a, b, c) < min_area)
    {   min_area = area(a, b, c);
        closest_edge = bc
    }
}

您可以使用以下方式计算面积:

/* Computes area x 2 */
int area(a, b, c)
{   int ans = 0;
    ans = (a.x*b.y + b.x*x.y + c.x*a.y) - (a.y*b.x + b.y*c.x + c.y*a.x);
    return ABS(ans);
}

答案 1 :(得分:1)

P 位于 AB 段上,如果两个简单条件一起满足:
AP x PB = 0 //交叉乘积,向量是共线的或反直线的,P位于AB线上 AP . PB > 0 //标量积,排除反线性情况以确保P在段内

所以你可以检查所有连续的顶点对(伪代码):

if (P.X-V[i].X)*(V[i+1].Y-P.Y)-(P.Y-V[i].Y)*(V[i+1].X-P.X)=0 then
//with some tolerance if point coordinates are float
   if (P.X-V[i].X)*(V[i+1].X-P.X)+(P.Y-V[i].Y)*(V[i+1].Y-P.Y)>0
       then P belongs to (i,i+1) segment

这是快速直接(暴力)方法 计算机几何中存在特殊数据结构以快速选择候选段 - 例如r-tree。但是这些复杂的方法将获得长(多点)折线以及多次使用相同多边形的情况(因此预处理可以忽略不计)

答案 2 :(得分:1)

而不是检查点是否接近具有规定公差的边缘,如MBo建议的那样,您可以使用到该点的最短距离来鳍边缘。必须相对于线段计算距离,而不是整行。

你如何计算这个距离?让P为点,QR为两个边缘端点。

t[0,1]范围内,您需要最小化

D²(P, QR) = D²(P, Q + t QR) = (PQ + t QR)² = PQ² + 2 t PQ.QR + t² QR²

当导数取消时达到最小值,即t = - PQ.QR / QR²。如果此数量超出[0,1]范围,只需将其限定为01

总结一下,

if t <= 0, D² = PQ²
if t >= 1, D² = PR²
otherwise, D² = PQ² - t² QR²

答案 3 :(得分:0)

遍历所有顶点,计算该顶点到该点的距离,找到最小值。

double min_dist = Double.MAX_VALUE;
int min_index=-1;
for(int i=0;i<num_vertices;++i) {
   double d = dist(vertices[i],point);
   if(d<min_dist) {
       min_dist = d;
       min_index = i;
   }
}