已知貝塞爾曲線的4個點,如何求貝塞爾曲線的長度?

4個點分別是 起點 控制點1 控制點2 終點


Earl Boebert 在1993年的newsgroup上總結了一篇 CG Notes: Arc Length of Cubic Bezier Curves, 列出了幾個方法的 C 實現。

最簡單的當然是把曲線變成折線,但這個方法不太好,因為曲率大的部分需要更多折線來減少誤差。

文中提到[1],而作者最後採用的方法是[2][3][4],自適應地分割Bézier曲線,當中應該用到了 De Casteljaus algorithm。

[1] Guenter, Brian, and Richard Parent. "Computing the arc length of parametric curves." Computer Graphics and Applications, IEEE 10.3 (1990): 72-78.

[2] Gravesen, J. Adaptive Subdivision and the Lenght of Bézier Curves. Technical University of Denmark. Department of Mathematics, 1992.

[3] Gravesen, Jens. "The length of bezier curves." Graphics Gems V (1995): 199-205.

[4] Gravesen, Jens. "Adaptive subdivision and the length and energy of Bézier curves." Computational Geometry 8.1 (1997): 13-31. Adaptive subdivision and the length and energy of B??zier curves積分。

L = int_0^1sqrt{f_x(t)^2+f_y(t)^2}mathrm{d}t

三次 bezier 曲線的話,導數都是二次函數吧……解析法無解, 因為解析法中的原函數不可求;

這裡有一種我自己研究出的方法: 樣條參數與曲線長度間的互相求解

這裡最重要的一點是誤差控制, 沒有誤差控制就沒有實用性.

這個方法目的不僅是求長度, 而是實現給定長度快速求曲線參數 t, 或給定 t 快速求曲線長度, 這樣就可以讓物體沿路徑按任意變化的速度運動了.離散化以後求折線長度。


推薦閱讀:

TAG:演算法 | 數學 | 貝塞爾曲線 |