文档章节

VS2012下基于Glut OpenGL绘制直线(添加设置直线宽度)示例程序

小青_1989
 小青_1989
发布于 2014/06/05 14:32
字数 782
阅读 151
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

在VS2012下使用glut绘制一系列直线的示例程序,绘制的是平行的几条直线,每条直线的宽度都不一样,效果如下图所示,按PC的UP,DOWN,LEFT,RIGHT按键可以从不同的角度查看该图形:


[cpp] view plaincopy

  1. // GlutLineswDemo.cpp : 定义控制台应用程序的入口点。  

  2. //  

  3. #include "stdafx.h"  

  4. #include <gl/glut.h>  

  5. #include <math.h>  

  6. //圆周率宏  

  7. #define GL_PI 3.1415f  

  8. //获取屏幕的宽度与高度  

  9. GLint SCREEN_WIDTH=0;  

  10. GLint SCREEN_HEIGHT=0;  

  11. //设置程序的窗口大小  

  12. GLint windowWidth=400;  

  13. GLint windowHeight=300;  

  14. //绕x轴旋转角度  

  15. GLfloat xRotAngle=0.0f;  

  16. //绕y轴旋转角度  

  17. GLfloat yRotAngle=0.0f;  

  18. //受支持的线宽大小范围  

  19. GLfloat width[2];  

  20. //受支持的线宽增量  

  21. GLfloat widthStep;  

  22. //显示回调函数  

  23. void renderScreen(void){  

  24.     GLfloat x,y,z,angle;  

  25.     //当前线的宽度  

  26.     GLfloat curWidth=0.0f;  

  27.     //把整个窗口清理为当前清理颜色:黑色  

  28.     glClear(GL_COLOR_BUFFER_BIT);  

  29.     //将当前Matrix状态入栈  

  30.     glPushMatrix();  

  31.     //坐标系绕x轴旋转xRotAngle  

  32.     glRotatef(xRotAngle,1.0f,0.0f,0.0f);  

  33.     //坐标系绕y轴旋转yRotAngle  

  34.     glRotatef(yRotAngle,0.0f,1.0f,0.0f);  

  35.     z=0.0f;  

  36.     curWidth=width[0];  

  37.     //进行平滑处理   

  38.     glEnable(GL_LINE_SMOOTH);  

  39.     glHint(GL_LINE_SMOOTH,GL_NICEST);  

  40.     //glEnable(GL_DEPTH_TEST);  

  41.     //绘制平行的直线  

  42.     for(x=-80.0f;x<=80.0f;x+=20.0f){  

  43.         glLineWidth(curWidth);  

  44.         //开始绘直线  

  45.         glBegin(GL_LINES);  

  46.         glVertex3f(x,80.0f,z);  

  47.         glVertex3f(x,-80.0f,z);  

  48.         //结束绘直线  

  49.         glEnd();  

  50.         curWidth+=1.0f;//widthStep;  

  51.     }  

  52.     //恢复压入栈的Matrix  

  53.     glPopMatrix();  

  54.     //交换两个缓冲区的指针  

  55.     glutSwapBuffers();  

  56. }  

  57. //设置Redering State   

  58. void setupRederingState(void){  

  59.     //设置清理颜色为黑色  

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

  61.     //设置绘画颜色为绿色  

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

  63.     //获取受支持的线宽大小范围  

  64.     glGetFloatv(GL_LINE_WIDTH_RANGE,width);  

  65.     //获取受支持的线宽大小增量  

  66.     glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&widthStep);  

  67.     printf("Line width range:%f-%f\n",width[0],width[1]);  

  68.     printf("Line width step:%f\n",widthStep);  

  69. }  

  70. //窗口大小变化回调函数  

  71. void changSize(GLint w,GLint h){  

  72.     //横宽比率  

  73.     GLfloat ratio;  

  74.     //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  

  75.     GLfloat coordinatesize=100.0f;  

  76.     //窗口宽高为零直接返回  

  77.     if((w==0)||(h==0))  

  78.         return;  

  79.     //设置视口和窗口大小一致  

  80.     glViewport(0,0,w,h);  

  81.     //对投影矩阵应用随后的矩阵操作  

  82.     glMatrixMode(GL_PROJECTION);  

  83.     //重置当前指定的矩阵为单位矩阵   

  84.     glLoadIdentity();  

  85.     ratio=(GLfloat)w/(GLfloat)h;  

  86.     //正交投影  

  87.     if(w<h)  

  88.         glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  

  89.     else  

  90.         glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  

  91.     //对模型视图矩阵堆栈应用随后的矩阵操作  

  92.     glMatrixMode(GL_MODELVIEW);  

  93.     //重置当前指定的矩阵为单位矩阵   

  94.     glLoadIdentity();  

  95. }  

  96. //按键输入处理回调函数   

  97. void specialKey(int key,int x,int y){  

  98.   

  99.     if(key==GLUT_KEY_UP){  

  100.         xRotAngle-=5.0f;  

  101.     }  

  102.     else if(key==GLUT_KEY_DOWN){  

  103.         xRotAngle+=5.0f;  

  104.     }  

  105.     else if(key==GLUT_KEY_LEFT){  

  106.         yRotAngle-=5.0f;  

  107.     }  

  108.     else if(key==GLUT_KEY_RIGHT){  

  109.         yRotAngle+=5.0f;  

  110.     }  

  111.     //重新绘制  

  112.     glutPostRedisplay();  

  113. }  

  114.   

  115. int main(int argc, char* argv[])  

  116. {  

  117.     //初始化glut  

  118.     glutInit(&argc,argv);  

  119.     //使用双缓冲区模式  

  120.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);  

  121.     //获取系统的宽像素  

  122.     SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  

  123.     //获取系统的高像素  

  124.     SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  

  125.     //创建窗口,窗口名字为OpenlGL Lines width Demo  

  126.     glutCreateWindow("OpenlGL Lines width Demo");  

  127.     //设置窗口大小  

  128.     glutReshapeWindow(windowWidth,windowHeight);  

  129.     //窗口居中显示  

  130.     glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  

  131.     //设置窗口大小变化时的回调函数  

  132.     glutReshapeFunc(changSize);  

  133.     //设置显示回调函数  

  134.     glutDisplayFunc(renderScreen);  

  135.     //设置按键输入处理回调函数  

  136.     glutSpecialFunc(specialKey);  

  137.     //设置全局渲染参数  

  138.     setupRederingState();  

  139.     glutMainLoop();  

  140.     return 0;  

  141. }  



本文转载自:http://blog.csdn.net/yearafteryear/article/details/9052879

小青_1989
粉丝 3
博文 75
码字总数 12913
作品 0
大连
程序员
私信 提问
加载中
请先登录后再评论。
【WPF学习】第三十九章 理解形状

  在WPF用户界面中,绘制2D图形内容的最简单方法是使用形状(shape)——专门用于表示简单的直线、椭圆、矩形以及多变形的一些类。从技术角度看,形状就是所谓的绘图图元(primitive)。可组...

Peter.Luo
02/13
0
0
canvas基础入门(二)绘制线条、三角形、七巧板

复杂的内容都是有简单的线条结合而成的,想要绘制出复杂好看的内容先从画直线开始 canvas绘制直线先认识几个函数 beginPath();开始一条路径,或重置当前的路径 moveTo(x,y);用于规定直线的...

osc_96xykppu
2018/06/22
2
0
[翻译]PyCairo指南--基本绘图

PyCairo中的基本绘图 在PyCairo指南中的这个部分,我们将会绘制一些基本的元素。我们将绘制简单的直线,应用填充和stroke操作,我们将会讨论虚线,线帽和线的交合。 直线 直线是非常基本的向...

WolfCS
2013/05/20
1.2K
0
R语言低级绘图函数-abline 转载

abline 函数的作用是在一张图表上添加直线, 可以是一条斜线,通过x或y轴的交点和斜率来确定位置;也可以是一条水平或者垂直的线,只需要指定与x轴或y轴交点的位置就可以了 常见用法: 1)添加...

osc_it9fazjn
2018/03/09
2
0
iPhone之Quartz 2D系列--路径(3)Paths

以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 有关本章博客的代码实现,大家可以参考我的这遍博客:IOS用CGContextRef画各种图形(文字...

长平狐
2013/12/25
151
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在交互式环境中执行Python程序

如何在交互式环境中执行Python程序 相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行、命令行窗口运行、开发工具上运行等,其中在不同的...

osc_auwur47t
10分钟前
25
0
5G前传—25G DWDM SFP28光模块

在5G网络部署中,直连场景一般采用25G光模块,支持单纤和双纤双向这两种类型。而有源WDM应用场景采用的是25G彩色光模块,通常为25G CWDM和25G DWDM光模块。接下来,易天光通信ETU-LINK将在本...

osc_lmp76vjx
11分钟前
12
0
华为交换机不同VLAN间通信的两种主流解决方案,一分钟快速掌握

VLAN 隔离广播的同时,也禁止了不同VLAN 之间的用户通信,VLAN 间的通信成为新的焦点,VLAN 路由( 三层路由功能) 成功地解决了VLAN 间的通信。 一、三层交换机VLAN路由功能解决不同VLAN间通信...

osc_i5jwwgir
12分钟前
13
0
阿里云新品发布会周刊第56期 丨 如何用云服务占据全球化先机,让产品服务触达全球用户?

点击订阅新品发布会! 新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多内容,了解更多 新品发布会专属福利 1、 全球加速GA产品免费试用:加速任意跨地域公网服务...

osc_c05lkk3u
13分钟前
13
0
架构师应该具备哪些思维模型?

架构师一直是程序员「羡慕且追求」的高度,今天来说说我(奈学教育CEO:孙玄)眼里优秀的架构师该如何定义。毕竟我也曾经是一名架构师: 在开始今天的话题之前我说一个和我前公司P9现在已经是...

osc_lbt7zo1x
15分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部