您的位置:首页 > 运维架构

OpenGL研究2.0 计算圆

2015-09-24 08:29 218 查看
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多边形,在同一轮的需求线。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: