從零實現3D映像引擎:(4)三角函數庫

來源:互聯網
上載者:User

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. 補充內容

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.