Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 卷绕数算法与凸边界/边上的点_C++_Algorithm_Point In Polygon_Convex - Fatal编程技术网

C++ 卷绕数算法与凸边界/边上的点

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

我需要一种算法,它可以判断点是位于凸包(C/C++)的内/外还是边界(边)

凸包被描述为点X,Y,整数的数组,连接从i到i+1

当前Im使用绕组编号算法,如下所述: 这是函数“wn_PnPoly()”

是否可能,以及如何使卷绕数算法检测点是否恰好位于凸面的边界(边)上?
有没有其他算法可以做到这一点?(需要处理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()函数,但也可以在其他源中找到它。例如: