OpenGL研究2.0 圓計算方法

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正多邊形,基本符合圓的需求了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章