任意数量控制点的B样条曲线

B-Spline for any number of control points

本文关键字:样条曲线 控制 任意数      更新时间:2023-10-16

我目前正在使用数值弹簧物理学研究软体系统,我终于做到了。我的问题是,目前一切都是直线的。

我的目标是复制类似于游戏"地板是果冻"的东西,除了光滑的角落和变形之外,其他一切都能正常工作,而这些地方目前都是直的和有角度的。

我尝试过使用三次贝塞尔方程,但这意味着每3个节点我就有一条新曲线。贝塞尔样条曲线是否有一个方程,该方程包含n个控制点,这些控制点将与vec2的循环一起工作(因此节点[0]是第一个也是最后一个控制点)。

对不起,我没有任何代码可以显示,但我完全被难住了,谷歌搜索什么都没有。

只需谷歌"B样条曲线库"就能为您提供许多参考。话虽如此,B样条曲线并不是你唯一的选择。您也可以使用三次埃尔米特样条曲线(由一系列点和导数定义)(有关详细信息,请参阅链接)。

另一方面,您也可以在系统中继续使用直线,并创建一条插值直线顶点的曲线,仅用于显示目的。为了通过一系列数据点创建插值曲线,Catmull-Rom样条曲线是一个很好的选择,便于实现。这种方法可能比在系统中真正使用B样条曲线具有更好的性能。

我会使用B样条来解决这个问题,因为它们可以用最少的控制点来表示平滑曲线。此外,为给定的数据集寻找近似光滑表面是一个简单的线性代数问题。

我已经编写了一个简单的B样条C++库(也包括贝塞尔曲线),用于科学计算,如下所示:https://github.com/feevos/bsplines

它可以接受任意数量的控制点/倍数,并为您提供基础。然而,创建适合你的数据的B样条曲线是你必须做的事情

在GNU GSL(https://www.gnu.org/software/gsl/manual/html_node/Basis-Splines.html)。同样,在这里,您必须将给定基础的控制点实现为2/3D,并固定边界条件以适合您的数据。

有关开放/闭合曲线和B样条曲线的详细信息,请点击此处:https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/index.html