OpenGL研究2.0 计算圆

DionysosLai2014-06-18

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

分析一下。圆位置的一般算法。

首先。例如以下图的一个圆:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

图1

依据对称性原理,我们仅仅须要计算黑色区域的点集合就可以。同一时候,因为黑色区域的圆的切线斜率明显在-1到0,这点就能够和前面一节线段的计算方法相结合了。

圆的点计算方法:

1.      直接计算方法

1). 离散点计算法

利用隐函数公式方法:

2). 三角函数方法

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

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

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,则

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >取E点,即

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >。因此

2)  假设di>0,则

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >取SE点,即

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >,因此

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

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

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

计算公式:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGlvbnlzb3NfbGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

一般。仅仅要你内接多边形边数越大。就越接近圆了。我努力了100多边形,在同一轮的需求线。

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

时间: 2024-12-28 00:42:25

OpenGL研究2.0 计算圆的相关文章

OpenGL研究2.0 圆计算方法

DionysosLai2014-06-18 在游戏中,经常有些地方涉及到一些圆的轨迹计算,比方一些转轴类的游戏,人物一般在角色转轴上面运动.这时,我们就要时刻计算角色的位置.分析一下,圆位置的一般算法. 首先,如下图的一个圆: 图1 根据对称性原理,我们只需要计算黑色区域的点集合即可.同时,由于黑色区域的圆的切线斜率明显在-1到0,这点就可以和前面一节线段的计算方法相结合了. 圆的点计算方法: 1.      直接计算方法 1). 离散点计算法 利用隐函数公式方法:: 2). 三角函数方法 这两

Opengl研究4.0 走样与反走样

DionysosLai([email protected]) 2014-06-25 走样与反走样,也叫混淆与反混淆.所谓走样,是由于使用离散量(像素)表示连续量(图形)而引起的失真. 走样现象: 1.      阶梯状的图形边界 如图所示: 由于像素点是一块一块的,存在锯齿状. 2.       图形细节失真 由于显示图形的最小单位为像素,像素是由宽度的.有时候,我们可能显示的线段比像素要窄,要小.那么可能出现两种情况:a. 如果显示的线段宽度比像素宽度小一点,将被保留:b. 如果线段很细,就不

OpenGL研究3.0 多边形区域填充

DionysosLai([email protected])2014-06-22 所谓多边形区域填充.就是将多边形内部区域,所有已相同色块填充.注意:这里讨论的多边形是简单多边形(即不考虑诸如五角星这样的相交多边形).简单多边形,分为凹多边形和凸多边形. 多边形区域填充有下面几种方法: 1.      逐点扫描方法: 原理:扫描多边形区域,逐点推断点是否在多边形内. 难点:在于怎样推断点是否在区域内; 经常使用怎样推断点是否在区域内方法:射线法.面积法. 面积法原理:取一个点.连接多边形各个点,

对用OpenGL ES 2.0实现OpenGL ES 1.1的顶点着色器的研究

对用OpenGL ES 2.0实现OpenGL ES 1.1的顶点着色器的研究 想要彻底研究OpenGL ES 2.0与前一代OpenGL的区别,还是要费很大一番精力的.最近在仔细研读<OpenGL ES 2.0 Programming Guide>,虽然这本书最早出版日期是2008年,距今已经7年了,而著作的日期或许还要早上半年到1年,但是目前OpenGL ES 2.0是主流三维开发框架,因此这本书的知识直到现在,依然受用. OpenGL ES 2.0是桌面版OpenGL 2.0的一个子集,

Chapter 1 : OpenGLES 3.0 简介 (2)—— OpenGL ES 3.0

管道 如前所属,本书讲解的API版本是OpenGL ES 3.0.本书的目标是,深入讲解OpenGL ES 3.0的技术细节,给出具体的例子来说明如何使用某个特性,并且讨论了各种性能优化技术.当您读完这本书,您应该可以对OpenGL ES 3.0API有一个很好的把握.您将可以轻松的写出让人新服的OpenGL ES 3.0的应用程序,并且您不必通过阅读多种OpenGL ES的规范来搞懂某个特性是如何工作的. OpenGL ES 3.0实现了可编程着色图形管道.OpenGL ES 3.0规范包含两

OpenGL ES 2.0基本概念

1. OpenGL ES 2.0可编程管道 OpenGL负责把三维空间中的对象通过投影.光栅化转换为二维图像,然后呈现到屏幕上. 上图黄色部分(Vertex Shader和Fragment Shader)为此管道的可编程部分.整个管道包含以下两个规范: 1) OpenGL ES 2.0 API specification 2) OpenGL ES Shading Language Specification (OpenGL ES SL) 详细流程图如下: 此流程把三维数据变换为可以显示的二维数据

OpenGL ES 3.0 点,线,三角形绘制形式总结

OpenGL ES 3.0 顶点     -1,  1, 0, -0.5f,  0, 0,     0, -1, 0,    -1,  0, 0, 0.5f,   0, 0,     1, -1,  0 顶点设置成了大小20 public static final String vertex3 = "#version 300 es \n" + "uniform mat4 uMVPMatrix;\n" + "layout(location = 0) in v

OpenGL ES 2.0 渲染管线 学习笔记

图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源,这时渲染管线的顶点输入,通常使用 Buffer objects效率更好. Vertex Shader 顶点着色器通过矩阵变换位置.计算照明公式来生成逐顶点颜色已经生成或变换纹理坐标等基于顶点的操作. Primitive Assembly 图元装配经过着色器处理之后的顶点在图片装配阶段被装配为基本图元

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范.下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段. 1. 顶点着色器(VertexShader) 顶点着色器对顶点实现了一种通用的可编程方法. 顶点着色器的输入数据由下面组成: Attributes:使