我有一个可能在多边形内部或外部的点,我需要从该点找到多边形上的最短点。
提前谢谢
我不知道这是否能回答你的问题,但这是我几年前写的一段代码。
它从多边形点列表中计算点索引以及垂直线到最近边缘的距离。
它使用一个Vector2
定义向量运算符+
, -
, *
(点积)和方法GetLength
and的结构体GetSquaredLength
。相同的代码也应该与Vector3
(3D)一起运行。
详情请看评论。
// Polygon points
List<Vector2> p;
/// <summary> Calculates the perpendicular vector from nearest point on polygon to given point. If no points available minIndex is -1. </summary>
public void GetPolygonDist(Vector2 point, out Vector2 minDist, out int minIndex) {
if (p.Count == 0) { minDist = Vector2.Null(); minIndex = -1; return; }
Vector2 dist;
minDist = point - p[0];
minIndex = 0;
for (int i = 0; i < p.Count - 1; i++) {
Vector2 l = p[i + 1] - p[i]; // Edge
if (l.GetLength() < 1e-9) continue; // Ignore edge of length almost zero
Vector2 d = point - p[i]; // Polygon point to point
Vector2 b = (l * d) / (l * l) * l; // Projection to edge
double f = Math.Sign(b * l) * (b.GetLength() / l.GetLength()); // Where on the edge is the perpendicular?
if (f < 0.0) dist = point - p[i]; // Point before the edge
else if (f > 1.0) dist = point - p[i + 1]; // Point after the edge
else dist = d - b; // Perpendicular
if (dist.GetSquaredLength() < minDist.GetSquaredLength()) {
minDist = dist;
minIndex = i;
}
}
}