第2章.编写一个的钟表程序

第一节.绘制基本的几何图形

矩形、三角形、圆形等这些都是经典的几何图形,他们都由线构成的(圆形看成是有很多根短线收尾相连围成的),而线都是点构成的。想起了某一年狗血的高考题=。=....而在OpenGL中画线很简单,你指定线两端的顶点即可。

指定顶点的函数如下:

glVertex2d

glVertex2f

glVertex3f

glVertex3v

每个函数用法各有不同,我们目前的需求是在二维空间中画线,所以重点关注glVertex2f函数。GlVertex2f函数有两个参数x,y,分别表示你所指定的顶点的横纵坐标。

x,y坐标的位置如同笛卡尔坐标系一样。

接下来,我们就要开始画线了。OpenGL规定:在你指定顶点之前,你必须调用glBegin()函数,指定顶点之后,必须调用glEnd()。而其中glBegin函数的参数与我们希望它绘制的图形有关。

比如:

glBegin(GL_POINTS);

glVertex2f(0.0f,0.0f);

glVertex2f(0.5f,0.5f);

glEnd();

此时,这两个点会被描绘出来。如果将GL_POINTS改为GL_LINES,一条以这两个点为端点的直线将被画出来。大家可以把上一章中Draw函数改成

voidDraw()

{

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

glVertex2f(0.0f,0.0f);

glVertex2f(0.5f,0.5f);

glEnd();

glFlush();

}

运行后就可以看到两个很小的白点。

除此之外,你glBegin()的参数还有很多种,如图:

(声明:该图片来自互联网传播,我希望没有涉及到任何的版权问题。如有,我可以马上换掉。)

好的,了解了基本的图形绘制,下面我们就开始着手钟表的绘制。

经过分析,可以发现,钟表其实是由1个大圆(作为表的框架),12个短粗线(作为12个钟点的刻度),3个形状不同的矩阵(分针,时针,秒针)1个点(轴)组成的。

如同,上面说道,圆形看成是有很多根短线收尾相连围成的,那我们现在就先把圆画出来。

glLineWidth(5);

glBegin(GL_LINE_LOOP);

for(i=0; i<100; i++)

{

glVertex2f(R*cos(2*PI/100*i),R*sin(2*PI/100*i));

//觉得数学有压力就多练练

}

glEnd();

glLineWidth(1);

这样一个圆就画好了,实际上,是100根线段连接而成。其中,glLineWidth函数,如同名字一样,他是用于调节接下来OpenGL画出的线的宽度。参数越大,线越粗。使用了过后,记得调用一下glLineWidth(1);不然,以后画出来的线的宽度会一直都是5(这其实和OpenGL的状态机模式有关,如有兴趣就多查查资料)。与此类似的函数还有glPointSize。

接下来,我们就来绘制12个小矩形。

好的,最后,我们再把3根指针画出来就完成了!

指针的位置是和当前的时间有关系,我们这里为了方便,就先把定义3个float变量h,m,s,表示小时,分钟,秒。

h_Length表示时针的长度,h_Angle表示时针相对于0点的偏移量,m_Length,m_Angle,s_Length,s_Angle同理。

h=10;

m=15;

s=25;

h_Length=0.2;

m_Length=0.3;

s_Length=0.4;

count=60;

s_Angle=s/count;

count*=60;

m_Angle=(m*60+s)/count;

count*=12;

h_Angle=(h*60*60+m*60+s)/count;

glLineWidth(1);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle));

glEnd();

glLineWidth(5);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle));

glEnd();

glLineWidth(3);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle));

glEnd();

glLineWidth(1);

最后,我们再画一个点,作为表的中轴。

glBegin(GL_POLYGON);

for(i=0; i<100; i++)

{

glVertex2f(0.03*cos(2*PI/100*i),0.03*sin(2*PI/100*i));

}

glEnd();

好,glFlush()!

大功告成!

附本节全代码:

#include

#include

#include

#include

#define PI 3.1415926

void Draw()

{

int i;

float R,TR,h_Angle,m_Angle,s_Angle,h,m,s,count,h_Length,m_Length,s_Length;

R=0.5;

TR=R-0.05;

glClear(GL_COLOR_BUFFER_BIT);

glLineWidth(5);

glBegin(GL_LINE_LOOP);

for (i=0; i<100; i++)

{

glVertex2f(R*cos(2*PI/100*i),R*sin(2*PI/100*i));

}

glEnd();

glLineWidth(2);

for (i=0; i<12; i++)

{

glBegin(GL_LINES);

glVertex2f(TR*sin(2*PI/12*i),TR*cos(2*PI/12*i));

glVertex2f(R*sin(2*PI/12*i),R*cos(2*PI/12*i));

glEnd();

}

glLineWidth(1);

h=10;

m=15;

s=25;

h_Length=0.2;

m_Length=0.3;

s_Length=0.4;

count=60;

s_Angle=s/count;

count*=60;

m_Angle=(m*60+s)/count;

count*=12;

h_Angle=(h*60*60+m*60+s)/count;

glLineWidth(1);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle));

glEnd();

glLineWidth(5);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle));

glEnd();

glLineWidth(3);

glBegin(GL_LINES);

glVertex2f(0.0f,0.0f);

glVertex2f(m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle));

glEnd();

glLineWidth(1);

glBegin(GL_POLYGON);

for (i=0; i<100; i++)

{

glVertex2f(0.03*cos(2*PI/100*i),0.03*sin(2*PI/100*i));

}

glEnd();

glFlush();

}

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

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(400, 400);

glutCreateWindow("HelloOpenGL");

glutDisplayFunc(&Draw);

glutMainLoop();

return 0;

}

opengl教程 linux,绘制基本的几何图形 - OpenGL编程学习实战教程_Linux编程_Linux公社-Linux系统门户网站...相关推荐

  1. Pytorch 深度学习实战教程(二):UNet语义分割网络

    本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善. 一 ...

  2. Pytorch深度学习实战教程(二):UNet语义分割网络

    1 前言 本文属于Pytorch深度学习语义分割系列教程. 该系列文章的内容有: Pytorch的基本使用 语义分割算法讲解 如果不了解语义分割原理以及开发环境的搭建,请看该系列教程的上一篇文章< ...

  3. 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站

    外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站 之前在CentOS虚拟机上安装了LAMP,搭建起了自己的web服务器,具体流程见: http://www.lin ...

  4. Go编程项目实战教程

    Go编程项目实战教程 在这个面向初学者的 Go 编程语言课程中,您将通过构建 11 个项目来提高您的 Go 编程技能 课程英文名:Learn Go Programming by Building 11 ...

  5. HarmonyOS2.0 华为鸿蒙开发学习实战教程

    据统计,鸿蒙系统升级用户2周破1800万,1个月突破3000万.升级速度完全超出市场预期,很显然,华为严重低估了消费者的支持热情.随即,华为鸿蒙目标多次升级,从2亿到4亿,后年目标12.3亿. 而且, ...

  6. caffe linux 教程,Caffe 深度学习入门教程 - 安装配置Ubuntu14.04+CUDA7.5+Caffe+cuDNN_Linux教程_Linux公社-Linux系统门户网站...

    安装配置Ubuntu14.04+CUDA7.5+Caffe+cuDNN 一.版本 Linux系统:Ubuntu 14.04 (64位) 显卡:Nvidia K20c cuda: cuda_7.5.18 ...

  7. 虚拟机桌面linux系统,KVM - Linux下三大免费桌面虚拟机评测_Linux教程_Linux公社-Linux系统门户网站...

    KVM KVM(基于内核的虚拟机)是一个x86 Linux全虚拟化解决方案,需要硬件支持虚拟化扩展(Intel VT 或AMD-V),它由一个载入时内核模块kvm.ko(提供核心虚拟化基础设施)和一个 ...

  8. 幼儿linux教程,新增20多种小游戏 - 专为3岁儿童设计的Ubuntu 10.10应用体验_Linux教程_Linux公社-Linux系统门户网站...

    新增20多种小游戏 也许是开发者觉得儿童最喜欢的就是游戏了,所以集成了20多种游戏,包括:贪吃蛇.俄罗斯方块.对对碰.国际象棋.黑白棋以及十几种逻辑等. 游戏 其中,在逻辑游戏中,有一款gbralny ...

  9. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

最新文章

  1. CM5.x配置spark错误解决
  2. 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue
  3. 如何让SVN提交时候强制添加注释
  4. react循环setstate_react -- 关于兄弟组件触发更新的问题
  5. String.format()的使用
  6. if else可以看成一个完整的代码块
  7. 最大素因子(不是题目!自己写着玩的。。。)
  8. 实现两个Mysql数据库同步
  9. java对字符串快查找_字符串快速查找 - Trie算法
  10. php output详解,【PHP】Output Control 扩展详细解读
  11. 令人笑喷的56个代码注释,最后几个老衲实在憋不住了。。。
  12. 百度硬盘搜索 2.3 试用手记
  13. 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
  14. 酒店客房管理系统(C语言)
  15. python计算梯形面积程序编程解题思路_编写程序计算梯形面积
  16. 将博客搬至CSDN_拔剑-浆糊的传说_新浪博客
  17. 怎么修改网页游戏服务器内容,云服务器怎么设置挂网页游戏
  18. chrome 常用插件下载安装
  19. Smart-Link
  20. linux查看电脑耗电量,命令行 - 在Linux上,观察程序耗电量使用的最佳方法是什么?...

热门文章

  1. 2011.10.17百度面试题
  2. Java编程基础篇第四章
  3. tp模型和数据库操作方法
  4. Lintcode---统计比给定整数小的数的个数
  5. 使用一阶微分对图像锐化
  6. data too long for column的解决方法
  7. windows残留软件卸载
  8. PowerSploit脚本
  9. [python学习] 简单爬取维基百科程序语言消息盒
  10. App设计灵感之十二组精美的汽车远程管理App设计案例