OpenGL研究2.0 圓計算方法
DionysosLai2014-06-18
在遊戲中,經常有些地方涉及到一些圓的軌跡計算,比方一些轉軸類的遊戲,人物一般在角色轉軸上面運動。這時,我們就要時刻計算角色的位置。分析一下,圓位置的一般算法。
首先,如下圖的一個圓:
圖1
根據對稱性原理,我們只需要計算黑色區域的點集合即可。同時,由於黑色區域的圓的切線斜率明顯在-1到0,這點就可以和前面一節線段的計算方法相結合了。
圓的點計算方法:
1. 直接計算方法
1). 離散點計算法
利用隱函數公式方法:;
2). 三角函數方法
這兩個方法,明顯都涉及到了三角函數、開根號等一些比較複雜的計算方法,運算量比較大。
2. 中點運算方法
思想:圓的正負性劃分:,將點(x,y)帶入F(x,y)中,則:
F(x,y)>0---->圓外面的點,F(x,y)=0---->圓上的點,F(x,y)<0---->圓裏面的點。
運算:
在圖1中,黑色區域的x值變化率大於y,切線斜率在-1到0之間,取x遞增1。則
和的關係如下圖所示:
對於點,要麼在點E或者在點SE。
基本原理:
對於點的下一個點間的線段中點M=(xi+1,yi-0.5),將點M帶入F(x,y)方程中,如果F(M)<=0, 說明點M在圓內,則點取點E,反之取點SE。
數學計算:
假設di=F(M),那麼下一個點的d值如下所示:
1) 如果di<=0,則取E點,即,因此
2) 如果di>0,則取SE點,即,因此
3) 那麼對於d0,值爲多少呢?有計算式可知:
4) 綜上,我們有如下關係:
代碼如下:
void midCircle(int x0, int y0, int R)
{
/*只畫1/8圓*/
int d0, d1, d2,x,y,xEnd;
d0 = 1.25-R;
x = x0;
y = y0-R;
xEnd = x0+sqrt(2)/2.f*R;
SetPixel(x,y);
while(x<xEnd)
{
if(d0<=0)
{
d0 = d0+x+x+3;
}
else
{
y = y -1;
d0 = d0+x+x-y-y+5;
}
x = x+1;
}
}
3. 正內多邊形迫近法
基本原理:通過內接多邊形不斷的逼近一個圓:
計算公式:
一般,只要你內接多邊形邊數越大,就越接近圓了。曾經試過100正多邊形,基本符合圓的需求了。