我需要一个n点的2D图,并将其减少为r点(其中r是小于n的特定数)例如,我可能有两个总点数略有不同的数据集,比如1021和1001,我想强制两个数据集都有1000个点数我知道一些简化算法:Lang简化和Douglas Peucker我在以前的一个项目中使用了Lang,但需求略有不同。
我要找的算法的具体属性是:
1)必须保持线条的形状
2)必须允许我将数据集减少到特定数量的点
3)比较快
这篇文章讨论了不同算法的优点我将发布第二条消息,以获取关于java或groovy实现的建议(为什么要重新发明轮子)。
我很担心上面的第2条要求。我不是这些算法的专家,不知道我是否可以指定输出点的确切数目我使用的Lang的实现以lookAhead、tolerance和Points数组作为输入,因此我不知道如何指定输出中的点数这是我目前需要的一个关键要求也许这是因为我们使用了Lang的具体实现,但是我在web上没有看到关于Lang的很多信息或者我们可以使用douglas peucker,但是我不确定输出中的点数是否可以指定。
我要补充的是,我不是这些类型的算法或任何类型的数学天才的专家,所以我正在寻找纯粹的凡人类型的建议:)我如何满足上述要求1和2?我会为了正确的解决方案牺牲性能。

最佳答案

你可以找到我的C++实现和关于Douglas Peucker简化herehere的文章。我还提供了一个修改版的Douglas-Peucker简化,允许您指定得到的简化线的点数它使用“peter taylor”提到的优先级队列。不过速度慢了很多,所以我不知道它是否能满足“相对较快”的要求。
我正在计划为lang简化提供一个实现(以及其他一些实现)。目前我看不到任何简单的方法来调整Lang以减少到固定点计数如果你
可以使用一个不太严格的要求:“必须允许我将数据集减少到大约一个点”,然后可以使用迭代方法。猜测lookahead的初始值:点计数/所需点计数。然后慢慢地增加向前看,直到你大致击中期望的点计数。
我希望这能有帮助。
备注:我刚想起来了,你也可以试试Visvalingam-Whyatt算法简而言之:
-用直接邻域计算每个点的三角形面积
-对这些区域进行排序
-删除面积最小的点
-更新其邻居的区域
-度假村
-继续直到n点

关于algorithm - 需要图简化算法建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4906835/

10-12 21:17