我需要找到最接近点的多边形的索引
所以在这种情况下,输出将是4和0.这样,如果添加红点,我知道将顶点放在数组中的位置。有谁知道从哪里开始?
(对不起,如果标题有误导性,我不确定如何正确地说出来)
在这种情况下,输出将是0和1,而不是最接近的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
为点,Q
,R
为两个边缘端点。
让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]
范围,只需将其限定为0
或1
。
总结一下,
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;
}
}