我目前正在研究處理(如在語言中)的草圖,這是由海龜邏輯驅動的(請參閱https://en.wikipedia.org/wiki/Turtle_graphics)。這意味着我從當前座標畫出一條直線到一個提供的座標。這個提供的座標將成爲新的當前座標。我想近似一個圓,並使用三角函數寫了一段簡單的代碼。代碼如下所示:在烏龜程序中畫一個圓圈
void drawCircle(int radius){
// The circle center is radius amount to the left of the current xpos
int steps = 16;
double step = TWO_PI /steps;
for(double theta = step; theta <= TWO_PI; theta += step){
float deltaX = cos((float)theta) - cos((float)(theta - step));
float deltaY = sin((float)theta) - sin((float)(theta - step));
moveXY(deltaX*radius, deltaY*radius);
}
}
程序邏輯很簡單。它將使用變量theta
循環遍歷所有弧度。步驟數量將指示每個theta
塊的大小。然後它將計算由theta支配的圓圈中特定點的x,y值。然後它將扣除前一週期的x,y值(因此爲theta-step
),以獲得從該位置移動到達所需x,y位置的數量。它將最終將這些delta值提供給moveXY函數,該函數從當前點到提供的值繪製一條線,並將它們作爲新的當前位置。
該程序似乎工作得很好,當使用有限的步驟。但是,當步數增加時,圓圈變得越來越像斐波納契螺線。我的猜測是,這是由於浮點數和正弦和餘弦計算的不精確性,並且這與每次迭代相加。
我是否解釋過錯誤?我期待着最終將此代碼移植到Javascript中,所以我正在尋找設計中的解決方案。使用BigDecimal可能無法正常工作,特別是因爲它不包含自己的餘弦函數和正弦函數。我已經包含了幾張圖片來詳細說明問題。任何幫助深表感謝!
步數16:
步數32:
步數64:
步驟計數128:
位置變量被存儲爲int,並且這導致了偏差。將其切換到浮動狀態後,錯誤得到糾正。我所有的圈子都是完美的! – Diaita