【发布时间】:2019-11-14 21:50:19
【问题描述】:
我正在尝试减少 3D 曲线的数据点数量,目前我有 20000 个点,我想在不丢失太多信息的情况下将其减少到 2000 个左右。
我在 python 上做这个。
举个简单的例子,想想圆柱体表面上的螺旋。
是否有任何内置函数可以做到这一点?
我尝试使用 Ramer–Douglas–Peucker 算法来简化线条,但由于曲线的性质,对于每个忽略的数据点,最终绘图都低于预期。看一个 2D 例子的图片,橙色是使用 rdp 产生的,绿色是我想要的。
我希望程序的输出是一个由 ~2000 个坐标组成的数组,它们仍然代表 3D 曲线的形状,但它们不一定是原始坐标,我希望一些点过冲而其他点下冲.
感谢您的帮助
更新: 最后,我选择了做一些非常投入的事情,但给了我我想要的东西。我开始使用 rdp 算法来减少点数。有了这些新信息,我将一条最适合的直线拟合到新的缩减点之间的原始点的分布: 即,如果算法“忽略”了 13 个点,我拟合从点 0 到点 14 的线,并对算法跳过的下一段(例如 7 个点)执行相同的操作,所以我从 14 拟合到 22 等。 有了这些最适合的线,我发现这些点是相交的线,或者如果这些线不相交,则每条线上离另一条线最近的点。 由于我的问题的性质,我不需要我的数据是连续的,所以 2000 个“不连续”段不是问题。 非常感谢您的帮助!
【问题讨论】:
-
根据维基百科,Ramer–Douglas–Peucker 从曲线中的两个点开始并保留它们,然后移除比 epsilon 更近的点。我认为该算法不适用于您正在尝试做的事情。也许将段分成相等的长度,然后对其拟合最小二乘分段线性函数?那会给你绿线。您可能必须在极坐标中工作。
-
谢谢,这与我正在做的事情类似,到目前为止它似乎正在工作,我将使用解决方案编辑帖子。
标签: python curve-fitting spline