我正在尝试寻找一种算法,在Java中绘制一条通过n个点的平滑曲线。
我读了很多关于这个主题的书,但我只找到了3到4个点的例子。我不知道我应该如何用更多的点来概括这个过程。
例如,我发现了that answer,它展示了如何用3个点制作一条贝塞尔曲线。但是如果我重复下面3个点的过程,2条曲线将不会平滑地连接起来。
我还找到了详细描述这个过程的this interesting pdf。我感兴趣的部分是关于三次样条插值的第五章。它解释了如何实现我想要的东西,但只有6点。没有对n个点的概括。
如果你看到一种更简单的方法,我很乐意接受。我只是不想要拉格朗日插值。如链接的pdf所示,它没有给出好的结果...
发布于 2016-03-30 16:33:18
你可以找到三次样条的简短介绍和C中数值方法一书在this chapter中的很好的实际实现。
也可以使用Catmull-Rom splines (它们只为一阶导数提供平滑度)
由Maxim Shemanarev提出的贝塞尔曲线插值的One more simple approach
发布于 2016-03-31 05:30:04
您没有提到平滑对您来说意味着什么(what continuity c0,c1,c2...?)但在大多数情况下,为了视觉上的平滑度,三次曲线就足够了(4点曲线)。
如果希望曲线通过所有点,则需要插值而不是近似,因此BEZIER/样条线不是一种方法(除非引入了一些额外的计算)。
所以你的问题可以归结为两件事。使用什么多项式曲线以及如何平滑地将更多的多项式曲线连接在一起。要实现这一点,您需要以特定方式对控制点进行排序。Booth在这里回答了这些问题:
这里使用的插值多项式的构造方式是:它通过所有控制点,如果将更多这样的曲线放在一起,则一阶导数在两端平滑连接。点调用序列与BEZIER/样条三次曲线的调用序列相同。
如果你想/需要使用BEZIER代替插值(例如,使用GDI渲染它),并且仍然希望曲线通过所有点,你可以将我的插值立方体转换为BEZIER (它是Catmull-Rom样条的形式),你只需将控制点转换为新的控制点,以便BEZIER匹配相同的形状。它可以像this:
一样轻松地完成
您可以在此处找到连接曲线的示例图像
https://stackoverflow.com/questions/36311408
复制相似问题