您的位置:首页 > 理论基础

计算机图形学作业-运用数值微分法和中点作圆法使用Python的OpenGL库画出时钟

2017-04-11 15:48 911 查看
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from math import *
import time
def Display():
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_POINTS)
MidCircle(0,0,15)
glEnd()
PI=3.1415926
R=15
TR=R-1
glLineWidth(2)
for i in range(100):
DrawLines(TR*sin(2*PI/12*i),TR*cos(2*PI/12*i),R*sin(2*PI/12*i),R*cos(2*PI/12*i))
h_Length=5
m_Length=8
s_Length=12
count=60.0
s_Angle=s/count
count*=60
m_Angle=(m*60+s)/count
count*=12
h_Angle=(h*60*60+m*60+s)/count
glLineWidth(1)
DrawLines(0.0,0.0,s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle))
glLineWidth(5)
DrawLines(0.0,0.0,h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle))
glLineWidth(3)
DrawLines(0.0,0.0,m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle))
glLineWidth(1)
glBegin(GL_POLYGON)
for i in range(100):
glVertex2f(0.03*cos(2*PI/100*i),0.03*sin(2*PI/100*i));
glEnd()
glFlush()

def MidCircle(x0,y0,r): #中点画圆法作圆
x=x0
y=y0+r
deltax=3
deltay=2-r-r
d=1-r
glVertex2i(x,y)
while(x<y):
if(d<0):
d=d+deltax
deltax=deltax+2
x=x+1
else:
d=d+deltax+deltay
deltax=deltax+2
deltay=deltay+2
x=x+1
y=y-1
glVertex2i(x,y)
glVertex2i(y,x)
glVertex2i(x,y0+y0-y)
glVertex2i(y0+y0-y,x)
glVertex2i(x0+x0-x,y)
glVertex2i(y,x0+x0-x)
glVertex2i(x0+x0-x,y0+y0-y)
glVertex2i(y0+y0-y,x0+x0-x)

def DrawLines(x0,y0,xn,yn): #数值微分法画直线
dx = float(xn) - float(x0)
dy = float(yn) - float(y0)
steps = 0
deltaX = 0
deltaY = 0
x = x0
y = y0
if(abs(dx) > abs(dy)):
steps = int(fabs(dx)*100)
else:
steps = int(fabs(dy)*100)
deltaX = dx / float(steps)
deltaY = dy / float(steps)
glBegin(GL_POINTS)
for i in range(steps):
x += deltaX
y += deltaY
glVertex2f(x, y)
glEnd()
h=0
m=0
s=0
def Update():
global h,m,s
t=time.localtime(time.time())
h=int(time.strftime('%H',t))
m=int(time.strftime('%M',t))
s=int(time.strftime('%S',t))
glutPostRedisplay()

glutInit()
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)
glutInitWindowPosition(200,200)
glutInitWindowSize(400,400)
glutCreateWindow("Three Window")
glOrtho(-20,20,-20,20,1.0,-1.0)
glutDisplayFunc(Display)
glutIdleFunc(Update)
glutMainLoop()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息