我正在尝试使用某些库绘制大量点。这些点按时间排序,其值可以认为是不可预测的。

目前,我的问题是点的数量太多,导致库花费的时间太长而无法渲染。许多点是多余的(也就是说,它们与函数y = ax + b定义在同一行上)。有没有一种方法可以检测和删除冗余点以加快渲染速度?

感谢您的时间。

最佳答案

以下是针对1.5d图的Ramer-Douglas-Peucker算法的变体:


计算第一个点与最后一个点之间的线方程
检查所有其他点以找到距直线最远的地方
如果最差点低于所需的公差,则输出单个线段
否则,使用最差点作为拆分器,以递归方式考虑两个子数组进行调用


在Python中这可能是

def simplify(pts, eps):
    if len(pts) < 3:
        return pts
    x0, y0 = pts[0]
    x1, y1 = pts[-1]
    m = float(y1 - y0) / float(x1 - x0)
    q = y0 - m*x0
    worst_err = -1
    worst_index = -1
    for i in xrange(1, len(pts) - 1):
        x, y = pts[i]
        err = abs(m*x + q - y)
        if err > worst_err:
            worst_err = err
            worst_index = i
    if worst_err < eps:
        return [(x0, y0), (x1, y1)]
    else:
        first = simplify(pts[:worst_index+1], eps)
        second = simplify(pts[worst_index:], eps)
        return first + second[1:]

print simplify([(0,0), (10,10), (20,20), (30,30), (50,0)], 0.1)


输出为[(0, 0), (30, 30), (50, 0)]

关于数组的python语法可能不太明显:


x[a:b]是从索引a到索引b的数组的一部分(已排除)
x[n:]是使用x的元素从索引n到末尾的数组
x[:n]是使用n的第一个x元素制成的数组
a+ba是数组时的b表示串联
x[-1]是数组的最后一个元素


here上可以看到在具有100,000点且值eps增大的图形上运行此实现的结果的示例。

10-08 05:06