3

所以我有一个近似表面的三角形网格。

它就像一个具有以下属性的图表:

  • 图边界上的顶点很容易识别。(相邻顶点数 > 包含三角形数)
  • 您可以轻松计算任意两个顶点之间的距离。(欧几里得距离)
  • 对于任何顶点v,任何不是 v 邻居的顶点v的距离必须大于v的至少一个邻居的距离。换句话说,在v的邻域环内不能出现非邻域顶点。

对于每个顶点v,我想计算从 v 到任何边界顶点的最小距离。

我可以通过蛮力做到这一点,建立所有边界顶点的列表,比较v与每个顶点的距离,并保持最小值。但这是低效的。

我相信对于每个单个顶点v最有效的方法是有一个优先级队列,其中顶部元素最接近v。队列用v的邻居初始化。当队列的顶部不是边界顶点时,弹出顶部并推送弹出顶点的所有邻居。

假设顶点v有 6 个邻居,我计算这 6 个邻居中的每一个的最小边界距离,并记录为 6 个邻居提供最小值的确切边界顶点。我知道其中之一还必须给出v的最小边界值。我无法真正证明这一点,但我认为这是直观的。如果v被它的邻居包围,那么离v最近的边界顶点也必须是离它的一个邻居最近的边界顶点。

我想知道是否有办法使用这些知识来有效地计算图中每个点的最小值。比从每个顶点进行广度优先搜索更有效。

4

1 回答 1

0

如果在找到边界顶点之前进行广度优先搜索,这并不能保证这是最近的边界顶点。要看到这一点,请注意,对于 2-d 中的任何三角平面图,您可以为每个顶点添加一个非常小的不同 z 坐标,并定义一个 3-d 表面,其自然最简单的良好近似三角形网格(给出完美近似)只是对应于原始平面图的网格。因此,给出一个三角平面图的例子就足够了,其中有顶点 v 其最近的边界顶点在连接 v 到边界顶点的路径上的最小 #edges 不是欧几里德距离方面最近的边界顶点。这是这种平面图的一个示例。

首先画一个直角三角形,顶点为 (0,0), (1,0), (0,1)。然后沿边从 (1,0) 到 (0,1) 选择大量顶点,使顶点将边分成大小相等的段。将所有这些顶点连接到 (0,0)。然后,对于您添加的所有顶点,为每对相邻顶点绘制一个等边三角形,将这两个顶点用作等边三角形顶点中的两个。用直线连接等边三角形的所有“顶部”。现在你应该有一个看起来像纸牌屋第一层的区域。同样,在第一层之上添加纸牌屋的第二层。这是图表,它满足您的属性。现在请注意,对于您沿从 (1,0) 到 (0,1) 的边添加的所有顶点,它们具有 (0,0) 作为邻居,这是一个边界顶点。但是,就欧几里得距离而言,最近的边界顶点将是沿着 2 级纸牌屋周边的边界顶点之一,它几乎总是相距 2 条边。从这些内部顶点之一进行广度优先搜索将返回 (0,0) 作为最近的边界顶点,这是不正确的。我认为这个例子只是让事情变得多么复杂的一瞥,这样你的假设仍然得到满足。最快的算法确实可能只是枚举所有边界顶点,然后为每个顶点测试所有边界顶点以找到最接近的。如果您有一个漂亮的“胖”网格,其中大多数顶点不是边界顶点,那么至少边界顶点的数量将远小于顶点的总数,

于 2013-07-18T19:56:54.983 回答