码迷,mamicode.com
首页 > 其他好文 > 详细

OpenGL研究2.0 圆计算方法

时间:2014-06-22 18:03:14      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:图形   数学计算   算法   opengl   

OpenGL研究2.0 圆计算方法

DionysosLai2014-06-18

         在游戏中,经常有些地方涉及到一些圆的轨迹计算,比方一些转轴类的游戏,人物一般在角色转轴上面运动。这时,我们就要时刻计算角色的位置。分析一下,圆位置的一般算法。

         首先,如下图的一个圆:

bubuko.com,布布扣

图1

         根据对称性原理,我们只需要计算黑色区域的点集合即可。同时,由于黑色区域的圆的切线斜率明显在-1到0,这点就可以和前面一节线段的计算方法相结合了。

         圆的点计算方法:

1.      直接计算方法

          1). 离散点计算法

          利用隐函数公式方法:bubuko.com,布布扣

          2). 三角函数方法bubuko.com,布布扣

          这两个方法,明显都涉及到了三角函数、开根号等一些比较复杂的计算方法,运算量比较大。

2.      中点运算方法

         思想:圆的正负性划分:,将点(x,y)带入F(x,y)中,则:bubuko.com,布布扣

          F(x,y)>0---->圆外面的点,F(x,y)=0---->圆上的点,F(x,y)<0---->圆里面的点。

          运算:

          在图1中,黑色区域的x值变化率大于y,切线斜率在-1到0之间,取x递增1。则bubuko.com,布布扣

           和bubuko.com,布布扣的关系如下图所示:

bubuko.com,布布扣

        对于点bubuko.com,布布扣,要么在点E或者在点SE。

        基本原理:

        对于点bubuko.com,布布扣的下一个点bubuko.com,布布扣间的线段中点M=(xi+1,yi-0.5),将点M带入F(x,y)方程中,如果F(M)<=0, 说明点M在圆内,则点bubuko.com,布布扣取点E,反之取点SE。    

        数学计算:

       假设di=F(M),那么下一个点bubuko.com,布布扣的d值如下所示:

      1)  如果di<=0,则bubuko.com,布布扣取E点,即bubuko.com,布布扣,因此

bubuko.com,布布扣

      2)  如果di>0,则bubuko.com,布布扣取SE点,即bubuko.com,布布扣,因此

bubuko.com,布布扣

      3)   那么对于d0,值为多少呢?有计算式可知:

bubuko.com,布布扣

      4)  综上,我们有如下关系:

bubuko.com,布布扣

      代码如下:

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.      正内多边形迫近法

         基本原理:通过内接多边形不断的逼近一个圆:

bubuko.com,布布扣

         计算公式:

bubuko.com,布布扣

 

           一般,只要你内接多边形边数越大,就越接近圆了。曾经试过100正多边形,基本符合圆的需求了。



OpenGL研究2.0 圆计算方法,布布扣,bubuko.com

OpenGL研究2.0 圆计算方法

标签:图形   数学计算   算法   opengl   

原文地址:http://blog.csdn.net/dionysos_lai/article/details/32197177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!