OpenGL绘制简单的时钟(首发测试)

编辑器 vs2012  1 #include <windows.h>
  2 #include <GL/glut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,
  3                     //但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。
  4 #include <math.h>
  5 #include<time.h>
  6
  7 const GLfloat Pi = 3.1415926536;
  8 const GLfloat R=0.8f;
  9 const int n=200;
 10 static GLfloat angle=2*Pi;
 11
 12 float Mysecond(struct tm *ptr)
 13 {
 14     return ((Pi/2)-(((float)ptr->tm_sec)/60)*2*Pi);
 15
 16 }
 17
 18 float Mymin(struct tm *ptr)
 19 {
 20     //return (Pi/2)-(((ptr->tm_min+(((float)ptr->tm_sec)/60))/60)*2*Pi);
 21     return ((Pi/2)-((ptr->tm_min+(Mysecond(ptr)/60))/60)*2*Pi);
 22 };
 23
 24 float Myhour(struct tm *ptr)
 25 {
 26     if(0<ptr->tm_hour&&ptr->tm_hour<12)
 27     {
 28         return ((Pi/2)-((float)ptr->tm_hour+Mymin(ptr)/60.0)/12.0*2*Pi);
 29     }else{
 30         return ((Pi/2)-((ptr->tm_hour-12.0+Mymin(ptr)/60.0)/12)*2*Pi);
 31     }
 32 };
 33 void myDisplay(void)
 34
 35 {
 36     //glShadeModel(GL_SMOOTH);
 37     //获取系统时间
 38     struct tm *ptr;
 39     time_t it;
 40     it=time(NULL);
 41     ptr=localtime(&it);
 42
 43      glClear(GL_COLOR_BUFFER_BIT);//清除,GL_COLOR_BUFFER_BIT表示清除颜色
 44      glEnable(GL_POINT_SMOOTH);
 45     glEnable(GL_LINE_SMOOTH);
 46     glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
 47     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);  // Antialias the lines
 48     glEnable(GL_BLEND);
 49     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 50      //钟盘
 51      glColor3f(0.5,0.5,0.5);
 52      glBegin(GL_POLYGON);
 53      for(int i=0;i<n;i++){
 54          glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));
 55      }
 56      glEnd();
 57
 58      //刻度
 59      glColor3f(1.0,1.0,1.0);
 60      glBegin(GL_POINTS);
 61      glPointSize(5.0f);
 62      for(int j=0;j<12;j++)
 63      {
 64          glVertex2f(0.75*cos(2*Pi/12*j),0.75*sin(2*Pi/12*j));
 65          //for(int k=
 66      }
 67
 68      glEnd();
 69      //中心点
 70      glPointSize(5.0f);
 71      glColor3f(0.0,0.0,0.0);
 72      glBegin(GL_POINTS);
 73      glVertex2f(0.0,0.0);
 74      glEnd();
 75
 76      //时针
 77      glLineWidth(5.0f);
 78      glColor3f(0.0,0.0,0.0);//红色
 79      //glRotatef((angle/3600.0),0.0,0.0,1.0);
 80
 81      glBegin(GL_LINES);
 82      glRotatef((angle/3600.0),0.0,0.0,1.0);
 83      glVertex2f(0.0,0.0);
 84      glVertex2f(cos(Myhour(ptr))*R*0.55,sin(Myhour(ptr))*R*0.55);
 85      glEnd();
 86
 87      //分针
 88      glLineWidth(5.0f);
 89      glColor3f(0.0,0.0,0.0);//绿色
 90      //glRotatef((angle/60.0),0.0,0.0,1.0);
 91
 92      glBegin(GL_LINES);
 93      glRotatef((angle/60.0),0.0,0.0,1.0);
 94      glVertex2f(0.0,0.0);
 95      glVertex2f(cos(Mymin(ptr))*R*0.65,sin(Mymin(ptr))*R*0.65);
 96      glEnd();
 97
 98      //秒针
 99      glLineWidth(3.0f);
100      glColor3f(0.0,0.0,0.0);//蓝色
101      //glRotatef(angle,0.0,0.0,1.0);
102
103      glBegin(GL_LINES);
104      glRotatef(angle,0.0,0.0,1.0);
105      glVertex2f(0.0,0.0);
106      glVertex2f(cos(Mysecond(ptr))*R*0.85,sin(Mysecond(ptr))*R*0.85);
107      glEnd();
108      glFlush();//glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。
109
110 }
111
112 void myIdle(void)
113 {
114     angle-=((2*Pi)/60);
115     Sleep(1000);
116     if(angle<0.0f){
117         angle=2*Pi;
118     }
119     myDisplay();
120 }
121
122 int main(int argc, char *argv[])
123
124 {
125
126      glutInit(&argc, argv);//glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。
127
128      glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的GLUT_INDEX表示使用索引颜色。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)
129
130      glutInitWindowPosition(300,100);//设置窗口在屏幕中的位置.
131
132      glutInitWindowSize(400, 400);//设置窗口的大小
133
134      glutCreateWindow("时钟");//根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。
135
136      glutDisplayFunc(&myDisplay);//调用画图函数
137      glutIdleFunc(&myIdle);
138
139      glutMainLoop();//进行一个消息循环。这个函数可以显示窗口,并且等待窗口关闭后才会返回
140
141      return 0;
142
143 }

效果

				
时间: 2024-08-30 00:38:25

OpenGL绘制简单的时钟(首发测试)的相关文章

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码,有详细注释.适合初学者熟悉opengl使用. 开发情况 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 本项目实现了绘制一个场景(包括立方体.球体.网格),对各物体实现平移.旋转.缩放功能,添加了光源并简单设置了物体材质. 本项目示例代码下载(里面有详细注释) 感谢nehe的框架! 场景介绍 初始

OpenGL绘制简单的参数曲线——三阶Bezier曲线(二)

今天我们来介绍三次Bezier曲线,这曲线网上资料非常多,我这里只是简单介绍下原理. 在二维空间中(三维也类似),给定n+1个点P0.P1.... .Pn.参数t的n次的Bezier曲线是: 图1 我们根据上面式子可以推出一阶.二阶.三阶贝塞尔曲线,下面是一阶贝塞尔曲线: 图2 下面是二阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,每一个Q0Q1都是曲线的切向量: 图3 下面是三阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,P2P3线段取Q2,再从Q0Q1取R

OpenGL绘制简单的参数曲线——两点三次Hermite曲线(一)

网上这类曲线绘制的文章非常多,但是大多都是代码一贴就完事了,甚至连参数怎么调也没说清楚.我翻阅了不少资料,这里做个汇总,主要也就介绍一下几类简单的曲线绘制,如Hermite曲线.Bezier曲线等.今天先说说Hermite曲线,基本上最常见的就是两点三次的Hermite曲线了. 按照惯例,我们先来介绍一下Hermite曲线的原理.Hermite曲线是给定曲线段的两个端点坐标以及两端点处的切线矢量来描述的曲线.平面上一条三次参数曲线可以表示为: 图1 空间Hermite曲线跟上述类似,只是加一个z

html5--canvas绘制简单的时钟

http://5227788.cn/static/time.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body{background: #131115;} #c1{background: #fbf7fe;} </style

opengl使用现在比较常用的方法来绘制简单几何图元

上一篇文章中也使用了比较老的方法glBegin 和 glEnd的方法来绘制了简单的集合图元,现在使用比较新的而且更高效的方法来绘制简单的集合图元. 这种方法与以前方法的不同点在对数据的处理上,glBegin 和 glEnd是要给出数据,然后直接来进行绘制,然而新的方法是现将数据保存到显存中,然后直接一个绘制命令,就可以直接从显卡内存中直接读取数据进行绘制,效率更高而且更方便. #include <GL/glew.h> #include <GL/freeglut.h> #includ

OpenGL学习-------绘制简单的几何图形

本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的点,只有位置,没有大小.但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点.另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点.一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它可能足够小,但并不会是无穷小.同一像素上,Op

玩转Android Camera开发(五):基于Google自带算法实时检测人脸并绘制人脸框(网络首发,附完整demo)

本文主要介绍使用Google自带的FaceDetectionListener进行人脸检测,并将检测到的人脸用矩形框绘制出来.本文代码基于PlayCameraV1.0.0,在Camera的open和preview流程上进行了改动.原先是放在单独线程里,这次我又把它放到Surfaceview的生命周期里进行打开和开预览. 首先要反省下,去年就推出了静态图片的人脸检测demo,当时许诺一周内推出Camera预览实时检测并绘制的demo,结果拖到现在才整.哎,屌丝一天又一天,蹉跎啊.在demo制作过程中

OpenGl 绘制一个立方体

OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复使用了三次,这样可不是好的现象.最起码,像上面这样重复烦琐的代码,是很容易出错的.稍有不慎,即使相同的顶点也可能被指定成不同的顶点了. 如果我们定义一个数组,把八个顶点都放到数组里,然后每次指定顶点都使用指针,而不是使用直接的数据,这样就避免了在指定顶点时考虑大量的数据,于是减少了代码出错的可能性.

shape-自绘制简单图形

shape 可以绘制简单的图形,颜色等.它主要就是应用于selector 的一些状态. 本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27/2612023.html 自己验证了下,学习记录 它主要有以下几个部分,分别是 填充(solid):设置填充的颜色 间隔(padding):设置四个方向上的间隔 大小(size):设置大小 圆角(corners):设置图形圆角,默认是正方形的 渐变(gradient):当设置填充颜色后,无渐变效果