Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据曲面所包含的三维区域将曲面指定给分区_Python_Algorithm_3d_Surface - Fatal编程技术网

Python 根据曲面所包含的三维区域将曲面指定给分区

Python 根据曲面所包含的三维区域将曲面指定给分区,python,algorithm,3d,surface,Python,Algorithm,3d,Surface,给定三维空间中的一组曲面,我试图将每个曲面指定给一个区域,该区域指的是该集合所包含的最小三维区域,如果不适用,则不指定区域。我还想确定曲面是否是两个分区之间的接口。因此,例如,如果我们有11个曲面,表示两个立方体相互堆叠在一起,那么顶部立方体中的曲面将位于同一区域,底部的曲面将位于不同区域(界面曲面位于两个区域) 作为一个例子,我想引入一组曲面,例如,并将其转化为。这里的每种颜色都代表一个区域,灰色没有关联的区域(如底部的活门) 我做了一些搜索,试图找出是否有人已经提出了一个算法来实现这一点,但

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

作为一个例子,我想引入一组曲面,例如,并将其转化为。这里的每种颜色都代表一个区域,灰色没有关联的区域(如底部的活门)

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

我假设所有曲面都是连接的

我的想法如下:

  • 选择一个随机曲面,该曲面的每一侧正好接触另一个曲面,并将其添加到分区1
  • 将每个连接的曲面添加到分区1,前提是其每一侧正好接触另一个曲面
  • 对于在其至少一侧上接触多个曲面的连接曲面,请将其添加到“可能”列表中
  • 对于分区1中的每个新曲面,重复步骤2-3
  • 将曲面添加到“可能”列表两次后,将其添加到分区1并从“可能”列表中删除。将此曲面标记为分区界面
  • 将区域接口添加到区域2
  • 从“可能”列表中选择一个随机曲面,并将其指定给分区2,然后清除“可能”列表
  • 重复步骤2-7(当然更新分区编号),直到没有未指定的曲面
  • 这似乎适用于简单的场景(例如,两个立方体叠在一起),但我不确定是否有任何棘手的情况需要注意,或者如果有两个以上的区域共享一个侧面,它是否会崩溃

    如能对我的粗略算法/实施备选方案有所改进,将不胜感激。谢谢

    编辑:下面是对一些评论的一些更详细的回应。 根据我的定义,分区只是一组曲面,这些曲面完全绑定了一个没有间隙的三维区域。因此,如果我有两个立方体,A和B,它们不接触,我会有两个区域:一个是由立方体A的所有表面组成的,另一个是立方体B的所有表面。如果我有一个立方体缺少一侧,那么就不会有与这些表面相关的区域

    我的最终目标是在我正在创建的建模工具中实现曲面分组的自动化过程。细节是分类的,但本质上我是在处理模型,其中某些属性仅在上述同一“区域”中的曲面之间是通用的。我希望创建一个自动过程来创建这些分区,以便用户可以将这些属性一次性应用于分区中的所有曲面,而不是手动执行


    从本质上讲,问题归结为找到由任意曲面集完全包围的最小3D区域,并跟踪哪些曲面属于哪些区域。我希望这能让我的问题更清楚。

    那么,您感兴趣的是从一组输入多边形中发现闭合曲面(体积)网格拓扑;换句话说,多面体。这在几乎所有3d建模软件包中都很常见。我猜Blender有这样的代码。有不同的方法来实现这一点,但是通常使用一些版本的半边图。请参见此处的wiki链接:。这样做的目的是了解您的输入策略,并构建这些图表。完成后,您可以轻松地查询每个图形,查看是否有孔(缺少边等)

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

    现在,查询图形以获取信息。浏览图形后,您将看到正好有四个顶点(节点)缺少边。这些顶点对应于缺少的框顶部(图中的边为红色)。因此,您知道此图形不是闭合流形。如果您有另一个未与此图形共享节点的长方体,您将拥有另一个图形。因此,一旦您完成多边形处理,每个图形都是您的“区域”


    注意,如果你有两个相交的形状,你也可以使用这些图形来跟踪它们,但它要复杂得多。基本上,当处理一个新多边形时,你不仅要看它的任何顶点是否属于已经处理过的图形,还要看这个多边形是否与之前处理过的任何多边形相交,如果是的话,请拆分t他的多边形并将所有这些添加到相交图中。

    这听起来很像3D游戏中经常用于各种目的的场景。@MooseBoys不幸的是,这不是我要做的。我试图根据曲面作为一个整体包围的最小3D体积对曲面进行分组,而您共享的链接似乎是为了找到最小的vo包含每个曲面的lume。这并不适用于我正在尝试做的事情。根据您的描述,我同意MooseBoys