样条之埃尔米特(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
饮水思源,不忘初心。
要面包,也要有诗和远方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2016-07-21 SWIG 多语言接口变换 【转】