声明:
我正在创建一个程序,让用户可以布置自己的非方向图(节点和边)。一旦按下特定按钮,我想在图形中的每个“间隙”中创建一个三角形网格。这里有两张图片可以让你了解我的目标:
有几点需要注意:
到目前为止,我自己的尝试效率非常低,并且在非常不寻常的图形布局中可能会失败。我的总体计划是抓住一个节点并沿着一个周期的最锐角,直到我回到第一个节点。这部分工作,但我无法知道我是否已经获得了所有空间。另外,我最终会得到两个覆盖相同空间的相同网格(虽然节点顺序不同)。
我很感激你能帮助我解决这个问题。为了帮助解决问题,我已经熟悉凸包算法和三角剖分。
更新
我无法发布任何代码,因为我在这个项目的NDA下,但数据结构非常简单。
节点有一个位置(向量3,但y始终为0)和一个连接边的列表。
边缘有第一个节点,第二个节点和一个位置(中点)。
我想为每个间隙生成一个Mesh对象。此网格对象具有静态顶点数组(向量3s)和静态三角形数组(它们是整数并与顶点索引相关)。
答案 0 :(得分:2)
你的方法很好。有几点需要改进。
假设图是平面的(如果不是很难定义一个面),并且没有一个具有一度的顶点。具有一级的顶点不是问题,但是没有它们的描述更容易: - )
请注意,每条边都有两个面。所以,如果你按照最锐角跟随面部,那么只能在一侧跟随这些边缘。解决方案是创建具有相同节点的有向图,并且对于每个边创建两个方向上的两条边。通常与初始图形相同的图形但是边缘 加倍。算法是:
take one (directed) edge
follow it in same way by smallest angle
make faces of that cycle
remove face (directed) edges from graph
repeat procedure until there are edges.
相同方法适用于顶点为1的图形,但是面将具有“切割”(一个方向上的边缘而不是相反方向上的边缘。)
如果你不想要外面而不是'双'外边缘,而只是从每个外边缘做一个正方向边缘。
<强>更新强>
由于每个多边形和多边形边缘只传递一次,我认为这是非常理想的解决方案。只有几种可能性。
算法的主要步骤是从上次访问节点中选择下一个边缘。简单的实现是计算出边的角度并采用下一个边。角度计算可以进行一次,而不是每次边缘访问节点,甚至是边缘映射 - &gt;可以为节点做出边缘。
不需要创建新的有向图,它足以存储每个边的方向数据。两个布尔变量就足够了,每个方向一个。通过这第一步,选择不访问边缘来启动新的多边形,变得更加复杂。如果使用上角计算,则可以通过从地图中移除访问角度并将地图节点标记为可见(如果地图中没有更多角度)来覆盖。