不幸的是,我是一個新手程序員,但是相對有經驗的數學家。平滑循環週期性三角函數
我想開發遊戲,我想我已經幾乎掌握了OpenGL等一些基本線性代數數學。不幸的是,我還沒有技術知識來做圖形模擬。
作爲一項基本練習,我想嘗試模擬一個粒子在圓形路徑中的連續移動。我用簡單的參數化
double t=0;
double x = cos(t), y = sin(t);
我知道,雙有根據微軟的一系列1.7E +/- 308。那麼我的問題就是:「我怎樣才能確保粒子的最光滑的連續循環?」我認爲可能發生的問題是,如果程序運行時間足夠長,則t變得越來越大,我們將達到t將重置爲其最低值並且可能導致「跳轉」粒子的位置。
我想過這個,我想知道是否有必要從[1.7E-308,1.7E + 308)→[0,2π)創建一個映射t。這有助於防止任何位置「跳躍」?或者是否有這樣的問題,我不是預先設定的?我的計劃本來是以預定的速度增加t,我還沒有確定。但是我看到增加的速率決定了座標變化有多快,其中的座標變化有多快。
我認爲使用M_PI來減少手動參數會導致計算出的正弦和餘弦值與sincos(i * angle_increment,&s,&c)相比不斷增加的相移,因爲M_PI只是近似數學π,但取決於用例,這可能無關緊要。 'sin(),cos(),sincos()'的非破壞實現將使用足夠精確的π內部逼近來避免相移問題。 – njuffa
@njuffa你在比較什麼?無論您如何處理此問題,由於浮點精度有限,您都會遇到錯誤。正如我所解釋的那樣,如果「t」值越大,它本身就會失去精度。在某個時刻,當它的精確度大於增量時,它將完全停止增加。這似乎是一個更嚴重的問題。 –
我完全同意,浮點表示的粒度隨着爭論最終導致問題的幅度越來越大而增加。由於提問者使用'double',它會在角度增量之前發生許多角度增量,特別是如果使用乘法來計算角度增量。我的觀點是,通過'M_PI'以上面建議的方式減少手動參數通常不適合使用來自C/C +標準數學庫的正確實現的三角函數,因爲這些函數包括更準確的內部參數減少。 – njuffa