我使用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,看不到它中存在的顶点。但是无法找到并运行以检查点是否在其中。
答案 0 :(得分:0)
这是2D方法的改编,但它可能是可行的......
你能定义形成凸壳表面的2D平面吗?如果是这样的话,那么在所讨论的点之间以及通过足够远的任何其他点构建无限线以保证在船体外。然后,对于船体表面上的每个平面,确定该线是否穿过该平面。
EDIT。 (感谢BrunoLevy的评论)
对于一般任意闭合的3-D船体,如果它穿过奇数个平面,则该点位于船体内部,如果它是偶数,则它在外面。
在您的情况下,它更简单。对于凸外壳,它必须穿过零,一个或两个这样的平面。如果它只穿过一个,它就在里面,否则它就会消失。