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窗口的创建.本文接着说如 ...
随机推荐
- LeetCode Day5——House Robber
问题描述: 意思就是说:给定一个数组,寻找一种选取方法,使得在保证任何两个相邻元素不同时被选的条件下得到的数值总和最大. 1. 递归 设nums为数组首地址,numsSize为数组的大小,max[i] ...
- for练习--凑法
static void Main14购物卡(string[] args) { //小明单位发了50元的购物卡,他到超市买洗化用品,一是牙刷(5元),二是香皂(2元),三是牙膏(10元)怎么可以正好把五 ...
- Oracle的汉字转拼音首字母的函数
CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE VARCHAR2(100); ...
- ios读取文件
// 创建文件管理器 NSFileManager *fm=[NSFileManager defaultManager]; //获取路径 NSArray *paths=NSSearchPathForDi ...
- WindowsForm 计算器
计算器 可以分一下类 数字键 + - * / % =和撤销 归零C最简单 下面看一下计算器具体的代码 using System; using System.Collections. ...
- 用GoEasy推送实现Java实时推送
前段时间客户有个需求他希望他在后台管理页面发布一个消息,所有用这个系统的用户无论在哪个页面都能及时收到他发布的信息,以前对于类似需求在少量 页面接收的前提下,我一般采用ajax定时去服务器pull信息 ...
- 使用 VB.NET 开发多线程
摘要:.NET 框架提供了新的类,可以方便地创建多线程应用程序.本文介绍如何使用 Visual Basic® .NET 的多线程编程技术来开发效率更高.响应速度更快的应用程序. 目录 简介 多线程处理 ...
- Qt5 多显示器获取不同显示器的分辨率和位置的方法
Qt5 多显示器获取不同显示器的分辨率和位置的方法 先放官方文档链接:QDesktopWidget - Qt5 Reference 之前一直在用被我乱搞后的ShadowPlayer作为默认播放器,后来 ...
- 【原】从一个bug浅谈YUI3组件的资源加载
篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...
- Best Financing(HD4833)
每笔收入产生的收益是独立的. 计算所有点的收益率,累计. #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<al ...