© 2013-2023 Conmajia
Updated on 9th March, 2023
Initiated on 22nd February, 2015
摘要 本文介绍贝塞尔曲线历史和基本原理,并以 .NET Frameworks GDI+ 为例简单实现了一个带控制手柄和可扩展样式的曲线控件.
1 简介
绘图软件中常常用到带控制手柄的曲线,用于精确调整连续变化的数值. 贝塞尔曲线源自一族广泛应用于工程 CAD 和计算机图形学的曲线参数方程,由法国雷诺汽车公司工程师皮埃尔·艾蒂安·贝塞尔(Pierre Étienne Bézier,1910-1999)于 1962 年提出,并基于此开发了 UNISURF 建模系统(1968). 有关贝塞尔函数的详细内容,可以参阅贝塞尔本人撰写的《UNISURF CAD 系统的数学基础》一书(Butterworths,1986,56页).
1.1 贝塞尔函数
贝塞尔函数是一族形为
x 2 y ′ ′ + x y ′ + ( x 2 − n 2 ) y = 0 x^2y''+xy'+\left(x^2-n^2\right)y=0 x2y′′+xy′+(x2−n2)y=0
的函数,其中 n n n 为阶数。该函数族的解为
y ( x ) = A J n ( x ) + B Y n ( x ) , y(x)=AJ_n(x)+BY_n(x), y(x)=AJn(x)+BYn(x),
其中 J n ( x ) J_n(x) Jn(x) 称为第一类贝塞尔函数, Y n ( x ) Y_n(x) Yn(x) 称为第二类贝塞尔函数.
贝塞尔函数可以看作一族衰减的正弦函数,如图 1 所示,其中 J 0 ( 0 ) = 1 J_0(0)=1 J0(0)=1, Y n ( 0 ) = ∞ Y_n(0)=\infty Yn(0)=∞.
图 1. 第一类、第二类贝塞尔函数的图形
利用弗罗贝尼乌斯(Frobenius)方法求解可得,
J n ( x ) = ∑ k = 0 ∞ ( − 1 ) k k ! ( n + k ) ! ( x 2 ) n + 2 k Y n ( x ) = 2 π J n ( x ) [ ln x 2 + γ ] − 1 π ∑ k = 0 n − 1 ( n − k − 1 ) ! k ! ( x 2 ) 2 k − n − 1 π ∑ k = 0 ∞ ( − 1 ) k [ Φ ( k ) + Φ ( n + k ) ] 1 k ! ( n + k ) ! ( x 2 ) 2 k + n , J_n(x)=\sum_{k=0}^\infty\frac{(-1)^k}{k!(n+k)!}\left(\frac{x}{2}\right)^{n+2k}\\ \begin{aligned} Y_n(x)=&\frac{2}{\pi}J_n(x)\left[\ln\frac{x}{2}+\gamma\right]-\frac{1}{\pi}\sum_{k=0}^{n-1}\frac{(n-k-1)!}{k!}\left(\frac{x}{2}\right)^{2k-n}\\ &-\frac{1}{\pi}\sum_{k=0}^\infty(-1)^k\left[\Phi(k)+\Phi(n+k)\right]\frac{1}{k!(n+k)!}\left(\frac{x}{2}\right)^{2k+n}, \end{aligned} Jn(x)=k=0∑∞k!(n+k)!(−1)k(2x)n+2kYn(x)=π2Jn(x)[ln2x+γ]−π1k=0∑n−1k!(n−k−1)!(2x)2k−n−π1k=0∑∞(−1)k[Φ(k)+Φ(n+k)]k!(n+k)!1