OpenGL(二)——绘直线以及分析绘直线的算法

绘直线以及分析绘直线的算法:

1、在窗口指定位置画点

glBegin(GL_POINTS);
glEnd();
使用glBegin()和glEnd()方法向窗口中添加图形。要添加点时,glBegin()函数里的参数填GL_POINTS。然后通过glVertex3f()函数在指定的(坐标)位置画点,如:glVertex3f(100.0f, 100.0f, 0.0f);三个参数分别表示x,y,z坐标。

glBegin(GL_POINTS);
glVertex3f(100.0f, 100.0f, 0.0f);
glVertex3f(100.0f, 200.0f, 0.0f);
glVertex3f(200.0f, 100.0f, 0.0f);
glVertex3f(200.0f, 200.0f, 0.0f);
glEnd();

默认情况下点的大小时一个像素点,在画点之前可以通过函数glPointSize(5.0f)来修改点的大小。
如:

#include <windows.h>
#include <gl/glut.h>
//显示回调函数
void renderScene()
{
    //用当前清除色清除颜色缓冲区,即设定窗口的背景色
    glClear(GL_COLOR_BUFFER_BIT);
    //设置当前绘图使用的RGB的颜色(红)
    glColor3f(1.0f, 1.0f, 0.0f);
    //默认情况下点的大小时一个像素点,这里改为5便于观察
    glPointSize(5.0f);
    //glBegin的参数指定绘制图元的类型,GL_POINTS表示的是这个序列中绘制的是单个的点。
    glBegin(GL_POINTS);
    //点的坐标
    glVertex3f(100.0f, 100.0f, 0.0f);
    glVertex3f(100.0f, 200.0f, 0.0f);
    glVertex3f(200.0f, 100.0f, 0.0f);
    glVertex3f(200.0f, 200.0f, 0.0f);
    glEnd();
    //刷新
    glFlush();
}
//主函数
void main()
{
    //初始化GLUT库OpenGL窗口的显示模式
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    // 初始化GLUT库OpenGL窗口的大小
    glutInitWindowSize(300, 300);
    //初始化GLUT库OpenGL窗口的位置
    glutInitWindowPosition(200, 200);
    //初始化GLUT库OpenGL窗口的名字
    glutCreateWindow("point");
    // 注册 OpenGL 绘图函数(一种特殊的调用方式),设置当前窗口的显示回调函数
    glutDisplayFunc(renderScene);
    //建立修剪空间的范围
    glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0f, -1.0f);
    //定义清除色
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    // 进入 GLUT 消息循环,开始执行程序
    glutMainLoop();
}

这里写图片描述

2、画直线

(1)GL_LINES画法:
与画点相似,画直线时在函数glBegin(GL_LINES)中给的参数是GL_LINES,这种画直线的方法是,通过在glBegin和glEnd之间添加偶数个点,第2n和第2n+1个点之间是一条连线,如果添加的点的个数是奇数,那最后一个点时多余的。例如:

#include <windows.h>
#include <gl/glut.h>
//显示回调函数
void renderScene()
{
    //用当前清除色清除颜色缓冲区,即设定窗口的背景色
    glClear(GL_COLOR_BUFFER_BIT);
    //设置当前绘图使用的RGB的颜色(红)
    glColor3f(1.0f, 1.0f, 0.0f);
    //默认情况下线的大小时一个像素点,这里改为5便于观察
    glLineWidth(5.0f);
    //glBegin的参数指定绘制图元的类型,GL_LINES表示的是这个序列中绘制的是直线
    glBegin(GL_LINES);
    //点的坐标
    glVertex3f(100.0f, 100.0f, 0.0f);
    glVertex3f(100.0f, 200.0f, 0.0f);
    glVertex3f(200.0f, 100.0f, 0.0f);
    glVertex3f(200.0f, 200.0f, 0.0f);
    //因为是奇数点所以最后一个点是多余的
    glVertex3f(250.0f, 250.0f, 0.0f);
    glEnd();
    //刷新
    glFlush();
}
//主函数
void main()
{
    //初始化GLUT库OpenGL窗口的显示模式
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    // 初始化GLUT库OpenGL窗口的大小
    glutInitWindowSize(300, 300);
    //初始化GLUT库OpenGL窗口的位置
    glutInitWindowPosition(200, 200);
    //初始化GLUT库OpenGL窗口的名字
    glutCreateWindow("line");
    // 注册 OpenGL 绘图函数(一种特殊的调用方式),设置当前窗口的显示回调函数
    glutDisplayFunc(renderScene);
    //建立修剪空间的范围
    glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0f, -1.0f);
    //定义清除色
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    // 进入 GLUT 消息循环,开始执行程序
    glutMainLoop();
}

这里写图片描述
(2)GL_LINE_STRIP画法:
这种画直线方法叫做折线画法,该方法与第一种方法类似。不同的地方第一个点和第二个点连线,第二个点和第三个点连线…第n个点和第n+1个连线。

#include <windows.h>
#include <gl/glut.h>
//显示回调函数
void renderScene()
{
    //用当前清除色清除颜色缓冲区,即设定窗口的背景色
    glClear(GL_COLOR_BUFFER_BIT);
    //设置当前绘图使用的RGB的颜色(黄)
    glColor3f(1.0f, 1.0f, 0.0f);
    //默认情况下线的大小时一个像素点,这里改为5便于观察
    glLineWidth(5.0f);
    //glBegin的参数指定绘制图元的类型,GL_LINE_STRIP表示的是这个序列中绘制的是直线
    glBegin(GL_LINE_STRIP);
    //点的坐标
    glVertex3f(100.0f, 100.0f, 0.0f);
    glVertex3f(100.0f, 200.0f, 0.0f);
    glVertex3f(200.0f, 100.0f, 0.0f);
    glVertex3f(200.0f, 200.0f, 0.0f);
    glVertex3f(250.0f, 250.0f, 0.0f);
    glEnd();
    //刷新
    glFlush();
}
//主函数
void main()
{
    //初始化GLUT库OpenGL窗口的显示模式
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    // 初始化GLUT库OpenGL窗口的大小
    glutInitWindowSize(300, 300);
    //初始化GLUT库OpenGL窗口的位置
    glutInitWindowPosition(200, 200);
    //初始化GLUT库OpenGL窗口的名字
    glutCreateWindow("line");
    // 注册 OpenGL 绘图函数(一种特殊的调用方式),设置当前窗口的显示回调函数
    glutDisplayFunc(renderScene);
    //建立修剪空间的范围
    glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0f, -1.0f);
    //定义清除色
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    // 进入 GLUT 消息循环,开始执行程序
    glutMainLoop();
}

这里写图片描述

3、画虚线

在glBegin()函数前面调用
glEnable(GL_LINE_STIPPLE);
glLineStipple(factor, 0x5555);
其中glEnable(GL_LINE_STIPPLE)表示启用虚线模式,glLineStipple为画虚线的规则。关于glLineStipple函数的解释
viod glLineStipple(GLint factor,GLshort pattern);
OpenGL中设置直线的当前点画模式。pattern参数是由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。为了禁用直线点画功能,可以向glDisable()函数传递同一个参数。
例如:
glLineStipple(1, Ox3F07);
glEnable(GL_LINE_STIPPLE);
此时模式为Ox3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先连续绘制3个像素,然后连续5个像素留空,再连续绘制6个像素,最后两个像素留空(注意,首先是从低位开始的)。如果factor是2,那么这个模式便被扩展为:先连续绘制6个像素,然后连续10个像素留空,再连续绘制12个像素,最后4个像素留空。
如果没有启用点画线功能,OpenGL会自动把pattern当做为OxFFFF,把factor当成1。

代码如下:

#include <windows.h>
#include <gl/glut.h>
//画虚线
void renderScene()
{
    //定义重复因子
    GLint factor = 5;
    //用当前清除色清除颜色缓冲区,即设定窗口的背景色
    glClear(GL_COLOR_BUFFER_BIT);
    //设置当前绘图使用的RGB的颜色(黄)
    glColor3f(1.0f, 1.0f, 0.0f);
    //默认情况下线的大小时一个像素点,这里改为5便于观察
    glLineWidth(5.0f);
    //表示启用虚线模式
    glEnable(GL_LINE_STIPPLE);
    //表示重复因子
    glLineStipple(factor, 0x5555);
    //点的坐标
    glBegin(GL_LINES);
    glVertex2f(100.0f, 100.0f);
    glVertex2f(100.0f, 200.0f);
    glVertex2f(200.0f, 100.0f);
    glVertex2f(200.0f, 200.0f);
    glEnd();
    //刷新
    glFlush();
}
//主函数
void main()
{
    //初始化GLUT库OpenGL窗口的显示模式
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    // 初始化GLUT库OpenGL窗口的大小
    glutInitWindowSize(300, 300);
    //初始化GLUT库OpenGL窗口的位置
    glutInitWindowPosition(200, 200);
    //初始化GLUT库OpenGL窗口的名字
    glutCreateWindow("line");
    // 注册 OpenGL 绘图函数(一种特殊的调用方式),设置当前窗口的显示回调函数
    glutDisplayFunc(renderScene);
    //建立修剪空间的范围
    glOrtho(0.0f, 300.0f, 0.0f, 300.0f, 1.0f, -1.0f);
    //定义清除色
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    // 进入 GLUT 消息循环,开始执行程序
    glutMainLoop();
}

这里写图片描述

4、总结

通过画点,画线,画线段函数的学习,我现在可以画出任意图形,但是有特别重要的一点,怎么计算坐标,即移动的步长,我们可以结合数学知识来解答,即直线的话,求出斜率,每次X,Y的坐标值成比例相加即可,为了程序的复杂度降低,可以定义一个变量,来存储斜率值,每次调用相加即可,而不用每次调用都要计算。

老铁们下周再见!

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值