'''HilbertCurve.py Demonstrates the use of recursion to produce an image that represents an approximation of the fractal Hilbert curve. ''' WIN = pmNewComputedImage('Hilbert Curve'',256,256,'rgb(255, 200,200)') XPEN = None; YPEN = None PENCOLOR = (0,0,128) # Dark blue # First we define two graphics primitives: moveTo and lineTo. def moveTo(x,y): global XPEN, YPEN XPEN = x; YPEN = y def lineTo(endX,endY): if XPEN==None or YPEN==None: moveTo(endX, endY); return (R,G,B)=PENCOLOR dx = endX-XPEN; dy=endY-YPEN if abs(dx)>abs(dy): if dx>0: xstart = XPEN; ystart = YPEN else: xstart = endX; ystart = endY for i in range(abs(dx)+1): x = xstart+i y = ystart+int(i*dy/dx) pmSetPixel(WIN, x, y, R, G, B) else: if dy>0: ystart = YPEN; xstart = XPEN else: ystart = endY; xstart = endX for i in range(abs(dy)+1): y = ystart+i x = xstart+int(i*dx/dy) pmSetPixel(WIN, x, y, R, G, B) XPEN=endX; YPEN=endY def hilbert(x, y, ux, uy, vx, vy, k): if k==0: lineTo(x + (ux+vx)/2, y + (uy+vy)/2) else: hilbert(x, y, vx/2, vy/2, ux/2, uy/2, k-1) hilbert(x+ux/2, y+uy/2, ux/2, uy/2, vx/2, vy/2, k-1) hilbert(x+ux/2+vx/2, y+uy/2+vy/2, ux/2, uy/2, vx/2, vy/2, k-1) hilbert(x+ux/2+vx, y+uy/2+vy, -vx/2, -vy/2, -ux/2, -uy/2, k-1) hilbert(0, 0, 256, 0, 0, 256, 7)