根据区域

时间:2015-07-29 23:29:06

标签: python algorithm 3d surface

给定三维空间中的一组曲面,我试图将每个曲面分配到一个区域,指向该组所包含的最小3D区域,如果不适用,则不分区。我还想确定表面是否是两个区域之间的接口。因此,例如,如果我们有11个表示两个立方体堆叠在一起的表面,则顶部立方体中的表面将位于相同的区域中,而底部的表面将位于不同的区域中(界面表面为在两个区域。)

例如,我想接受一组表面,例如this,然后将其转换为this。这里的每种颜色代表一个区域,灰色没有区域关联(如在底部的翻盖中)。

我已经做了一些搜索,试图找出是否有人已经提出了一个算法来做到这一点,但我没有找到任何东西(大多数似乎识别区域而不是链接表面到它们所包含的区域)。因此,我试图提出我自己的算法,并想知道是否有任何其他选择或我的方法是否有效。

我假设所有表面都已连接。

我的想法如下:

  1. 选择一个随机曲面,其两侧各自与另一个曲面完全相同,然后将其添加到区域1。
  2. 将每个连接的曲面添加到区域1,前提是它的每个边都与另一个曲面完全接触。
  3. 对于那些在其至少一侧接触多个表面的连接表面,将其添加到“可能”列表中。
  4. 对于区域1中的每个新曲面,重复步骤2-3。
  5. 将表面添加到“可能”列表两次后,将其添加到区域1并从“可能”列表中删除。将此曲面标记为区域界面。
  6. 将区域界面添加到区域2。
  7. 从“可能”列表中选择一个随机曲面,并将其指定给区域2并清除“可能”列表。
  8. 重复步骤2-7(更新当前的区域编号),直到没有未分配的曲面。
  9. 这似乎适用于简单的场景(例如,两个立方体堆叠在一起),但我不确定是否有任何棘手的条件我需要注意,或者如果它有更多的分崩离析比两个共享一方的区域。

    我的粗略算法/实施的替代想法的任何改进将不胜感激。谢谢!

    编辑:以下是一些回复一些评论的细节。 根据我的定义,区域只是一组完全绑定3D区域而没有间隙的表面。因此,如果我有两个不接触的立方体A和B,我将有两个区域:一个由立方体A的所有表面组成,另一个由立方体B的所有表面组成。如果我有一个缺少的立方体一方面,没有与这些表面相关的区域。

    我的最终目标是在我正在创建的建模工具中对表面进行分组的自动化过程。细节被分类,但基本上我正在处理模型,其中某些属性仅在如上所述的相同“区域”中的表面之间是共同的。我想创建一个自动化流程来创建这些区域,以便用户可以立即将这些属性应用于区域中的所有表面,而不是手动执行。

    基本上问题归结为找到完全由任意一组曲面包围的最小3D区域,并跟踪哪些曲面属于哪些区域。我希望这会使我的问题更清楚。

1 个答案:

答案 0 :(得分:2)

然后,您感兴趣的是从一组输入多边形中发现闭合曲面(体积)网格拓扑;换句话说 - 多面体。这几乎适用于每个3D建模包。我猜Blender有代码可以做到这一点。有不同的方法,但通常使用某种版本的半边图。请在此处查看wiki链接:Doubly Linked half edge graph。想法是走你的输入政策,并建立这些图。完成后,您可以轻松查询每个图形以查看是否存在孔(边缘缺失等)。

enter image description here

我附上了一张图片,解释了如何使用半边缘结构来获得你想要的东西:假设你有五个长方形的汤(他们组成一个顶部的立方体。你处理你的第一个矩形说ABCD,这会创建你的第一个图形,比如说G1。现在你处理第二个多边形,比如FEHG,你还没有看过这些顶点,所以你创建第二个图形,G2。现在说你处理多边形CDGH。你之前看过这些顶点,所以您可以合并(连接)共享这些节点的现有图形而不是创建新图形。继续处理所有多边形。您可以获得图形。

现在,查询图表以获取您的信息。走完图形后,您将看到正好有四个缺少边的顶点(节点)。这些顶点对应于框的缺失顶部(图中边缘为红色)。因此,您知道此图不是封闭的流形。如果你有另一个盒子,它没有与这个盒子共享节点,你会有另一个图表。所以每个图表,一旦你处理好你的多边形,就是一个"区域"对你而言。

注意,如果你有两个说相交的形状,你也可以使用这些图形来跟踪它们,但它要复杂得多。基本上,当处理新的多边形时,您不仅需要查看其任何顶点是否属于已处理的图形,还要查看此多边形是否与先前处理的任何多边形相交,如果是,则拆分此多边形并将所有这些添加到交叉图。