# Hilbert curve
# %n level
# http://www.fundza.com/algorithmic/space_filling/hilbert/basics/

Options {
  PaperSize 4
  Limits {
	#Portrait
 }
  Mode Select
}



define hilbert [ %x %y %xi %yi %xj %yj %n ] {
 IfEqual %n 0
    Line  ( %x  + ( %xi + %yi ) / 2 )  ( %y  + ( %xj + %yj ) / 2 )
  Else ( (
    hilbert [ %x %y  ( %yi / 2 )  ( %yj / 2 )  ( %xi / 2 )  ( %xj / 2 )  ( %n - 1 ) ]
    hilbert [ ( %x + ( %xi / 2 ) ) ( %y + ( %xj / 2 ) ) ( %xi / 2 ) (  %xj / 2 ) ( %yi / 2 )  ( %yj / 2 ) ( %n - 1 ) ]
    hilbert [ ( %x + ( %xi / 2 ) + ( %yi / 2 ) ) ( %y + ( %xj / 2 ) + ( %yj / 2 ) ) ( %xi / 2 )  ( %xj / 2 ) ( %yi / 2 )  ( %yj / 2 ) ( %n - 1 ) ]
    hilbert [ ( %x + ( %xi / 2 ) + %yi ) ( %y + ( %xj / 2 ) + %yj ) ( - %yi / 2 ) ( - %yj / 2 ) ( - %xi / 2 ) ( - %xj / 2 ) ( %n - 1 ) ]

  )  ) EndIf
}

( ( $x0 := 10  $y0 := 10
    $xi := 500  $yj := 500   $n := 6
  ) )

path {
  fillcolour 238 210 255
  #outlinecolour none
  # point de terminaison
   Move    (  $x0  + ( $xi / ( 2 ^ ( $n + 1 ) ) ) )  (  $y0 + ( $yj / ( 2 ^ ( $n + 1 ) ) ) )
   hilbert [ $x0 $y0 $xi 0 0 $yj $n ]
   #close
}


