要考虑您的问题,我们必须首先考虑内部或外部的含义。对于四个曲面实体,每个曲面将空间精确地划分为两侧,通常,四个曲面将空间划分为 9 个区域,其中只有一个是有界的,从而界定了一个四面体(但如果我们仔细选择曲面,我们可以达到甚至没有边界区域——例如使它们中的两个平行)。所以,一般来说,你必须决定平面的哪一边标记内侧或外侧(嗯,这也没有关系,在外面和不在里面是一样的)。
面越多,问题就越复杂(并且更复杂),因为您可以有多个也定义实体的有界区域,因此您需要更多信息,而不仅仅是界定它的平面。如果该区域导致非凸区域,问题甚至会更加复杂,因为您的点可能位于区域的某些部分,与某些平面的 一侧 和错误一侧的 匹配 为他人,并继续在你的固体里面。只需看到这样的定界多边形
以及制作有界区域的可能性
您需要做的第一件事是充分定义实体,用边界定面,并在一定程度上确定界定一个面的边和顶点,以及面如何相互连接以形成实体。
一旦遇到这种情况,您就会有一组面,并且每个面的向量都指向外部(以连续的方式,因此您不会以面法线指向上方结束,下一个指向下方)。接下来你需要做的是将你的实体划分为一个凸实体。可以证明,对于一个由平面构成的 3d 立体,它可以细分为一组有限的凸立体。
我将尝试在 2D 中说明相同的问题,但在 3D 中基本相同:
首先,我们有初始的 poligon,假设它是凸的(这是用于此目的的重要属性,我稍后会提到):
让我们想象它是一颗 3D 小行星,而您是在其表面行走的人。如果您开始步行,您将穿过所有用黄色标出的线。这些是法线,因此您需要从每个面知道哪些面是可到达的,并按照我所做的那样构建这些表面的法线贴图。当您在小行星上行走时,您标记法线以了解小行星内部的位置,并且您正在划定它。现在,我们有了一张包含所有法线的小行星地图。让我们画出我们下方的半空间(我们下方的表面的一侧)在几何学中,这可以用平面表示(平面具有所有点都与向量正交的属性,所以X*V=0其中@987654344 @代表点积,如果我们把我们的poligon的中心和法向量作为我们绘图中的黄色向量,我们会得到(X - P)*N = 0,其中X是平面中一个点的位置,@987654347 @ 是我们的位置(脸的中心),N 是垂直于平面的向量,指向上方(指向小行星的外侧)
嗯,这个等式的性质是,如果我们用空间中的任何位置替换X,平面下方的所有点X 都有一个值(X - P)*N < 0,所有天空值都有它> 0。
如果我对四个法线做同样的事情,我会得到这个:
...
处理
只有当四个平面给出(X - X_face)*(N_face) < 0 时,问题点X 才会被埋入小行星中,现在,X_face 是面的中心,N_face 是指向小行星外部的面法线。 仅满足四个条件时,该点才会位于小行星内部。
但是如果小行星不是凸面的会发生什么?
如果您绘制法线,这将无济于事......因为小行星内部有一些点并且未通过某些测试(请记住,该点必须低于所有表面,但不是(如如下所示):
问题是多边形(或多面体)不是凸的,我们不能在那里应用算法。所以首先我们要解决让它凸的问题。
如果您在越过边缘时开始沿着小行星的所有表面(保留法线),您将到达另一个增加或减少坡度的平面,因此如果它增加坡度,您将标记该边缘(多边形中的顶点)为异常(我们将它们标记为红色),如果它减少,我们将它们标记为正常(我们将它们标记为绿色):
当所有边缘都正常时,没问题,因为我们的小行星将是凸的,但是当其中任何一个异常时,我们必须继续在那个平面上(在所有平面上挖掘小行星)直到我们到达另一个表面(我们延长了平面以划分我们的 poligon):
因为我们有有限数量的边,并且只有其中一些被标记为异常,所以这个过程是有保证的(请记住,您可以让 另一边试图找到一张脸顶点向上和顶点向下的多面体(多边形)的(边)(在我们之前解释的意义上))
所以你已经将你的多面体分成了一组有限的凸多面体,可以应用第一个算法。