hilbert.py

Created by jeclarim

Created on April 21, 2018

1.32 KB

fractal Hilbert curve


from kandinsky import *

def draw_line(x, y, dx, dy, c):
  if dx == 0:
    if dy > 0:
      y1, y2 = y, y+dy+1
    else:
      y1, y2 = y+dy, y+1
    for y0 in range(y1, y2):
      set_pixel(x, y0, c)
    y += dy
  else:
    if dx > 0:
      x1, x2 = x, x+dx+1
    else:
      x1, x2 = x+dx, x+1
    for x0 in range(x1, x2):
      set_pixel(x0, y, c)
    x += dx
  return x, y

def hilbert(n=5, dx=5, dy=0, x=5, y=5, a=90, c=color(0,0,0)):
  if n == 0:
    pass
  elif a == 90:
    dx, dy = -dy, dx
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, -90, c)
    x, y = draw_line(x, y, dx, dy, c)
    dx, dy = dy, -dx
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, 90, c)
    x, y = draw_line(x, y, dx, dy, c)
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, 90, c)
    dx, dy = dy, -dx
    x, y = draw_line(x, y, dx, dy, c)
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, -90, c)
    dx, dy = -dy, dx
  else:
    dx, dy = dy, -dx
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, 90, c)
    x, y = draw_line(x, y, dx, dy, c)
    dx, dy = -dy, dx
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, -90, c)
    x, y = draw_line(x, y, dx, dy, c)
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, -90, c)
    dx, dy = -dy, dx
    x, y = draw_line(x, y, dx, dy, c)
    x, y, dx, dy = hilbert(n-1, dx, dy, x, y, 90, c)
    dx, dy = dy, -dx
  return x, y, dx, dy