我一直在努力让Catmull-Rom样条曲线为一个辅助项目工作,但很难让它完成我需要的任务。我尝试了以下两种实现,但都不适用于我,而且我无法追踪代码中相对于它们的任何错误(我必须假设它们已经过测试)。我将他们的解决方案称为"ABC":
Catmull-rom曲线,无尖端,无自交叉
https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline
然后我实现了以下解决方案(我称之为"矩阵"解决方案),它确实使用了编辑后的第3版帖子:https://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-spline
然而,这个矩阵解决方案只是实现了Catmull-Rom,矩阵中内置了0.5"a"值。我想让Chordal工作,因此我需要"a"==1。
考虑到我对ABC版本的解决方案造成了问题,我尝试在这里使用矩阵(http://algorithmist.net/docs/catmullrom.pdf)通过我自己的"a"。这是原始的0.5代码,后面是我修改后的代码,它传递给用户指定的"a"。
原始代码:
float u2 = u * u;
float u3 = u2 * u;
return ((2 * x1) +
(-x0 + x2) * u +
(2*x0 - 5*x1 + 4*x2 - x3) * u2 +
(-x0 + 3*x1 - 3*x2 + x3) * u3) * 0.5f;
修改代码:
float u2 = u * u;
float u3 = u2 * u;
static float a = 0.5f;
return ((1.0f * x1) +
((-a*x0) + (a*x2)) * u +
((2.0f*a)*x0 + (a-3.0f)*x1 + (3.0f-(2.0f*a))*x2 + (-a*x3)) * u2 +
((-a*x0) + (2.0f-a)*x1 + (a-2.0f)*x2 + (a*3.0f)) * u3) * 0.5f;
这当然行不通。然而,我不明白为什么。在pdf的第4页底部,它显示了带有"a"的矩阵。我在上面修改的代码中替换了它,并对它进行了三次检查,但样条曲线被搞砸了。它本应该给我同样的答案。更令人困惑的是,他在第5页的结果采用了所得矩阵,并将其乘以0.5,从而使矩阵条目中的所有/2都减少了。最终的矩阵使用了这些值,但第4页上的原始矩阵不是0.5*矩阵,它只是"矩阵"。为什么这个0.5被任意添加,为什么没有它一切都会崩溃?
不管怎样,有人知道我的方程式可能做错了什么吗?我可以使用这个矩阵形式从0-1传入我自己的"a"并创建均匀的向心和弦样条曲线吗?还是必须使用ABC形式?
提前感谢!
我认为pdf文件第4页中带有"a"的矩阵仍然适用于统一Catmull-Rom(CR)样条曲线。参数"a"是张力参数。在Wiki页面中(https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline),它还使用"alpha"来控制分配给每个点的结序列。不要把张力参数"a"和这个"alpha"混淆
"标准"均匀CR样条曲线的alpha=0.0(这将导致A=0.5)。弦CR样条线需要使用alpha=1.0,向心CR样条条线需要需要使用alpha=0.5。它们对应的矩阵形式都将涉及点的节点序列。因此,对于均匀CR样条曲线,在矩阵形式中使用a=1.0不会产生弦CR样条线,而是在数据点处具有更强切线的均匀CR样条线,这通常会导致不期望的样条曲线形状。