当前位置: 首页 > news >正文

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

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

说明:其实可以在绘制时针(分针,秒针)时就指定固定形状,由glRotatef(假定旋转参数为angle0x)来为其旋转到系统时间,之后"angle0x+=t"(其中t为各针对应转速)

转载于:https://www.cnblogs.com/Godspysonyou/p/Godspysonyou.html

相关文章:

  • VMware workstation 6.5安装Red Hat Linux 9
  • great C++ socket library
  • Android手机分辨率基础知识(DPI,DIP计算)
  • WebApi2官网学习记录---单元测试
  • redhat9 内核由2.4.20-8至2.6.10全过程
  • stdarg.h详解
  • C# 6.0 的那些事
  • C#脚本实践(一)
  • 【Python】excel
  • ASP.NET配置KindEditor文本编辑器 【转载】
  • 在Python中使用ArcObjects对象
  • C#脚本实践(二): Unity脚本机制分析
  • postgresql 数据库-密码修改
  • 解决linux oracle shell上下箭调用历史命令
  • 模板 BFS
  • 深入了解以太坊
  • .pyc 想到的一些问题
  • ES学习笔记(12)--Symbol
  • JavaScript类型识别
  • JWT究竟是什么呢?
  • k个最大的数及变种小结
  • scala基础语法(二)
  • Twitter赢在开放,三年创造奇迹
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 嵌入式文件系统
  • 三分钟教你同步 Visual Studio Code 设置
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 译自由幺半群
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 最简单的无缝轮播
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​HTTP与HTTPS:网络通信的安全卫士
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (vue)页面文件上传获取:action地址
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)OpenStack Hacker养成指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .CSS-hover 的解释
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • @Async注解的坑,小心
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @RequestParam详解
  • @拔赤:Web前端开发十日谈
  • @取消转义
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [C#基础]说说lock到底锁谁?