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

每天一个OpenGL程序 第二篇 点的绘制

2013-08-22 02:18 489 查看


#include <windows.h>

#include <gl/gl.h>

#include <gl/glut.h>

#include <math.h>

/*

* 练习2.1

* 绘制点的学习,弹簧路径的绘制

*/

//定义常量PI

#define GH_PI 3.1415926f

//屏幕宽度,屏幕高度

GLfloat winWidth,winHeight;

//声明一个渲染函数

void ghRender(void);

//声明一个尺寸改变回调函数

void ghReshape(int width,int height);

//声明初始化gl操作

void initGL();

void main()

{

// 单缓冲模式 和RGB颜色模式

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

//创建一个Windows窗口,用于gl绘制

glutCreateWindow("Bounce");

//设置显示回调函数

glutDisplayFunc(ghRender);

//设置windows窗口尺寸改变回调函数

glutReshapeFunc(ghReshape);

//初始化操作

initGL();

//进入循环等待事件发生

glutMainLoop();

}

void initGL()

{

//绘制背景色为蓝色

glClearColor(0.0f,0.0f,0.0f,1.0f);

}

GLfloat xRot = 20.f,yRot = 20.f;

//当windows窗口尺寸改变时,将调用

void ghReshape(int width,int height)

{

if (height == 0)

{

height = 1;

}

//设置可绘制区域

glViewport(0,0,width,height);

//设置当前矩阵为投影矩阵

glMatrixMode(GL_PROJECTION);

//重置当前矩阵为单位矩阵

glLoadIdentity();

//宽度为250,高度自适应

if(width <= height)

{

winHeight = 250.0f * height / width;

winWidth = 250.0f;

}

else

{

winWidth = 250.0f * width / height;

winHeight = 250.0f;

}

//构建三维坐标系

glOrtho(-winWidth,winWidth,-winHeight,winHeight,-winWidth,winWidth);

//设定当前矩阵为视景矩阵

glMatrixMode(GL_MODELVIEW);

//

glLoadIdentity();

}

void ghRender()

{

GLfloat x,y,z,angle;

//清理颜色缓冲

glClear(GL_COLOR_BUFFER_BIT);

//设定画笔颜色

glColor3f(0.0f,0.0f,1.0f);

glPushMatrix();

//绕着x轴旋转xRot度

glRotatef(xRot,1.0f,0.0f,0.0f);

//绕着y轴旋转yRot度

glRotatef(yRot,0.0f,1.0f,0.0f);

//开始绘制点

glBegin(GL_POINTS);

z = -50.0f;

for (angle = 0.0f;angle <= (2.0f * GH_PI)*3.0f;angle += 0.1f)

{

x = 50.0f * sin(angle);

y = 50.0f * cos(angle);

//绘制三维点

glVertex3f(x,y,z);

z += 0.5f;

}

//结束绘制

glEnd();

//

glPopMatrix();

//交换缓冲区的值

glutSwapBuffers();

//刷新

glFlush();

}

/*

重要API

1、glPushMatrix (void);

将当前矩阵压入矩阵堆栈,以便于popMatrix时候,将矩阵回复

2、glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

将当前矩阵乘以旋转矩阵,绕一个矢量逆时针旋转,这个矢量起点是原点,终点是(x,y,z)。

当前矩阵会变成旋转后的矩阵,该函数有很多变种。

angle 旋转角度

x,y,z 矢量的终点,与起点原点共同形成矢量旋转轴

3、glBegin (GLenum mode);

用于标出定点组的开始,与glEnd搭配使用。之间只允许使用以下函数:glVertex系列,

glNormal,glEvalCoord系列,glCallList,glCallLists,glTexCoord系列,glEdgeFlag以及glMaterial

参数

mode 表示要绘制的图元类型,其可以选以下值

GL_POINTS 点

GL_LINES 线

GL_LINE_STRIP

GL_LINE_LOOP

GL_TRIANGLES 三角形

GL_TRIANGLE_STRIP

GL_TRIANGLE_FAN

GL_GUADS 四边形

GL_GUAD_STRIP

GL_POLYGON 凸多边形

4、glVertex3f (GLfloat x, GLfloat y, GLfloat z);

指定一个3D坐标,不能再glBegin/glEnd之外使用,其有很多变种。

参数

x,y,z 坐标值

5、glEnd (void);

终止顶点列表的记录,与glBegin搭配使用

6、glPopMatrix (void);

弹出最后压入的矩阵,将当前矩阵设为弹出的矩阵

*/



#include <windows.h>

#include <gl/gl.h>

#include <gl/glut.h>

#include <math.h>

/*

* 练习2.2

* 绘制点的学习,Sierpinski垫片的绘制

*/

//屏幕宽度,屏幕高度

GLfloat winWidth,winHeight;

typedef struct{int x;int y;} Point;

Point PointMake(int x,int y)

{

Point p = {x,y};

return p;

}

//声明一个渲染函数

void ghRender(void);

//声明一个尺寸改变回调函数

void ghReshape(int width,int height);

//声明初始化gl操作

void initGL();

void main()

{

// 单缓冲模式 和RGB颜色模式

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

//创建一个Windows窗口,用于gl绘制

glutCreateWindow("Bounce");

//设置显示回调函数

glutDisplayFunc(ghRender);

//设置windows窗口尺寸改变回调函数

glutReshapeFunc(ghReshape);

//初始化操作

initGL();

//进入循环等待事件发生

glutMainLoop();

}

//绘制点

void DrawPoint(Point p)

{

glBegin(GL_POINTS);

glVertex2i(p.x,p.y);

glEnd();

}

//sierpinski_render

void Drawsierpinski(Point t[3])

{

glClear(GL_COLOR_BUFFER_BIT);

//随机选一个

int index = rand() % 3;

Point point = t[index];

DrawPoint(point);

for (int i = 0; i < 55000;i++)

{

index = rand()%3;

point.x = (point.x + t[index].x) / 2;

point.y = (point.y + t[index].y) / 2;

DrawPoint(point);

}

}

/*

Sierpinski垫片绘制算法

1、选择三个点P0,P1,P2构成三角形

2、从1中的三个点随机选出一个点,计为S0

3、随机选择1中的三个点,计为T

4、S(k)为S(k-1)和T的中点

5、绘制Sk

进行N次迭代即可

*/

void initGL()

{

//绘制背景色为蓝色

glClearColor(0.0f,0.0f,0.0f,1.0f);

}

//当windows窗口尺寸改变时,将调用

void ghReshape(int width,int height)

{

if (height == 0)

{

height = 1;

}

//设置可绘制区域

glViewport(0,0,width,height);

//设置当前矩阵为投影矩阵

glMatrixMode(GL_PROJECTION);

//重置当前矩阵为单位矩阵

glLoadIdentity();

//宽度为250,高度自适应

if(width <= height)

{

winHeight = 250.0f * height / width;

winWidth = 250.0f;

}

else

{

winWidth = 250.0f * width / height;

winHeight = 250.0f;

}

//构建三维坐标系

glOrtho(-winWidth,winWidth,-winHeight,winHeight,-winWidth,winWidth);

//设定当前矩阵为视景矩阵

glMatrixMode(GL_MODELVIEW);

//

glLoadIdentity();

}

void ghRender()

{

GLfloat x,y,z,angle;

//清理颜色缓冲

glClear(GL_COLOR_BUFFER_BIT);

//设定画笔颜色

glColor3f(0.0f,0.0f,1.0f);

Point p1 = PointMake(-250,-250);

Point p2 = PointMake(200,200);

Point p3 = PointMake(200,-250);

Point points[3];

points[0] = p1;

points[1] = p2;

points[2] = p3;

Drawsierpinski(points);

//交换缓冲区的值

glutSwapBuffers();

//刷新

glFlush();

}



#include <windows.h>

#include <gl/gl.h>

#include <gl/glut.h>

#include <math.h>

/*

* 练习2.3

* 绘制点的学习,数学函数的绘制

*/

//PI

#define PI 3.1415926

//声明一个渲染函数

void ghRender(void);

//声明初始化gl操作

void initGL();

//定义ABCD

GLdouble A,B,C,D;

void main()

{

// 单缓冲模式 和RGB颜色模式

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

// 设定窗口位置

glutInitWindowPosition(100,150);

// 设定窗口大小

glutInitWindowSize(640,480);

//创建一个Windows窗口,用于gl绘制

glutCreateWindow("数学函数");

//设置显示回调函数

glutDisplayFunc(ghRender);

//初始化操作

initGL();

//进入循环等待事件发生

glutMainLoop();

}

/*

重要API

1、glutInitWindowPosition(int x, int y);

初始化窗口位置

参数:

x,y 窗口位置

2、glutInitWindowSize(int width, int height);

初始化窗口大小

参数:

width,height 窗口大小

*/

void initGL()

{

//绘制背景色为蓝色

glClearColor(0.0f,0.0f,0.0f,1.0f);

//设定画笔颜色

glColor3f(0.0f,0.0f,1.0f);

//设置点的大小

glPointSize(2.0);

//设置当前矩阵

glMatrixMode(GL_PROJECTION);

//

glLoadIdentity();

//建立二维坐标系

gluOrtho2D(0.0,640.0,0.0,480.0);

//

A = 640 / 4.0;

B = 0.0;

C = D = 480 / 2.0;

}

/*

重要API

1、glPointSize(GLfloat size);

设置点大小

参数:

size 点的大小

2、gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

定义二维正射投影,该矩阵的,near和far分别为0和1,相当于建立二维坐标系

参数:

left,right x取到的最小值和最大值

bottom,top y取到的最小值和最大值

*/

void ghRender()

{

//清理颜色缓冲

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

//绘制 e^(-x) * cos(2*pi*x)图像

for(GLdouble x = 0 ; x < 4.0; x += 0.005)

{

GLdouble y = exp(-x) * cos(2 * PI * x);

glVertex2d(A * x + B, C * y + D);

}

glEnd();

//刷新

glFlush();

}

/*

重要API

1、glVertex2d (GLdouble x, GLdouble y);

定义一个二维顶点

参数:

x,y二维顶点坐标

延伸:

gl的函数一般都有一个固定的形式,有很多函数都是一类的,我们可以将其拆分而得之它的意思

例如:

glVertex2d ----> gl Vertex 2 d

gl表示gl前缀,所引用的库,类比的有glu和glut

Vertex部分表示一种功能的描述,这里就是顶点

2代表参数个数

d代表参数类型为double

类似的有 glVertex3f 表示三个float参数的顶点

glColor3f 表示三个float参数的颜色

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: