0

我一直在努力让 Catmull-Rom 样条线为一个辅助项目工作,并且很难让它完成我需要的工作。我尝试了以下两种实现,但都不适用于我,而且我无法追踪我的代码中相对于他们的任何错误(我必须假设已经过测试)。我称他们为“ABC”解决方案:

没有尖点和自相交的 Catmull-rom 曲线

https://en.wikipedia.org/wiki/Centripal_Catmull%E2%80%93Rom_spline

然后我实现了以下解决方案(我称之为“矩阵”解决方案),它确实使用编辑后的第 3 版帖子工作: https ://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-样条

但是,此 Matrix 解决方案仅实现了具有 0.5 'a' 值的 Catmull-Rom 内置到矩阵中。我想让 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 形式?

提前致谢!

4

1 回答 1

1

我认为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)。您需要将 alpha=1.0 用于弦 CR 样条,将 alpha=0.5 用于向心 CR 样条。它们对应的矩阵形式都将涉及点的结序列。因此,在矩阵形式中为均匀 CR 样条使用 a=1.0 不会产生弦 CR 样条,而是在数据点处具有更强切线的均匀 CR 样条,这通常会导致不希望的样条形状。

于 2015-06-22T05:31:20.050 回答