如何有效地优化2D路径中的坐标数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有效地优化2D路径中的坐标数?相关的知识,希望对你有一定的参考价值。
我正在2D环境中处理大量坐标。坐标为路径建模。
这里是一个例子:
path = [(0,0), (1,0), (2,0), (3,0), (3,1), (3,2), (2,2), (1,2), (0,2)]
我想通过删除冗余坐标来优化此路径。通常,坐标沿着X轴或Y轴上的直线移动。因此,可以从路径中删除“角”坐标之间的所有点。
此路径等同于上面的路径:
path = [(0,0), (3,0), (3,2), (0,2)]
这里是描述所需优化的图像:
坐标将始终在某一轴上笔直对齐。对角线可以忽略。
如果有人能给我提示如何有效实现这一目标,那就太好了。由于路径是按程序生成的,因此我需要多次运行优化算法。
答案
Rahmer-Douglas-Peucker算法在许多情况下适合减少沿2D
路线的点数。
python示例:
# pip install rdp
from rdp import rdp
path = [[0,0], [1,0], [2,0], [3,0], [3,1], [3,2], [2,2], [1,2], [0,2]]
rdp(path)
# output: [[0, 0], [3, 0], [3, 2], [0, 2]]
另一答案
因此,我提出了以下解决方案:每次向路径添加新点时,我都会检查X或Y值是否等于前两个点的值。如果是这样,我可以删除三个点中的中间一个。
private void RedundancyCheck()
if (this.Points.Length < 3)
return;
var last = this.Points[this.Points.Length-1];
var secondLast = this.Points[this.Points.Length-2];
var thirdLast = this.Points[this.Points.Length-3];
if ( (last.x == secondLast.x && last.x == thirdLast.x)
|| (last.y == secondLast.y && last.y == thirdLast.y) )
RemovePoint(this.Points.Length-2);
此算法似乎运行得非常快,我能够将坐标量从〜450'000减少至〜3300。 (当然这取决于坐标)
以上是关于如何有效地优化2D路径中的坐标数?的主要内容,如果未能解决你的问题,请参考以下文章