1. 數學分析
1) 整度數
在有些地方需要執行三角函數的計算,但是雖然C的數學庫的三角Function Compute比較精確,但是速度很慢,我們需要寫一個能夠對整度數進行快速尋找的的函數。我們將使用尋找表,並在初始化時填充尋找表。
2) 浮點度數
還要寫一個對於非整度數的三角函數查詢,結果可以不精確,但速度一定要快,這裡我們使用尋找表和線性插值的方法,達到這種效果。
線性插值的原理:
首先在尋找表中取得45度和46度的值,然後根據小數點位的大小,在45度和46度值的差值間按小數比例取得值的位移,然後再與Sin(45度)的結果相加即可。
2. 函數實現
1) 使用Math.h中的函數初始化尋找表的代碼很簡單:
int _CPPYIN_Math::InitSinCosTable()<br />{<br />for (int ang = 0; ang < 360; ++ang)<br /> {<br />double theta = (double)ang * PI / (double)180;<br />CosTable[ang] = cos(theta);<br />SinTable[ang] = sin(theta);<br /> }</p><p>return 1;<br />}
2) 線性插值按上面的方式實現,代碼如下:
double _CPPYIN_Math::FastSin(double theta_du)<br />{<br />// 對可能的正負小數模數<br />theta_du = fmod(theta_du, 360);</p><p>// 將負角度轉正<br />if (theta_du < 0)<br />{<br />theta_du += 360.0;<br />}</p><p>// 對小數和整數部分分別處理<br />int theta_int = int(theta_du);<br />double theta_frac = theta_du - theta_int;</p><p>// 插值<br />double result = SinTable[theta_int] + theta_frac * (SinTable[theta_int+1] - SinTable[theta_int]);<br />return result;<br />}</p><p>double _CPPYIN_Math::FastCos(double theta_du)<br />{<br />// 對可能的正負小數模數<br />theta_du = fmod(theta_du, 360);</p><p>// 將負角度轉正<br />if (theta_du < 0)<br />{<br />theta_du += 360.0;<br />}</p><p>// 對小數和整數部分分別處理<br />int theta_int = int(theta_du);<br />double theta_frac = theta_du - theta_int;</p><p>// 插值<br />double result = CosTable[theta_int] + theta_frac * (CosTable[theta_int+1] - CosTable[theta_int]);<br />return result;<br />}
3. 代碼下載
完整項目原始碼:>>點擊進入下載頁<<
4. 補充內容
無