我设置了点(3D)的P,它是凸包(每一个)的顶点。我正在寻找检查给定点p0是否不在此凸包之外的方法。
我将不得不多次重复检查(对于不同的p0)。因此,如果可以重用部分计算,那就太棒了。
在stackoverflow页面上我发现了这个: Find if a point is inside a convex hull for a set of points without computing the hull itself 有2个aproche: 首先基于凸壳特性 - 线性方程组。 基于观察的声音:“当且仅当从其到所有其他点的所有向量的方向在其周围的圆/球/超球的一半上时,该点位于其他点的凸包之外。 “
不幸的是我不知道究竟能做到什么。 首先给我不可解的方程组--3个方程,其中n未知(n> 3)。我怎么能这样呢?我做错了吗? 在第二种方法中,我不知道如何检查这个假设。
答案 0 :(得分:2)
CGAL可以轻松完成此测试。您不仅可以使用CGAL构建凸包,还可以快速轻松地确定特定点是否为inside, on the surface or outside of the polyhedron。
代码段如下所示:
#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
#include <CGAL/algorithm.h>
#include <CGAL/Side_of_triangle_mesh.h>
typedef CGAL::Simple_cartesian<double> K;
typedef K::Point_3 Point;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef CGAL::Side_of_triangle_mesh<Polyhedron, K> Point_inside;
bool pointInside(Polyhedron &polyhedron, Point &query) {
// Construct AABB tree with a KdTree
Tree tree(faces(polyhedron).first, faces(polyhedron).second, polyhedron);
tree.accelerate_distance_queries();
// Initialize the point-in-polyhedron tester
Point_inside inside_tester(tree);
// Determine the side and return true if inside!
return inside_tester(query) == CGAL::ON_BOUNDED_SIDE;
}
答案 1 :(得分:1)
假设P很大且p0很多,你应该计算一个3D三角测量来进行点位置。这是CGAL demo。
答案 2 :(得分:1)
您可以将船体中的点记录为矩阵中的列,然后使用向量来告诉您要采用的点组合:
(X1 X2) (a) (X1a + X2b)
(Y1 Y2) (b) = (Y1a + Y2b)
(Z1 Z2) (Z1a + Z2b)
要生成目标点,您需要找到一个解决此问题的向量,受矢量元素在0和1之间的约束条件限制,并且向量元素加起来为1.您可以解决此问题一些问题 - 如果有解决方案 - 通过线性编程,可能涉及使用http://en.wikipedia.org/wiki/Simplex_algorithm。
有很多技巧可以让它变成严格的形式。在矩阵中添加另一行将允许你说a + b = 1.要强制b <= 1,你可以有b + q = 1和q&gt; = 0,尽管如下面的Ted Hopp所指出的,情况b <= 1,因为a + b = 1,a和b都是> = 0。