【问题标题】:How to check a point is inside a ConvexHull using CGAL如何使用 CGAL 检查点在 ConvexHull 内
【发布时间】:2015-10-07 04:33:31
【问题描述】:

我使用 CGAL 库创建了一个带有一些 3D 点的凸包。现在我想检查一个点是否在船体内部。但找不到任何选择这样做。有人可以帮忙吗?

我的代码如下。

    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
    #include <CGAL/point_generators_3.h>
    #include <CGAL/algorithm.h>
    #include <CGAL/Polyhedron_3.h>
    #include <CGAL/convex_hull_3.h>
    #include <vector>
    typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
    typedef CGAL::Polyhedron_3<K> Polyhedron;
    typedef K::Point_3 Point;
    std::vector<Point> hullPoints[16];
    int numPoints[16];
    Polyhedron poly[16];
    //Reading hull points
    for(int i=0;i<a->vertI;i++)
    {
        for(int j=0;j<16;j++)
        {
            if(a->vertices[i][1] <= (a->maxY-(j*(a->maxY-a->minY)/16.0)) && a->vertices[i][1] >= (a->maxY-((j+1)*(a->maxY-a->minY)/16.0)) )
            {
                hullPoints[j].push_back(Point(a->vertices[i][0],a->vertices[i][1],a->vertices[i][2]));
            }


        }


    }
//Create hull
    for(int i=0;i<16;i++)
    {
        CGAL::convex_hull_3(hullPoints[i].begin(), hullPoints[i].end(), poly[i]);
        std::cout << "The convex hull " << i <<" contains " << poly[i].size_of_vertices() << " vertices" << std::endl;

    }

它完美地工作,我可以访问 Poly 以查看其中不存在任何顶点。但无法找到并检查某个点是否在其中。

【问题讨论】:

    标签: collision-detection cgal convex-hull


    【解决方案1】:

    这是对 2D 方法的改编,但它可能是可行的...

    你能定义构成凸包表面的二维平面吗?如果是这样,则在所讨论的点与任何其他点之间构建一条无限线,该点距离足够远以保证在船体外部。然后,对于船体表面上的每个平面,确定线是否穿过该平面。

    编辑。 (感谢 BrunoLevy 的评论)
    对于一般的任意封闭 3-D 船体,如果它穿过奇数个平面,则该点在船体内,如果是偶数,则在船体外。

    在您的情况下,它更简单。对于 壳,它必须穿过零个、一个或两个这样的平面。如果它只穿过一个,它在里面,否则它在外面。

    【讨论】:

    • 你说的是对的,但它是针对任意多面体的。对于凸包(即convex),它更简单:如果点在内部,则有一个交点,如果在外部,则为0或2。更简单地说,可以为凸包的每个面 (p1,p2,p3) 和查询点 q 计算 orient3d(q, p1, p2, p3),如果所有符号都相同,则该点在凸包。
    • 啊,是的,对不起,我错过了。我将编辑答案以解决区别。
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2021-07-07
    • 2014-03-09
    • 1970-01-01
    • 2017-10-27
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多