我需要能够判断点是否位于凸包(C/C++)的内部/外部或边界(边缘)上的算法。
凸包被描述为点 X,Y 的数组,整数,连接从 i 到 i+1。
目前我使用缠绕数算法,在这里描述:http: //geomalgorithms.com/a03-_inclusion.html 它的函数“wn_PnPoly()”。
如果Point恰好位于凸的边界(边缘)上,是否有可能以及如何使绕组数算法检测?是否有另一种算法可以做到这一点?(需要在整数上工作)。
我需要能够判断点是否位于凸包(C/C++)的内部/外部或边界(边缘)上的算法。
凸包被描述为点 X,Y 的数组,整数,连接从 i 到 i+1。
目前我使用缠绕数算法,在这里描述:http: //geomalgorithms.com/a03-_inclusion.html 它的函数“wn_PnPoly()”。
如果Point恰好位于凸的边界(边缘)上,是否有可能以及如何使绕组数算法检测?是否有另一种算法可以做到这一点?(需要在整数上工作)。
找到解决方案:
int wn_PnPoly2(Point P, vector<Point> V, int n)
{
int wn = 0; // the winding number counter
// loop through all edges of the polygon
for (int i = 0; i<n; i++) { // edge from V[i] to V[i+1]
if (V[i].Y <= P.Y) { // start y <= P.y
if (V[i + 1].Y > P.Y) // an upward crossing
{
int l = isLeft(V[i], V[i + 1], P);
if (l > 0) // P left of edge
++wn; // have a valid up intersect
else if (l == 0) // boundary
return 0;
}
}
else { // start y > P.y (no test needed)
if (V[i + 1].Y <= P.Y) // a downward crossing
{
int l = isLeft(V[i], V[i + 1], P);
if (l < 0) // P right of edge
--wn; // have a valid down intersect
else if (l == 0)
return 0;
}
}
}
return wn;
}
我不知道绕组数算法,但要检测一个点是否位于其中一条边上,您可以遍历凸包的所有边并进行以下检查:
如果点 u, v 是凸包上的连续点并且 p 是考虑的点,那么是否,
p - u = lambda*(v - u)
其中lambda
是 0 和 1 之间的任何标量。