需要图形简化算法的建议

时间:2011-02-05 12:32:29

标签: algorithm graph simplification lang douglas-peucker

我需要拍摄n点的2D图并将其减少r点(其中r是小于n的特定数字)。例如,我可能有两个总点数略有不同的数据集,例如1021和1001,我想强制两个数据集都有1000个点。我知道几种简化算法:Lang Simplification和Douglas-Peucker。我在之前的项目中使用了Lang,但需求略有不同。

我正在寻找的算法的具体属性是:

1)必须保留线条的形状

2)必须允许我将数据集减少到特定的点数

3)相对较快

这篇文章讨论了不同算法的优点。我将发布第二条消息,以获取有关Java或Groovy实现的建议(为什么要重新发明轮子)。

我关注上述要求2。我不是这些算法的专家,知道我是否可以指定输出点的确切数量。我使用的Lang的实现将lookAhead,tolerance和Points数组作为输入,所以我看不出如何指定输出中的点数。这是我当前需求的关键要求。也许这是由于我们使用Lang的具体实现,但我还没有在网上看到很多关于Lang的信息。或者我们可以使用Douglas-Peucker,但我不确定输出中的点数是否可以指定。

我应该补充一点,我不是这些类型的算法或任何类型的数学知识的专家,所以我正在寻找凡人类型的建议:)我如何满足上面的要求1和2?我会为正确的解决方案牺牲性能。

2 个答案:

答案 0 :(得分:2)

我认为你可以非常直接地适应Douglas-Pücker。调整递归算法,以便生成一个镜像递归调用结构的树而不是生成列表。树的根将是单线近似P0-Pn;下一级将代表两线近似值P0-Pm-Pn,其中Pm是P0和Pn之间的点,它距离P0-Pn最远;下一级(如果已满)将表示四行近似等。然后,您可以根据深度或基于插入点与父线的距离来修剪树。

编辑:事实上,如果采用后一种方法,则无需构建树。而是填充优先级队列,其中优先级由插入点与父线的距离给出。然后,当您完成队列时,告诉您要删除哪些点(或根据优先级的顺序保留)。

答案 1 :(得分:1)

您可以找到关于Douglas-Peucker简化herehere的C ++实现和文章。我还提供了Douglas-Peucker简化的修改版本,允许您指定生成的简化线的点数。它使用'Peter Taylor'提到的优先级队列。它的速度要慢得多,所以我不知道它是否能满足'相对较快'的要求。

我计划为Lang简化(以及其他几个)提供实现。目前我没有看到任何简单的方法如何调整Lang以减少到固定点数。如果你 可以满足不太严格的要求:'必须允许我将数据集减少到近似点数',然后您可以使用迭代方法。猜测前瞻的初始值:点数/期望点数。然后慢慢增加前瞻,直到大约达到所需的点数。

我希望这会有所帮助。

p.s。:我只记得一些东西,你也可以试试Visvalingam-Whyatt算法。简而言之: - 使用直接邻居计算每个点的三角形区域 - 排除这些区域 - 删除面积最小的点 - 更新邻居的区域 -采取 - 继续,直到n点为止

相关问题