需要OpenGL库:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl
#coding:utf-8
from OpenGL.GL import *
from OpenGL.GLUT import *
class fractal(object):
def __init__(self):
self.points=[]
def get(self):
return self.points
def gls(self):
list1=glGenLists(1)
glNewList(list1,GL\_COMPILE)
glBegin(GL\_LINE\_STRIP)
for l in self.points:
glVertex2fv(l)
glEnd()
glEndList()
return list1
def hilbert(self,lb,rt,n,tr=0):
if n==5:
if tr:
dx=(rt\[0\]-lb\[0\])/4.
dy=(rt\[1\]-lb\[1\])/4.
self.points.append(\[lb\[0\]+dx,lb\[1\]+dy\])
self.points.append(\[lb\[0\]+3\*dx,lb\[1\]+dy\])
self.points.append(\[rt\[0\]-dx,rt\[1\]-dy\])
self.points.append(\[lb\[0\]+dx,lb\[1\]+3\*dy\])
return
dx=(rt\[0\]-lb\[0\])/4.
dy=(rt\[1\]-lb\[1\])/4.
self.points.append(\[lb\[0\]+dx,lb\[1\]+dy\])
self.points.append(\[lb\[0\]+dx,lb\[1\]+3\*dy\])
self.points.append(\[rt\[0\]-dx,rt\[1\]-dy\])
self.points.append(\[lb\[0\]+3\*dx,lb\[1\]+dy\])
return
dx=(rt\[0\]-lb\[0\])/2.
dy=(rt\[1\]-lb\[1\])/2.
if not tr:
self.hilbert(lb,\[lb\[0\]+dx,lb\[1\]+dy\] ,n+1,1)
self.hilbert(\[lb\[0\],lb\[1\]+dy\],\[rt\[0\]-dx,rt\[1\]\], n+1)
self.hilbert(\[rt\[0\]-dx,rt\[1\]-dy\],rt, n+1)
self.hilbert(\[rt\[0\],rt\[1\]-dy\],\[rt\[0\]-dx,lb\[1\]\], n+1,1)
if tr:
self.hilbert(lb,\[lb\[0\]+dx,lb\[1\]+dy\] ,n+1)
self.hilbert(\[lb\[0\]+dx,lb\[1\]\],\[rt\[0\],rt\[1\]-dy\], n+1,1)
self.hilbert(\[rt\[0\]-dx,rt\[1\]-dy\],rt, n+1,1)
self.hilbert(\[rt\[0\]-dx,rt\[1\]\],\[lb\[0\],rt\[1\]-dy\], n+1)
def Draw():
global list1
glClear(GL_COLOR_BUFFER_BIT)
#glColor3f(0,1.,0)
glCallList(list1)
glutSwapBuffers()
def onreshape(w,h):
if min(w,h)<1:
w,h=1,1
s=6.
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glViewport(0,0,w,h)
glOrtho(-s,s,-s*float(h)/w,s*float(h)/w,0,10)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
if __name__=="__main__":
k=fractal()
k.hilbert([-5.,-5.],[5.,5.],0)
s=k.get()
print(len(s),s)
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
glutInitWindowSize(256, 256)
glutCreateWindow("hilbert")
list1=k.gls()
glutDisplayFunc(Draw)
glutReshapeFunc(onreshape)
#glutIdleFunc(Draw)
glutMainLoop()
手机扫一扫
移动阅读更方便
你可能感兴趣的文章