openGL / 绘制钟表

#include<glut.h>
#include<stdlib.h>
#include<math.h>

const GLdouble twopi = 6.283185;
GLubyte label[]={'1','2','3','4','5',
'6','7','8','9','1','0','1','1','1','2'};


void init (void)
{
	glClearColor(1.0,1.0,1.0,0.0);

	glLoadIdentity();
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0,600.0,0.0,500.0);
}

//------------------------------

void clock(void)
{

	glClear (GL_COLOR_BUFFER_BIT);
	GLint r=500/4;
	//----------------------------------内部颜色
	glColor3f(0.9,0.9,0.9);
	glBegin(GL_TRIANGLE_FAN);

//	glVertex2f(300,250);

	for(int i=0;i<1000000;i++)
	{
		GLdouble t=i*twopi/1000000;
		glVertex2i(300-r*cos(t),250+r*sin(t));
	}

	glEnd();
//---------------------------------------------------------外部框
	glColor3f(0.0,0.0,0.0);
	glLineWidth(8.0);
	glBegin(GL_LINE_LOOP);
	for(i=0;i<1000000;i++)
	{
		GLdouble t=i*twopi/10000;
		glVertex2f(300+r * cos(t),250+r * sin(t));
	}
	glEnd();
//----------------------------------------------------------点
	glColor3f(0.0,0.0,0.0);
	glPointSize(3.5);
	glBegin(GL_POINTS);
	
	for(i=0;i<12;i++)
	{
		GLdouble t=i*twopi/12;
		glVertex2i(300+(r-10)*cos(t),250+(r-10)*sin(t));
	}
	glPointSize(4.5);
	glVertex2i(300,250);
	glEnd();
	//---------------------------小点
	glPointSize(1.5);
	glBegin(GL_POINTS);
	
	for(i=0;i<60;i++)
	{
		GLdouble t=i*twopi/60;
		glVertex2i(300+(r-10)*cos(t),250+(r-10)*sin(t));
	}
	glEnd();

//--------------------------------------------------------------文字
	glColor3f(0.0,0.0,0.0);
	GLint k=0;
	for(i=2;i>=-6;i--)
	{
		GLdouble t=i*twopi/12;
		glRasterPos2i(297+(r-23)*cos(t),246+(r-23)*sin(t));
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label[k]);
		k++;
	}
	//--------
	for(i=-7;i>=-9;i--)
	{
		GLdouble t=i*twopi/12;
		glRasterPos2i(297+(r-23)*cos(t),246+(r-23)*sin(t));
		for(GLint j=k;j<k+2;j++)
		glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,label[j]);
		k+=2;
	}
//-------------------------------------------------------------------时针
	glColor3f(0.0,0.0,0.0);
	glLineWidth(1.0);
	glBegin(GL_LINES);
		GLdouble t=-twopi/3;
		glVertex2i(300,250);
		glVertex2i(300+(r-30)*cos(t),250+(r-30)*sin(t));
	glEnd();

	//----------

	glColor3f(0.0,0.0,0.0);
	glLineWidth(2.5);
	glBegin(GL_LINES);
		t=twopi/12.1;
		glVertex2i(300,250);
		glVertex2i(300+(r-40)*cos(t),250+(r-40)*sin(t));
	glEnd();

	glColor3f(0.0,0.0,0.0);
	glLineWidth(4.0);
	glBegin(GL_LINES);
		t=twopi/2.42;
		glVertex2i(300,250);
		glVertex2i(300+(r-55)*cos(t),250+(r-55)*sin(t));
	glEnd();

	glFlush();
}


//------------------------------
void main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(600,500);
	glutCreateWindow("实验一:自由发挥");

	init();
	glutDisplayFunc(clock);
	glutMainLoop();
}

在这里插入图片描述

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要创建一个窗口和OpenGL上下文。你可以使用任何喜欢的库,比如GLUT或SDL2。 然后,你需要在OpenGL中设置透视投影,以便你可以绘制3D对象。你可以使用gluPerspective函数来设置透视投影。 在绘制钟表之前,你需要绘制钟表的表盘。你可以使用glBegin和glEnd函数来绘制一个圆形。你可以使用glVertex3f函数来指定每个顶点的位置。 接下来,你需要绘制钟表的指针。你可以使用glBegin和glEnd函数来绘制一个三角形,表示指针的形状。你可以使用glTranslatef和glRotatef函数来移动和旋转指针。 最后,你需要在屏幕上显示绘制的图形。你可以使用glSwapBuffers函数来刷新屏幕。以下是一个基本的代码示例: ```c++ #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> void display() { // 设置背景颜色 glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // 设置透视投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, 1.0, 1.0, 10.0); // 绘制表盘 glColor3f(1.0, 1.0, 1.0); glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0, 0.0, -5.0); for (float angle = 0.0; angle <= 2.0 * 3.14159; angle += 0.1) { glVertex3f(0.5 * sin(angle), 0.5 * cos(angle), -5.0); } glEnd(); // 绘制指针 glPushMatrix(); glTranslatef(0.0, 0.0, -4.0); glRotatef(45.0, 0.0, 0.0, 1.0); glBegin(GL_TRIANGLES); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.1, 0.5, 0.0); glVertex3f(-0.1, 0.5, 0.0); glEnd(); glPopMatrix(); // 刷新屏幕 glutSwapBuffers(); } int main(int argc, char** argv) { // 初始化 GLUT glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("Clock"); // 设置回调函数 glutDisplayFunc(display); // 进入主循环 glutMainLoop(); return 0; } ``` 这个程序会绘制一个白色的表盘和一个45度角的指针。你可以使用glTranslatef和glRotatef函数来移动和旋转指针,以显示实际的时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值