Algorithm 三角形网格边的标注算法 介绍

Algorithm 三角形网格边的标注算法 介绍,algorithm,mesh,edge-detection,triangular,labeling,Algorithm,Mesh,Edge Detection,Triangular,Labeling,作为一个较大程序(与体积图形渲染相关)的一部分,我有一个小但棘手的子问题,其中需要以特定方式标记任意(但有限)三角形2D网格。不久前,我已经编写了一个解决方案(见下文),该解决方案对于我当时的测试网格来说已经足够好了,尽管我意识到该方法可能不会很好地适用于人们所能想到的每个可能的网格。现在,我终于遇到了一个网格,对于这个网格,当前的解决方案根本没有那么好的表现——看起来我应该想出一种完全不同的方法。不幸的是,似乎我真的无法重新设定我的思路,这就是为什么我想在这里提问 问题 考虑下面的图片。(颜色

作为一个较大程序(与体积图形渲染相关)的一部分,我有一个小但棘手的子问题,其中需要以特定方式标记任意(但有限)三角形2D网格。不久前,我已经编写了一个解决方案(见下文),该解决方案对于我当时的测试网格来说已经足够好了,尽管我意识到该方法可能不会很好地适用于人们所能想到的每个可能的网格。现在,我终于遇到了一个网格,对于这个网格,当前的解决方案根本没有那么好的表现——看起来我应该想出一种完全不同的方法。不幸的是,似乎我真的无法重新设定我的思路,这就是为什么我想在这里提问

问题 考虑下面的图片。(颜色不是问题的一部分;我只是添加它们来改善(?)可视化效果。而且变化的边缘宽度是完全不相关的伪影。)

对于每个三角形(例如,橙色ABC和绿色ABD),三条边中的每一条都需要给出两个标签中的一个,例如“0”或“1”。只有两个要求:

  • 并非三角形的所有边都可以具有相同的标签。换句话说,对于每个三角形,必须有两个“0”和一个“1”,或者两个“1”和一个“0”
  • 如果一条边由两个三角形共享,则两个三角形的标签必须相同。换句话说,如果图片中的边AB对于三角形ABC标记为“0”,那么对于ABD也必须标记为“0”
  • 网格是真正的2D网格,并且是有限的:即,它不包裹,并且具有定义良好的外部边界。显然,在边界上很容易满足要求,但在内部就更难了

    直觉上,看起来至少应该存在一个解决方案,尽管我无法证明它。(通常有几个——其中任何一个都足够了。)

    当前解决方案 我当前的解决方案是一个非常暴力的解决方案(这里提供的只是为了完整性——请跳过本节):

    • 保留四组三角形——每一组三角形对应于剩余待标记边的可能计数(0..3)。在开始时,每个三角形都在集合中,其中有三条边需要标记
    • 只要存在具有未标记边的三角形:
      找到剩余三角形的最小非零数量的未分配边。换句话说:在任何给定的时间,我们都会尽量减少部分完成标记的三角形的数量。剩余的边数将介于1和3之间。然后,只需选择一个这样的三角形,其中有这个特定数量的边需要分配。对于此三角形,请执行以下操作:
      • 查看任何剩余边的标记是否已被其他三角形的标记所强制。如果是,则按照上述第2条要求指定标签
      • 如果这导致了一个死胡同(即,对于当前的三角形,需求#1无法再得到满足),那么从一开始就重新开始整个过程
      • 按如下方式分配任何剩余边:
        • 如果到目前为止尚未标记任何边,请随机指定第一条边
        • 当一条边已分配时,分配第二条边,使其具有相反的标签
        • 分配两条边时:如果它们具有相同的标签,则将第三条边指定为具有相反的标签(显然);如果两个标签不同,则随机分配第三个标签
      • 为不同数量的未分配边更新三角形集
    • 如果我们到了这里,我们就有了一个解决办法——万岁
    通常这种方法只需几次迭代就能找到一个解决方案,但最近我遇到了一个网格,算法往往只在一次或两千次重试后才终止。。。这显然表明可能存在它永远不会终止的网格


    现在,我希望有一个确定性算法,保证总是找到一个解决方案。计算复杂度并不是一个大问题,因为网格不是很大,标记基本上只需要在加载新网格时进行,这并不是一直都会发生——因此,具有(例如)指数复杂度的算法应该很好,只要有效。(当然,效率越高越好。)

    谢谢你读到这里。现在,任何帮助都将不胜感激



    编辑:基于建议解决方案的结果 不幸的是,我不能上班。也许我没弄好。。。无论如何,考虑下面的网格,以绿点表示的起始点: 让我们放大一点。。。 现在,让我们开始算法。在第一步之后,标签如下所示(red=“starred path”,blue=“ringed path”): 到现在为止,一直都还不错。在第二步之后: 第三点: ... 第四: 但现在我们有问题了!让我们再做一轮-但请注意用洋红色绘制的三角形: 根据我当前的实现,品红三角形的所有边都在环形路径上,所以它们应该是蓝色的——这实际上是一个反例。现在也许我搞错了。。。但在任何情况下,距离起始节点最近的两条边显然不能是红色的;如果第三个标记为红色,那么这个解决方案似乎不再符合这个想法

    顺便说一句。每行代表一条边,列的解释如下:

  • 第一节点索引
  • 第二节点索引
  • 第一个节点的x坐标
  • 第一个节点的y坐标
  • 第二个节点的x坐标
  • 第二个节点的y坐标
  • 起始节点是索引为1的节点


    我想下一步我应该试试。。。但也许我应该为一个wh做些完全不同的事情