Visvalingam-Whyatt折线简化算法澄清

时间:2012-05-11 20:37:31

标签: algorithm polyline simplification

我正在尝试实现折线简化算法。原文可以在这里找到:http://archive.is/Tzq2。它在概念上似乎很简单,但我不理解提供的伪代码的示例算法(我认为它的措辞很差)并且希望有人可以提供一些见解。从文章中我收集到的基本想法是

  1. 计算每个点的有效面积(由一条线上三个连续点之间的三角形组成)并删除那些面积为0的区域
  2. 从最小的区域开始,将点的面积与阈值进行比较,如果区域低于该阈值,则将其从折线中删除。
  3. 移动到两个相邻的点并重新计算它们已更改的区域
  4. 返回2,直到删除阈值以下的所有点区域
  5. 算法如下(从文章中逐字复制):

    • 计算每个点的有效面积 删除零区域的所有点并将其存储在具有该区域的单独列表中
    • REPEAT
      • 找到效率最小的点,并将其称为当前点。如果计算出的面积小于要消除的最后一个点,则使用后者的区域。 (这可确保在不消除先前消除的点的情况下无法消除当前点。)
      • 从原始列表中删除当前点,并将其与相关区域一起添加到新列表中,以便在运行时过滤该行。
      • 重新计算两个相邻点的有效面积(见图1b)。
    • UNTIL
      • 原始行只包含2个点,即起点和终点。

    我对'REPEAT'下第一步中的'if'条款感到困惑......有人可以澄清吗?

3 个答案:

答案 0 :(得分:10)

FWIW d3.js的创建者Mike Bostock写了一个严格的javascript实现这个算法(Visvalingam的算法)。

答案 1 :(得分:7)

算法的本质是按重要性对点进行排名。该点的重要性近似于其有效面积。

假设您已消除了A点,然后重新计算了B点的有效区域。新区域可能比旧区域大或更小。它可以小于A的有效面积。但是,算法仍然认为B比A更重要。

if子句的目的是确保B点在最终列表中比A更重要,这就是全部。

答案 2 :(得分:1)

我也对此感到困惑,回过头来再读一遍这篇文章,如果你在去的时候删除积分,那就不需要 - 如果你是&# 39;用固定面积阈值重新进行一次性简化。因为javascript实现以这种方式工作,所以它实际上并不需要' if'声明(但无论如何它都有它,哦)。

' if'如果您保留所有要点,则需要声明 。在这种情况下,您需要存储有效区域'使用每个点以便稍后可以过滤它们,也许使用控制输出点数的交互式滑块。通过存储更大的有效区域,您可以保留正确的顺序。