C++ 卷绕数算法与凸边界/边上的点
我需要一种算法,它可以判断点是位于凸包(C/C++)的内/外还是边界(边) 凸包被描述为点X,Y,整数的数组,连接从i到i+1 当前Im使用绕组编号算法,如下所述: 这是函数“wn_PnPoly()” 是否可能,以及如何使卷绕数算法检测点是否恰好位于凸面的边界(边)上?C++ 卷绕数算法与凸边界/边上的点,c++,algorithm,point-in-polygon,convex,C++,Algorithm,Point In Polygon,Convex,我需要一种算法,它可以判断点是位于凸包(C/C++)的内/外还是边界(边) 凸包被描述为点X,Y,整数的数组,连接从i到i+1 当前Im使用绕组编号算法,如下所述: 这是函数“wn_PnPoly()” 是否可能,以及如何使卷绕数算法检测点是否恰好位于凸面的边界(边)上? 有没有其他算法可以做到这一点?(需要处理INT)。我不知道绕组编号算法,但要检测点是否位于其中一条边上,您可以通过凸面外壳的所有边进行循环,并执行以下检查: 如果点u、v是凸包上的连续点,p是考虑中的点,则 p-u=lambda
有没有其他算法可以做到这一点?(需要处理INT)。我不知道绕组编号算法,但要检测点是否位于其中一条边上,您可以通过凸面外壳的所有边进行循环,并执行以下检查: 如果点u、v是凸包上的连续点,p是考虑中的点,则
p-u=lambda*(v-u)
其中lambda
是介于0和1之间的任何标量。找到了解决方案:
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;
}
int wn\u PnPoly2(点P,向量V,int n)
{
int wn=0;//绕组编号计数器
//循环遍历多边形的所有边
对于(int i=0;i P.y)(无需测试)
如果(V[i+1].Y只是读取函数的实现。您将发现一个测试点是否位于边缘的左/上/右。缺少isLeft()函数,但也可以在其他源中找到它。例如: