我有一组数据点:
(x1, y1) (x2, y2) (x3, y3) ... (xn, yn)
样本点的数量可以是数千个。我想用最少的(假设 30 个)点集尽可能准确地表示相同的曲线。我想捕捉尽可能多的拐点。但是,我对表示数据的允许点数有硬性限制。
实现相同目标的最佳算法是什么?有没有可以提供帮助的免费软件库?
PS:我已经尝试实现基于点消除的相对斜率差异,但这并不总能产生最佳的数据表示。
您正在寻找一种插值算法。您的点集是数学意义上的函数(所有 x 值彼此分离),那么您可以进行多项式插值,或者它们是否分布在 2d 平面上,然后您可以使用贝塞尔曲线。
多年后迟到的答案:
看看Douglas-Peucker 算法:
function DouglasPeucker(PointList[], epsilon)
// Find the point with the maximum distance
dmax = 0
index = 0
end = length(PointList)
for i = 2 to ( end - 1) {
d = perpendicularDistance(PointList[i], Line(PointList[1], PointList[end]))
if ( d > dmax ) {
index = i
dmax = d
}
}
// If max distance is greater than epsilon, recursively simplify
if ( dmax > epsilon ) {
// Recursive call
recResults1[] = DouglasPeucker(PointList[1...index], epsilon)
recResults2[] = DouglasPeucker(PointList[index...end], epsilon)
// Build the result list
ResultList[] = {recResults1[1...length(recResults1)-1], recResults2[1...length(recResults2)]}
} else {
ResultList[] = {PointList[1], PointList[end]}
}
// Return the result
return ResultList[]
end
它经常用于简化 GPS 轨迹并减少航路点的数量。作为准备,您可能必须对点进行排序以将相邻点存储在列表或数组中。
这取决于您的曲线必须与每个点相交还是近似值。尝试: