检查3D点是否位于3D柏拉图实体内?

时间:2015-12-20 10:05:50

标签: c++ algorithm geometry computational-geometry

是否有任何已知的方法可以快速有效地确定3D点是否位于已知大小的柏拉图体积内?

这对于立方体(六面体)或圆形(椭圆体)来说似乎很容易。我似乎无法想出四面体,八面体,十二面体或二十面体。我猜测有可能将形状分解为几个子实体,然后检查每个子实体,但是如果可能的话,我想避免任何类型的迭代求解器。

4 个答案:

答案 0 :(得分:2)

如果您正在寻找一种优化算法,您可以尝试检查该点是否位于实体的边界范围之外,并且只有当它没有时才检查曲面。

答案 1 :(得分:1)

在查找2D点是否位于任何类型的多边形(2D空间)内的情况下,point in polygon是众所周知的问题。参见例如

多面体(3D)中的点问题是---对于任何类型的多面体的情况---相当有点诡计。但是,在您的情况下,您正在严格考虑多面体,因为所有柏拉图实体都属于后者类型。

在这种情况下,我可以指出两种方法来解决这个问题。

1 :(任何凸多面体的一般方法)您可以将您的问题视为查找一个点是否在一组已知点的convex hull范围内,在您的情况下,你的点是柏拉图实体的顶点,它们准确地描述了它们自身的凸包(没有“内部”顶点,由于凸起)。已经讨论了如何实现该问题的一般解决方案,例如,这里:

2 :如上所述,多边形中的2D点已经过充分研究,您甚至可以找到它的C ++代码in the SO link I provided above。由于您正在考虑3D中的凸多面体,我们知道切割这样的多面体的2D平面的交点将描述凸多边形。因此,对于您要研究的每个点,您创建包含点的平面,并与多面体(您的柏拉图实体)相交:剩下的问题是解决“多边形问题中的2D点”,在这架飞机上。

答案 2 :(得分:0)

从该点到该形状外的某处绘制一条线,并计算它通过的表面数量。如果数字是奇数,则该点在内部,否则它在外面。

QED

答案 3 :(得分:0)

对于八面体,将音量和点旋转在一起可以简化问题。

旋转具有边界半径r的八面体,使顶点位于(r,0,0) (-r,0,0) (0,r,0) (0,-r,0) (0,0,r)(0,0,-r)。然后将相同的轮播应用于(x,y,z)点并检查|x| + |y| + |z| ≤ r

或者,在不旋转的情况下,通过顶点ABCDABEFCDEF计算到平面的距离,并将它们用作(x,y,z)坐标来检查{{1} }}

可以类似地检查四面体,但它会更复杂。