我有一个允许用户绘制曲线的程序.但是这些曲线看起来并不好看 - 它们看起来摇摇晃晃,手绘.
所以我想要一种能够自动平滑它们的算法.我知道平滑过程中存在固有的模糊性,因此每次都不会是完美的,但是这些算法似乎确实存在于几个绘图包中并且它们工作得很好.
是否有类似这样的代码示例?C#会很完美,但我可以翻译其他语言.
我有一组近似于2D曲线的点.我想使用带有numpy和scipy的Python来找到一个大致适合点的三次Bézier路径,其中我指定了两个端点的精确坐标,并返回其他两个控制点的坐标.
我最初认为scipy.interpolate.splprep()可能会做我想要的,但它似乎迫使曲线通过每个数据点(因为我想你想要插值).我会假设自己走错了路.
我的问题与此类似:如何将Bézier曲线拟合为一组数据?,除了他们说他们不想使用numpy.我的偏好是找到我需要已经在scipy或numpy中实现的东西.否则,我计划使用numpy实现从该问题的一个答案链接的算法:一种自动拟合数字化曲线的算法(pdf.page 622).
谢谢你的任何建议!
编辑:据我所知,立方Bézier曲线无法保证通过所有点; 我想要一个通过两个给定端点,并且尽可能接近指定内部点的端点.
我有一些地理数据(下面的图像显示了河流的路径为红点),我想用多段三次贝塞尔曲线近似.通过对计算器等问题,在这里和这里我发现由Philip J.施耐德从"图形宝石"的算法.我成功地实现了它并且可以报告即使有数千个点它也非常快.不幸的是,速度带来了一些缺点,即装配非常不合适.请考虑以下图形:

红点是我的原始数据,蓝线是由Schneider算法创建的多段贝塞尔曲线.如您所见,算法的输入是一个容差,至少与绿线表示的一样高.然而,该算法创建了具有太多急转弯的贝塞尔曲线.你也会在图像中看到这些不必要的急转弯.很容易想象,对于所示数据,具有较小急转弯的贝塞尔曲线,同时仍保持最大公差条件(仅将贝塞尔曲线稍微推向品红色箭头的方向).问题似乎是算法从我的原始数据中选取数据点作为各个贝塞尔曲线的终点(品红箭头指示一些嫌疑人).由于贝塞尔曲线的端点受到限制,很明显该算法有时会产生相当尖锐的曲率.
我正在寻找的是一种算法,它使用具有两个约束的多段贝塞尔曲线来近似我的数据:
我发现可以创造更好拟合的解决方案或者仅适用于单个贝塞尔曲线(并且省略了如何在多段贝塞尔曲线中找到每个贝塞尔曲线的良好起点和终点的问题)或者不允许最小曲率约束.我认为最小曲率约束是这里的棘手条件.
这是另一个例子(这是手绘而不是100%精确):

让我们假设图1显示了两者,曲率约束(圆必须适合整个曲线)以及任何数据点与曲线的最大距离(恰好是绿色圆的半径).图2中红色路径的成功近似显示为蓝色.该近似值符合曲率条件(圆可以在整个曲线内滚动并在任何地方触摸它)以及距离条件(以绿色显示).图3显示了路径的不同近似值.虽然它符合距离条件但很明显圆圈不再适合曲率.图4显示了一条不可能用给定约束近似的路径,因为它太尖了.该示例应该说明为了正确地近似路径中的一些尖转弯,算法必须选择不属于路径的控制点.图3显示,如果选择沿路径的控制点,则不能再满足曲率约束.此示例还显示算法必须退出某些输入,因为无法使用给定的约束来近似它.
这个问题是否存在解决方案?解决方案不一定要快.如果需要一天时间来处理1000点,那就没问题了.解决方案也不必是最佳的,因为它必须导致最小二乘拟合.
最后,我将用C和Python实现它,但我也可以阅读大多数其他语言.
我想将带有已知端点(p0和p3)的贝塞尔曲线拟合到嘈杂的2d数据。与传统的4点贝塞尔曲线拟合相比,这似乎是一个容易解决的问题,但对于我来说仍然太难了。
有人可以指出我现有的代码或算法来找到控制点p1和p2的最佳值吗?
编辑:我要与贝塞尔曲线拟合的点来自用鼠标绘制的曲线(想象在Paint中用画笔绘制一些东西,一次长笔画可能有数百个记录点)。锚点p0和p3是预先创建的,但应该计算控制点p1和p2,以使贝塞尔曲线适合用鼠标绘制的曲线的形状。