每天一个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参数的颜色
*/
相关文章推荐
- 每天一个OpenGL程序 第四篇 三角形的绘制
- 每天一个OpenGL程序 第五篇 四边形的绘制
- 每天一个OpenGL程序 第六篇 图形的组合绘制
- 每天一个OpenGL程序 第三篇 线的绘制
- OpenGL(一)二维图形的绘制:一个简单的绘制矩形程序
- 一个简单的OpenGL程序,绘制一个白色正方形
- 每天一个OpenGL程序,第一篇弹性的小矩形
- 编写一个基于OpenGL的程序,绘制一个三角形,并分别绘制这个三角形经旋转、平移、缩放后的结果
- 下载了一个GlobalTime的程序,导入之后发现找不到android.opengl.Object3D;android.pim.DateUtils;这两个类
- Python 练习册,每天一个小程序(0007)
- Opengl学习程序之绘制命令
- 如何用python编写一个绘制马赛克图像的自写程序mask = np.zeros
- Python 练习册,每天一个小程序
- 每天一个java小程序-8
- OpenGL入门(二):绘制一个点
- OpenGL学习程序,创建一个3D的三角椎体和正方体并旋转
- java练习题,每天一个java小程序-1…
- OpenGL:绘制一个旋转的正方形
- 每天一个小程序(14)——交换排序之双向冒泡排序
- 微信小程序例子——使用画布组件绘制一个长200px,宽100px的长方形