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

来源:互联网 发布:北京程序员工资标准 编辑:程序博客网 时间:2024/05/01 22:09

#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参数的颜色
*/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机QQ浏览器看视频有广告怎么办 手机显示网络连接但不可上网怎么办 华为手机关机后开不了机怎么办 华为畅享8p相机拍照模糊怎么办 手机触屏不准怎么办荣耀青春版九 华为手机锁屏手势密码忘了怎么办 荣耀手机锁屏密码忘了怎么办 华为p20隐私空间密码忘了怎么办 安全管家隐私保护的密码忘了怎么办 华为手机自带截图键删除了怎么办 飞科电吹风吹一会就断电怎么办 住酒店时电吹风吹坏了怎么办 把话费充到停机的号码上去了怎么办 电信手机卡充值了还停机怎么办 电信手机一直没用却欠费了怎么办 苹果se开起4g信号不好怎么办 触屏华为手机充不了电怎么办 华为手机自拍出来的字反向怎么办 华为微信隐藏了怎么弄出来怎么办 酷派手机酷管家密码忘了怎么办 手机磁盘目录不具有读写权限怎么办 魅族手机像素突然变模糊了怎么办 手机忽然所有软件都没了怎么办 魅族读书下架的书怎么办 我的电信大王卡激活了没信号怎么办 三星翻盖手机忘记锁屏密码怎么办 小米2s电信版信号不好怎么办 4s微信版本过低怎么办 换了一个城市牵的电信网线怎么办 联通电话卡注销了里面的钱怎么办 红米4a上网太慢怎么办 华为光猫网线接囗接触不良怎么办? 苹果电信4g信号变3g怎么办 苹果7的4g变3g了怎么办 华为路由器的登录密码忘记了怎么办 华为手机有4g但不能上网怎么办 移动4g 手机开密码忘了怎么办 华为安卓8.0屏幕上圆怎么办 苹果5s不能用4g怎么办 电动车的锁住了钥匙丢了怎么办 小米蓝牙耳机青春版开不了机怎么办