如何有效地优化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)]

这里是描述所需优化的图像:

path example

坐标将始终在某一轴上笔直对齐。对角线可以忽略。

如果有人能给我提示如何有效实现这一目标,那就太好了。由于路径是按程序生成的,因此我需要多次运行优化算法。

答案

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]]

rdp project home

另一答案

因此,我提出了以下解决方案:每次向路径添加新点时,我都会检查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路径中的坐标数?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地将数据附加到 C 中的 HDF5 表?

OpenCV:如何有效地将 Mat2d 矩阵的每个元素乘以 Mat1d 矩阵

如何有效地从python中的日期中减去年份?

opengl中的正交投影和纹理坐标

如何从 2d FFT 计算波数域坐标

是否可以有效地计算与数轴上单个点 P 重叠的线段数?