
Hi, I have been learning python and I have recently written a little program that creates Hilbert curves which I submit to this list for critique and review: # Hilbert Curve # David Zuccaro # 18/09/2014 import sys import pygame import math class cursor: def __init__(self, a): # a should be a list of 2 numbers ie a point. self.a = a def line(self, a): # draw a line from he current position from the new position; update current position pygame.draw.lines(window, (255, 255, 255), True, [[self.a[0], self.a[1]], [self.a[0] + a[0], self.a[1] + a[1]]], 1) self.a[0] = self.a[0] + a[0] self.a[1] = self.a[1] + a[1] def hilbert(self, kind, order): row = ((1,0,0,2), (0,1,1,3), (3,2,2,0), (2,3,3,1)) # hilbert curve definition table 0 = A 1 = B ... dir = ((0,3,2), (3,0,1), (1,2,3), (2,1,0)) # definition of A, B, C, D orient = ((0,-1), (-1,0), (0,1), (1,0)) # definition of up, left, down, right dist = 30 # length of segment if order > 0: for j in range(4): self.hilbert(row[kind][j], order - 1) # keep on hilberting until order = 0 if j < 3: self.line([x * dist for x in orient[dir[kind][j]]]) #this was the previous code but I thought it would be cleaner if # more abstruse to do this all in one line ^ # if dir[kind][j] == 0: # self.line(0, -dist) #up # if dir[kind][j] == 1: # self.line(-dist, 0) #left # if dir[kind][j] == 2: # self.line(0,dist) #down # if dir[kind][j] == 3: # self.line(dist, 0) #right pygame.init() #create the screen window = pygame.display.set_mode((1900, 1000)) david = cursor([10,970]) # starting point increasing y moves down screen david.hilbert(0, 5) # create a fifth order hilbert curve #draw it to the screen pygame.display.flip() #input handling (somewhat boilerplate code): while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit(0) #end Output is here: http://members.optuszoo.com.au/~david.zuccaro/hilbert2.png https://en.wikipedia.org/wiki/Hilbert_curve