Chordal Catmull-Rom Splines

时间:2015-06-21 20:17:49

标签: matrix curve spline catmull-rom-curve

我一直致力于让Catmull-Rom splines为一个辅助项目工作,并且很难让它完成我需要的工作。我尝试了以下两种实现,两者都没有为我工作,我无法追踪我的代码中相对于他们的任何错误(我必须假设已经过测试)。我打电话给他们" ABC"溶液:

Catmull-rom curve with no cusps and no self-intersections

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

然后,我实施了以下解决方案(我将其称为" Matrix"解决方案),并且使用已编辑的第3版帖子确实有效:https://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-spline

然而,这个Matrix解决方案只是实现了Catmull-Rom的0.5' a'矩阵内置的价值。我想让Chordal工作,因此我需要一个'一个' == 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都掉了下来。最终矩阵使用THESE值,但第4页上的原始矩阵不是0.5 *矩阵,它只是"矩阵"。为什么这个0.5被任意添加,为什么一切都没有呢?

无论如何,有没有人知道我的等式可能做错了什么?我可以使用这种矩阵形式传递我自己的' a'从0-1开始,创建均匀的,向心的和弦的样条曲线,还是必须使用ABC形式?

提前致谢!

1 个答案:

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