圆心Catmull-Rom样条是如何工作的?

17

这个网站上了解到,这似乎是关于Catmull-Rom样条最详细的信息,它需要四个点来创建该样条。然而,它没有提到点p0和p3如何影响p1和p2之间的值。

我还有一个问题,那就是如何创建连续的样条曲线呢?是否只需将点p1和p2定义为与p4、p5连续,方法是使p4=p2(假设我们有p0、p1、p2、p3、p4、p5、p6、...... pN)。

更一般的问题是,如何计算Catmull-Rom样条曲线的切线?是否需要在样条曲线上取两个点(例如在0.01、0.011处),并基于勾股定理得出切线,给定这些输入值的位置坐标?


普通的Catmull-Rom曲线也容易出现环路和自交的情况,这可能会成为一个问题。我强烈建议使用此处展示的向心参数化方法:https://dev59.com/cGkx5IYBdhLWcg3wCP2Y#19283471 - Ted
3个回答

10
看一下公式2——它描述了控制点如何影响线条。可以看到点P0P3进入了方程,用于绘制从P1P2的曲线上的点。还可以看到,在t == 0时,该方程给出P1,在t == 1时给出P2
这个例子方程可以被推广。如果你有点R0R1,…RN,那么你可以使用方程2将P0 = RK - 1P1 = RKP2 = RK + 1P3 = RK + 2进行描点,以便在RKRK + 1之间绘制点。
除非你添加额外控制点来代替R - 1RN + 1,否则无法从R0R1或从RN - 1RN进行绘制。总体思路是你可以选择任何要加入序列头部和尾部的点,以给自己计算样条所需的所有参数。
通过在它们之间删除一个控制点,可以将两个样条连接起来。比如说,如果你有R0R1,…,RNS0S1,…SM,它们可以连接为R0R1,…,RN - 1S1S2,…SM
要计算任意点的切线,只需要对方程2进行求导。

6

维基百科文章提供了更加详细的解释。样条曲线的一般形式接受两个带有切向量的控制点作为输入。只要公共控制点处的切向量相等,就可以添加额外的样条曲线段,这保持了C1连续性。

在具体的Catmull-Rom形式中,中间点处的切向量由相邻控制点的位置决定。因此,为了通过多个点创建C1连续的样条曲线,只需提供控制点集和第一个和最后一个控制点处的切向量即可。我认为标准行为是在P0处使用P1-P0的切向量,在PN处使用PN-PN-1的切向量。

根据维基百科文章,在计算控制点Pn处的切向量时,使用以下方程:

T(n) = (P(n - 1) + P(n + 1)) / 2

这也回答了你的第一个问题。对于一组4个控制点P1、P2、P3、P4,插值P2和P3之间的值需要来自所有4个控制点的信息。P2和P3本身定义了插值线段必须通过的端点。P1和P3确定了插值线段在点P2处的切向量。P4和P2确定了线段在点P3处的切向量。控制点P2和P3处的切向量影响它们之间插值线段的形状。

2
非常抱歉,如果我漏掉了什么,请问您能指出文章中哪里给出了那个公式吗?我在http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Catmull.E2.80.93Rom_spline看到了另一个公式。(我不是很擅长数学,我只是想知道您是如何得出这个公式的。) - user837703

1

3
虽然这个回答从理论上回答了问题,但最好在此处包含回答的基本部分,并提供链接作为参考。 - Dada
1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Edwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接