• 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多边形,在同一轮的需求线。



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    pipeline+sonar
    ThinkPHP 3.2.3 使用 PHPExcel 处理 Excel 表格
    mac下finder子目录直接打开终端
    golang之交叉编译设置
    cocos2dx 3.0 编译工程
    2dx 3.0环境配置(mac)
    golang调用动态库
    qt下用启动图
    qt在动态库里面加载widget的例子
    qt笔记
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4834150.html
Copyright © 2020-2023  润新知