我正在尝试使用某些库绘制大量点。这些点按时间排序,其值可以认为是不可预测的。
目前,我的问题是点的数量太多,导致库花费的时间太长而无法渲染。许多点是多余的(也就是说,它们与函数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+b
和a
是数组时的b
表示串联x[-1]
是数组的最后一个元素在here上可以看到在具有100,000点且值
eps
增大的图形上运行此实现的结果的示例。