链接点具有平滑曲线

时间:2016-03-30 14:10:50

标签: java algorithm graphics2d curve-fitting

我试图找到一种算法来绘制一条通过Java中n个点的平滑曲线。

我读了很多关于这个主题的内容,但我只找到了3分或4分的例子。我不知道如何用更多的点来概括这个过程。

例如,我发现that answer显示了如何用3个点制作贝塞尔曲线。但是如果我用3个下一个点重复这个过程,那么2条曲线就不会顺利连接。

我还发现this interesting pdf详细描述了这个过程。我感兴趣的部分是关于三次样条插值的第5章。它解释了如何实现我想要的,但是6分。 n点没有概括。

如果你看到一个更简单的方法,我很乐意接受它。我只是不想拉格朗日插值。如链接的pdf所示,它没有给出好的结果......

2 个答案:

答案 0 :(得分:0)

你可以在C语言中的数值方法一书的this chapter中找到对三次样条的简短介绍和良好的实际实现。

您还可以使用Catmull-Rom splines(它们仅为一阶导数提供平滑度)

One more simple approach用于Maxim Shemanarev提出的Bezier曲线插值

答案 1 :(得分:0)

你没有提到对你来说平滑的意义(连续性 c0,c1,c2 ......?)但在大多数情况下,视觉平滑度立方体足够(4点曲线)。

如果你希望你的曲线遍历所有点,那么你需要插值而不是逼近,所以 BEZIER / SPLINE 不是一种方法(除非引入一些额外的计算)。

所以你的问题归结为两件事。使用什么多项式曲线以及如何将更多它们平滑地连接在一起。为此,您需要以特定方式对控制点进行排序。这些问题的展位在这里得到解答:

  • Proper implementation of cubic spline interpolation

    在那里使用的插值多项​​式以这样的方式构造:它通过所有控制点,并且如果将更多这样的曲线放在一起,则第一推导在两端平滑地连接。点调序列与 BEZIER / SPLINE 立方体相同。

    如果你想/需要使用 BEZIER 代替插值(例如使用 GDI 进行渲染),仍然希望曲线通过所有点,你可以转换将我的插值立方体转换为 BEZIER (它是Catmull-Rom样条曲线的形式),您只需将控制点转换为新的控制点,因此 BEZIER 匹配相同的形状。这很容易做到:

  • how to convert interpolation cubic polynomial to cubic BEZIER

在这里,您可以找到连接曲线的示例图像