给定三维空间中的一组曲面,我试图将每个曲面指定给一个分区,该分区指的是集合所包围的最小三维区域,如果不适用,则不指定分区。我还想确定曲面是否是两个区域之间的接口。所以,举个例子,如果我们有11个表面,代表两个立方体的顶部,那么顶部立方体中的曲面将位于同一区域,底部的曲面将位于不同的区域(界面曲面位于两个区域中)。在
作为一个例子,我想引入一组曲面,如this,并将其转换为this。这里的每一种颜色都代表一个区域,灰色是没有关联的区域(如底部的襟翼)。在
我做了一些搜索,试图找出是否有人已经提出了一个算法来实现这一点,但我没有找到任何东西(大多数似乎是识别区域,而不是将曲面链接到它们所包围的区域)。因此,我正在尝试提出我自己的算法,并想知道是否有其他选择,或我的方法是否可行。在
我假设所有的表面都是相连的。在
我的想法是:选择一个随机曲面,每个曲面的边都正好接触另一个曲面,并将其添加到区域1。在
将每个连接的表面添加到区域1,前提是其每侧都完全接触另一个表面。在
对于那些至少在一个侧面上接触多个表面的连接表面,将其添加到“可能”列表中。在
对于区域1中的每个新曲面,重复步骤2-3。在
一旦一个曲面被添加到“可能”列表两次,请将其添加到区域1并从“可能”列表中移除。将此曲面标记为分区接口。在
将区域接口添加到区域2。在
从“可能”列表中选择一个随机曲面并将其指定给区域2并清除“可能”列表。在
重复步骤2-7(当然更新分区号),直到没有未指定的曲面。在
这似乎适用于简单的场景(例如,两个立方体堆叠在一起),但我不确定是否有任何棘手的情况需要我注意,或者如果有两个以上的区域共享一个边,它是否会崩溃。在
如果能对我的粗略算法/其他实现方案进行改进,我们将不胜感激。谢谢!在
编辑:以下是对一些评论的回应。
根据我的定义,分区只是一组完全绑定了一个没有间隙的三维区域的曲面。所以如果我有两个立方体,A和B,不接触,我会有两个区域:一个是立方体A的所有表面,另一个是立方体B的所有表面。如果我有一个立方体缺少一个边,那么就没有与这些表面相关的区域。在
我的最终目标是在我正在创建的建模工具中创建一个自动分组曲面的过程。这些细节是分类的,但本质上我所处理的模型中某些属性只在同一个“区域”中的曲面之间通用,如上所述。我想创建一个自动的过程来创建这些分区,这样用户就可以一次将这些属性应用于分区中的所有曲面,而不是手动执行。在
本质上,问题归结为找到最小的三维区域,这些区域被任意一组曲面完全包围,并跟踪哪些曲面属于哪些区域。我希望这能使我的问题更加清楚。在