一个(理智的)挤压凸三维船体算法?

时间:2014-06-17 09:42:08

标签: algorithm 3d geometry proof

因此,我将尝试详细描述问题,并且我希望对我用来解决问题的过程的有效性和性能进行一些批评。我主要担心的是有效性,我似乎无法证明这一点。

我们的想法是在3D空间中有一个2D多边形(由其所有船体点描述。每个点还有一个 normal 向量,表示无限挤压。我为使用误导性术语' normal',它只是一个归一化向量,表示与此算法无关的更广泛背景中的法线。为了完全澄清,这些向量既不垂直于平面也不相同每个点。如下图所示,矢量是红线:

Polygon

这意味着此挤出的侧面不会形成平面,而是形成倾斜的平面。可以看一下它的挤出边,如偏斜多边形(http://en.wikipedia.org/wiki/Skew_polygon)。

无论如何,我想看看点P是否在挤出内部。我目前的程序如下:

  1. 计算法线N =(A-B)x(B-C)其中A,B,C是2D多边形上的任意三个顺时针点。这给了我2D二维平面法线。
  2. 计算最终平面变量D得到Nx X + Ny Y + Nz * Z + D = 0.通过填充X,Y,Z中的点P来做到这一点。这给出了挤压平面。
  3. 在所有船体点处挤出法线以在挤压平面上获得新船体。简单地通过找到它们定义的线和平面的交点来完成。
  4. 这是棘手的部分。现在我在3D平面上有一个凸包,我知道这个点是共面的。我已经在stackoverflow上看到了许多关于解决线性系统等问题的解决方案......但他们要么不考虑3D,要么缺乏良好的实现,要么看起来太昂贵。
  5. 我的方法是使用我认为必要的足够的假设,但我无法证明最后一部分(必要部分是显而易见的)。我提出以下要求:

    对于由点A-> Z和另外的共面点P组成的共面凸包。当且仅当对于所有时钟顺序点A和B以及其他一些第三时,P在凸包内。顺序点C线CP在通过线AB之前经过P.

    在上面的示例图片中:A' -B'在A' -B'之前,D' -P穿过P,对于B' -C'这是通过A'来实现的,对于C' -D'也是由A'并为D' -A'由B'。

    我将这个想法实现为两条3D参数线相互交叉(A-B和P-C)并查看参数的符号。 P-C中的参数应为非正数,因为交叉点应位于P后面,以便参数转到C.

    本质上,这将导致 O(n) O(n ^ 2)算法,其中n是多边形的#points(这似乎超过了所有解决方案I&#39到目前为止已见过)。然而,即使我找不到上述假设的反例,我也无法证明这一点。

    编辑:我相信有可能证明足够的条件是A和B,所有其他船体点需要满足假设(而不仅仅是C)。

    Edit2:澄清声明。

0 个答案:

没有答案