是否有任何已知的方法可以快速有效地确定3D点是否位于已知大小的柏拉图体积内?
这对于立方体(六面体)或圆形(椭圆体)来说似乎很容易。我似乎无法想出四面体,八面体,十二面体或二十面体。我猜测有可能将形状分解为几个子实体,然后检查每个子实体,但是如果可能的话,我想避免任何类型的迭代求解器。
答案 0 :(得分:2)
如果您正在寻找一种优化算法,您可以尝试检查该点是否位于实体的边界范围之外,并且只有当它没有时才检查曲面。
答案 1 :(得分:1)
在查找2D点是否位于任何类型的多边形(2D空间)内的情况下,point in polygon是众所周知的问题。参见例如
多面体(3D)中的点问题是---对于任何类型的多面体的情况---相当有点诡计。但是,在您的情况下,您正在严格考虑凸多面体,因为所有柏拉图实体都属于后者类型。
在这种情况下,我可以指出两种方法来解决这个问题。
1 :(任何凸多面体的一般方法)您可以将您的问题视为查找一个点是否在一组已知点的convex hull范围内,在您的情况下,你的点是柏拉图实体的顶点,它们准确地描述了它们自身的凸包(没有“内部”顶点,由于凸起)。已经讨论了如何实现该问题的一般解决方案,例如,这里:
Find if a point is inside a convex hull for a set of points without computing the hull itself
一个非常优雅的解决方案是让你的多面体描述一个可行的线性规划(LP)问题集,并且,通过附加的等式约束decisionVariable = myPoint
(强制包含),你的LP将是如果该点位于您的多面体之外是不可行的,或者是可行的,否则(不需要求解最优性,只是为了可行性)。
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
。
或者,在不旋转的情况下,通过顶点ABCD
,ABEF
和CDEF
计算到平面的距离,并将它们用作(x,y,z)
坐标来检查{{1} }}
可以类似地检查四面体,但它会更复杂。