本文显示一个时钟,代码基于NeHe框架之上。
图上传不了,主要思想是在DrawGLScene里获取当前系统时间,绘制一个圆和各个时针。
简单说一下实现方法。
1,#include <math.h><time.h>,因为要用到sinf和cosf函数,还要获取系统时间。
2,定义PI为3.1415926536f,定义全局变量hour, min, sec(小时,分,秒)。
3,定义几个函数,如下:
// 圆框
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_LINE_LOOP);
for (i=0; i<n; i++)
{
x = r * sinf(t * i);
y = r * cosf(t * i);
glVertex2f(x, y);
}
glEnd();
// 正点
t = 2 * PI / 12;
glBegin(GL_LINES);
for (i=0; i<12; i++)
{
x = r * sinf(t * i);
y = r * cosf(t * i);
glVertex2f(x, y);
// 3点、6点、9点、12点,线段长点
if (i % 3 == 0)
glVertex2f(0.9f * x, 0.9f * y);
else
glVertex2f(0.95f * x, 0.95f * y);
}
glEnd();
return 1;
}
/*
* DrawPointers
* 根据半径画秒针、分针和时针
*/
void DrawPointers(float r)
{
float a; // 角度
// 秒针
a = 2 * PI / 60 * sec;
glColor3f(1.0f, 0.0f, 0.0f);
DrawPointer(0.8f * r, a);
// 分针
a = 2 * PI / 60 * min;
glColor3f(1.0f, 0.0f, 1.0f);
DrawPointer(0.6f * r, a);
// 时针
a = 2 * PI / 12 * hour;
glColor3f(1.0f, 1.0f, 0.0f);
DrawPointer(0.4f * r, a);
}
4,在DrawGLScene里调用上面几个函数即可:
glTranslatef(0.0f, 0.0f, -6.0f);
GetTime();
DrawCircle(1.8f, 360);// 半径为1.8f
DrawPointers(1.8f);
圆是由一组线段组成,线段越多,圆越精确。每条线段由2个点组成,点的坐标由半径和角度(与x轴正向夹角)决定。