0

我有一个点列表,我想在它们之间画一条平滑线。我正在使用 RVG 库进行绘图,所以如果我能从我的观点中得到一个 SVG 字符串,我会很高兴。搜了一圈,发现Catmull-Rom大概就是用的算法。

在 Kamelopard 和 Rubyvis 库中找到了一些实现,但从我的点列表中无法理解如何使用它们。

所以,问题是,我如何获取我的 (x,y) 点数组并从中获得 Catmull-Rom 插值 SVG 曲线?

4

1 回答 1

1

Catmull-Rom 可能是一个不错的起点。我最近重新实现了 Kamelopard 版本,发现这很有帮助:http ://www.cs.cmu.edu/~462/projects/assn2/assn2/catmullRom.pdf

只要您了解矩阵乘法,它就相当简单。你最终会得到一个矩阵方程,你需要计算很多次,在你绘制的路径上的每个点一次。如果您有控制点 A、B、C 和 D,并且您想在 B 和 C 之间绘制曲线,请创建一个矩阵,其中 A、B、C 和 D 为行,并将其代入方程我链接到的论文的顶部。它将是列表中的最后一个矩阵。您需要知道的其他值是“u”,范围从 0 到 1,以及“T”,即样条的“张力”。您将多次评估方程,每次在其域中递增 u。您可以将张力设置为您想要的任何值,介于 0 和 1 之间,它会影响样条曲线的锐利程度。0.5 是一个常见的值。

例如,如果您尝试评估列表中前两个控制点或后两个控制点之间的曲线,您会发现制作矩阵时遇到问题,因为您需要在您正在评估的点。在这些情况下,只需根据需要复制第一个或最后一个控制点。

于 2013-06-18T18:03:58.490 回答