1. 程式人生 > 實用技巧 >樣條之埃爾米特(Hermite)[轉]

樣條之埃爾米特(Hermite)[轉]

樣條之埃爾米特(Hermite)

埃爾米特(Charles Hermite,1822—1901) 法國數學家。巴黎綜合工科學校畢業。曾任法蘭西學院、巴黎高等師範學校、巴黎大學教授。法蘭西科學院院士。在函式論、高等代數、微分方程等方面都有重要發現。1858年利用橢圓函式首先得出五次方程的解。1873年證明了自然對數的底e的超越性。在現代數學各分支中以他姓氏命名的概念(表示某種對稱性)很多,如“埃爾米特二次型”、“埃爾米特運算元”等。

  這種演算法是由上一節講的CatmullRom演變而成。

關於插值與樣條的介紹請看:http://www.cnblogs.com/WhyEngine/p/4020294.html

核心程式碼:

 1 void    YcHermiteSpline::BuildWeights()
 2 {
 3     ClearWeights();
 4 
 5     for (Yuint i = 0; i < 4; i++)
 6     {
 7         m_splineWeights[i] = (Yreal*)malloc((m_subD)*sizeof(Yreal));
 8     }
 9 
10     Yreal u, u_2, u_3;
11     for (Yuint i = 0; i < m_subD; i++)
12     {
13         u = (float)i / m_subD;
14         u_2 = u * u;
15         u_3 = u_2 * u;
16 
17         // 參見"遊戲程式設計精粹1"P420
18         /*
19         m0 = ((1 - alpha) / 2.0f) * ((v2 - v1) + v3 - v2);
20         m1 = ((1 - alpha) / 2.0f) * ((v3 - v2) + v4 - v3);
21 
22         dest = (((2 * t3) - (3 * t2) + 1) * v2) +
23                 ((t3 - (2 * t2) + t) * m0) +
24                 ((t3 - t2) * m1) +
25                 (((-2 * t3) + (3 * t2)) * v3);
26 
27         ====================
28 
29         m0 = ((1 - alpha) / 2.0f) * (v3 - v1);
30         m1 = ((1 - alpha) / 2.0f) * (v4 - v2);
31 
32         m0 = ((1 - alpha) / 2.0f) * v3 - ((1 - alpha) / 2.0f) * v1;
33         m1 = ((1 - alpha) / 2.0f) * v4 - ((1 - alpha) / 2.0f) * v2;
34 
35         ====================
36 
37         dest = (((2 * t3) - (3 * t2) + 1) * v2) +
38                 ((t3 - (2 * t2) + t) * ((1 - alpha) / 2.0f) * v3) 
39                -((t3 - (2 * t2) + t) * ((1 - alpha) / 2.0f) * v1) 
40                 ((t3 - t2) * ((1 - alpha) / 2.0f) * v4) 
41                -((t3 - t2) * ((1 - alpha) / 2.0f) * v2) 
42                 (((-2 * t3) + (3 * t2)) * v3);
43 
44         ====================
45 
46         v1: -((t3 - (2 * t2) + t) * ((1 - alpha) / 2.0f)
47         v2: ((2 * t3) - (3 * t2) + 1) - (t3 - t2) * ((1 - alpha) / 2.0f)
48         v3: (t3 - (2 * t2) + t) * ((1 - alpha) / 2.0f) + ((-2 * t3) + (3 * t2))
49         v4: (t3 - t2) * ((1 - alpha) / 2.0f)
50         */
51 
52         // CatmullRom
53         // 貌似m_alpha==0時,Hermite就是CatmullRom
54         //m_splineWeights[0][i] = (-1.0f*u_3 + 2.0f*u_2 - 1.0f*u + 0.0f)*0.5f;
55         //m_splineWeights[1][i] = ( 3.0f*u_3 - 5.0f*u_2 + 0.0f*u + 2.0f)*0.5f;
56         //m_splineWeights[2][i] = (-3.0f*u_3 + 4.0f*u_2 + 1.0f*u + 0.0f)*0.5f;
57         //m_splineWeights[3][i] = ( 1.0f*u_3 - 1.0f*u_2 + 0.0f*u + 0.0f)*0.5f;
58 
59         m_splineWeights[0][i] = -(u_3 - (2 * u_2) + u) * (1 - m_alpha) / 2.0f;
60         m_splineWeights[1][i] = (2 * u_3) - (3 * u_2) + 1 - (u_3 - u_2) * (1 - m_alpha) / 2.0f;
61         m_splineWeights[2][i] = (-2 * u_3) + (3 * u_2) + (u_3 - (2 * u_2) + u) * (1 - m_alpha) / 2.0f;
62         m_splineWeights[3][i] = (u_3 - u_2) * (1 - m_alpha) / 2.0f;
63     }
64 }

切圖:

相關軟體的下載地址為:http://files.cnblogs.com/WhyEngine/TestSpline.zip