OpenGL研究2.0 计算圆
2015-09-24 08:29
218 查看
OpenGL研究2.0 计算圆
DionysosLai2014-06-18
在游戏中。常常有些地方涉及到一些圆的轨迹计算,例如一些转轴类的游戏,人物一般在角色转轴上面运动。这时,我们就要时刻计算角色的位置。
分析一下。圆位置的一般算法。
首先。例如以下图的一个圆:
![](http://img.blog.csdn.net/20140618232302906?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1
依据对称性原理,我们仅仅须要计算黑色区域的点集合就可以。同一时候,因为黑色区域的圆的切线斜率明显在-1到0,这点就能够和前面一节线段的计算方法相结合了。
圆的点计算方法:
1. 直接计算方法
1). 离散点计算法
利用隐函数公式方法:
![](http://img.blog.csdn.net/20140618232656656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
;
2). 三角函数方法
![](http://img.blog.csdn.net/20140618232727109?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这两个方法。明显都涉及到了三角函数、开根号等一些比較复杂的计算方法,运算量比較大。
2. 中点运算方法
思想:圆的正负性划分:,将点(x,y)带入F(x,y)中。则:
![](http://img.blog.csdn.net/20140618232739781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
F(x,y)>0---->圆外面的点。F(x,y)=0---->圆上的点,F(x,y)<0---->圆里面的点。
运算:
在图1中,黑色区域的x值变化率大于y,切线斜率在-1到0之间,取x递增1。则
![](http://img.blog.csdn.net/20140618232812109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
和
![](http://img.blog.csdn.net/20140618232825062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
的关系例如以下图所看到的:
![](http://img.blog.csdn.net/20140618232940078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
对于点
![](http://img.blog.csdn.net/20140618232825062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
。要么在点E或者在点SE。
基本原理:
对于点
![](http://img.blog.csdn.net/20140618232812109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
的下一个点
![](http://img.blog.csdn.net/20140618232825062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
间的线段中点M=(xi+1,yi-0.5),将点M带入F(x,y)方程中,假设F(M)<=0,
说明点M在圆内,则点
![](http://img.blog.csdn.net/20140618232825062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
取点E,反之取点SE。
数学计算:
如果di=F(M),那么下一个点
![](http://img.blog.csdn.net/20140618233237046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
的d值例如以下所看到的:
1) 假设di<=0,则
![](http://img.blog.csdn.net/20140618232825062?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
取E点,即
![](http://img.blog.csdn.net/20140618233352296?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
。因此
![](http://img.blog.csdn.net/20140618233425046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2) 假设di>0,则
![](http://img.blog.csdn.net/20140618232825062?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
取SE点,即
![](http://img.blog.csdn.net/20140618233537171?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,因此
![](http://img.blog.csdn.net/20140618233609953?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3) 那么对于d0,值为多少呢?有计算式可知:
![](http://img.blog.csdn.net/20140618233643515?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4) 综上。我们有例如以下关系:
![](http://img.blog.csdn.net/20140618233714343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码例如以下:
3. 正内多边形迫近法
基本原理:通过内接多边形不断的逼近一个圆:
![](http://img.blog.csdn.net/20140618234056125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
计算公式:
![](http://img.blog.csdn.net/20140618234144906?<br/><br/>watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
一般。仅仅要你内接多边形边数越大。就越接近圆了。我努力了100多边形,在同一轮的需求线。
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多边形,在同一轮的需求线。
相关文章推荐
- 每天一个linux命令(7):mv命令
- 工欲善其事,必先利其器。一个强大的开发环境可以大大提高工作效率。好吧,我知道这是废话。。。不过,我想一定有很多跟我一样打算进入Linux平台开发的新手,一开始都为找不到一个像Windows下的VS那样
- Attempting to start Apache service...but apache doesn't work
- OpenSSL和OpenSSH
- "Nginx服务器在使用HTML5
- 关于hadoop调度问题
- 安装单机Hadoop时格式化HDFS出现问题
- "Hadoop集群运行时总是抛出Child
- Hadoop的Map和Reduce中能不能打开HDFS文件系统中的文件?
- ecshop的修改版 ectouch 后台管理账号 暴露的漏洞 发送短信
- [DP]10271 - Chopsticks
- 关于弄了一晚上linux到现在的一些事情。
- Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客
- Bash 脚本编写与sed,awk使用
- linux学习之shell基础篇
- centos 6.5 安装mysql
- hive 报错 java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
- Hadoop 2.6.0+Hbase1.12+mahout0.9 集群搭建
- hadoop操作HDFS文件权限问题
- Linux补丁学习笔记