OpenGL绘制简单的时钟(首发测试)
#include <windows.h>
#include <GL/glut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,
//但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。
#include <math.h>
#include<time.h> const GLfloat Pi = 3.1415926536;
const GLfloat R=0.8f;
const int n=;
static GLfloat angle=*Pi; float Mysecond(struct tm *ptr)
{
return ((Pi/)-(((float)ptr->tm_sec)/)**Pi);
} float Mymin(struct tm *ptr)
{
//return (Pi/2)-(((ptr->tm_min+(((float)ptr->tm_sec)/60))/60)*2*Pi);
return ((Pi/)-((ptr->tm_min+ptr->tm_sec/60.0)/)**Pi);
}; float Myhour(struct tm *ptr)
{
if(<ptr->tm_hour&&ptr->tm_hour<)
{
return ((Pi/)-((float)ptr->tm_hour+ptr->tm_min/60.0)/**Pi);
}else{
return ((Pi/)-((ptr->tm_hour-12.0+ptr->tm_min/60.0)/)**Pi);
}
};
void myDisplay(void) {
//glShadeModel(GL_SMOOTH);
//获取系统时间
struct tm *ptr;
time_t it;
it=time(NULL);
ptr=localtime(&it); glClear(GL_COLOR_BUFFER_BIT);//清除,GL_COLOR_BUFFER_BIT表示清除颜色
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Antialias the lines
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//钟盘
glColor3f(0.5,0.5,0.5);
glBegin(GL_POLYGON);
for(int i=;i<n;i++){
glVertex2f(R*cos(*Pi/n*i), R*sin(*Pi/n*i));
}
glEnd(); //刻度
glColor3f(1.0,1.0,1.0);
glPointSize(5.0f);
glBegin(GL_POINTS);
for(int j=;j<;j++)
{
glVertex2f(0.75*cos(*Pi/*j),0.75*sin(*Pi/*j));
}
glEnd(); //时针
glLineWidth(5.0f);
glColor3f(0.0,0.0,0.0); glBegin(GL_LINES);
glRotatef((angle/3600.0),0.0,0.0,1.0);
glVertex2f(0.0,0.0);
glVertex2f(cos(Myhour(ptr))*R*0.55,sin(Myhour(ptr))*R*0.55);
glEnd(); //分针
glLineWidth(4.0f);
glColor3f(0.0,0.0,0.0); glBegin(GL_LINES);
glRotatef((angle/60.0),0.0,0.0,1.0);
glVertex2f(0.0,0.0);
glVertex2f(cos(Mymin(ptr))*R*0.65,sin(Mymin(ptr))*R*0.65);
glEnd(); //秒针
glLineWidth(3.0f);
glColor3f(0.0,0.0,0.0); glBegin(GL_LINES);
glRotatef(angle,0.0,0.0,1.0);
glVertex2f(0.0,0.0);
glVertex2f(cos(Mysecond(ptr))*R*0.85,sin(Mysecond(ptr))*R*0.85);
glEnd();
glFlush();//glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。 } void myIdle(void)
{
angle-=((*Pi)/);
Sleep();
if(angle<0.0f){
angle=*Pi;
}
myDisplay();
} int main(int argc, char *argv[]) { glutInit(&argc, argv);//glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的GLUT_INDEX表示使用索引颜色。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲) glutInitWindowPosition(,);//设置窗口在屏幕中的位置. glutInitWindowSize(, );//设置窗口的大小 glutCreateWindow("时钟");//根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。 glutDisplayFunc(&myDisplay);//调用画图函数
glutIdleFunc(&myIdle); glutMainLoop();//进行一个消息循环。这个函数可以显示窗口,并且等待窗口关闭后才会返回 return ; }
说明:其实可以在绘制时针(分针,秒针)时就指定固定形状,由glRotatef(假定旋转参数为angle0x)来为其旋转到系统时间,之后"angle0x+=t"(其中t为各针对应转速)
OpenGL绘制简单的时钟(首发测试)的更多相关文章
- OpenGL绘制简单场景,实现旋转缩放平移和灯光效果
本项目实现了用OpenGL绘制一个简单场景,包括正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码.有具体凝视.适合刚開始学习的人熟悉opengl使用. 开发情况 开发环境V ...
- html5--canvas绘制简单的时钟
http://5227788.cn/static/time.html <!DOCTYPE html> <html lang="en"> <head&g ...
- OpenGL学习-------绘制简单的几何图形
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...
- 在MFC框架中使用OpenGL的简单实例
引言 我们知道,在MFC框架中,用于绘图的接口是GDI.但GDI只能绘制简单的2D图形,要想制作精美的3D图形,一个可行的办法是使用OpenGL或者Direct3D等第三方库. 由于最近在给导师的一个 ...
- OpenGL绘制自由落体小球
OpenGL绘制自由落体小球 一. 程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...
- CSS绘制简单图形
究竟该用字体图标.图片图标.还是CSS画一个图标?我也不知道.各有千秋吧.本文将介绍如何用css绘制简单的图形,所有测试在chrome58.0完成,如果你不能得到正确结果请到caniuse查一查看看是 ...
- OpenGl 绘制一个立方体
OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...
- shape-自绘制简单图形
shape 可以绘制简单的图形,颜色等.它主要就是应用于selector 的一些状态. 本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27 ...
- [Modern OpenGL系列(三)]用OpenGL绘制一个三角形
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...
随机推荐
- 彩虹vpn免费10分钟
账号:rainbowvpn password:10fenzhong server地址:t.chqvpn.com l2tp密钥:123456
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- 【最大点独立集】【poj1419】【Graph Coloring】
题意: 最多能选取多少点,没有边相连. 解法: 取反图,求最大团 代码: #include<cstdio> #include<cstring> #include<iost ...
- uilable 换行标记
m_tipLabel.lineBreakMode = UILineBreakModeWordWrap; m_tipLabel.numberOfLines = 0; m_tipLabel.text = ...
- DW 做一个table表 对单元格进行合并
编辑前的代码 <body> <table width="500" border="0" bgcolor='#000000' backgroun ...
- [Effective C++系列]-透彻了解inlining的里里外外
Understand the ins and outs of inlining. [原理] Inline函数背后的做法是将“对函数的每一个调用”都用函数本体(function body)替换之.其 ...
- Python学习笔记(四)Python函数的参数
Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...
- *循环-01. 求整数段和【help】
/* * Main.c * 循环-01. 求整数段和 * Created on: 2014年6月18日 * Author: Boomkeeper ***测试木有通过**** */ #include & ...
- 动态加载Layout 与 论Activity、 Window、View的关系
1)动态加载Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); ...
- 修改Windows XP的桌面路径
WinowsXP 的桌面的是在系统盘上,一但系统瘫痪需要重新安装系统时,总得记得去备份桌面的重要文件,如果一不小心忘记备份就重装系统的话,那些重要文件就一去不复返了.其实我们可以把桌面放到其它盘目录里 ...