hilbert-curve.tex 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. % Author: Marc van Dongen
  2. % Source: http://www.texample.net/tikz/examples/hilbert-curve/
  3. \newdimen\HilbertLastX
  4. \newdimen\HilbertLastY
  5. \newcounter{HilbertOrder}
  6. \def\DrawToNext#1#2{%
  7. \advance \HilbertLastX by #1
  8. \advance \HilbertLastY by #2
  9. \pgfpathlineto{\pgfqpoint{\HilbertLastX}{\HilbertLastY}}
  10. % Alternative implementation using plot streams:
  11. % \pgfplotstreampoint{\pgfqpoint{\HilbertLastX}{\HilbertLastY}}
  12. }
  13. % \Hilbert[right_x,right_y,left_x,left_x,up_x,up_y,down_x,down_y]
  14. \def\Hilbert[#1,#2,#3,#4,#5,#6,#7,#8] {
  15. \ifnum\value{HilbertOrder} > 0%
  16. \addtocounter{HilbertOrder}{-1}
  17. \Hilbert[#5,#6,#7,#8,#1,#2,#3,#4]
  18. \DrawToNext {#1} {#2}
  19. \Hilbert[#1,#2,#3,#4,#5,#6,#7,#8]
  20. \DrawToNext {#5} {#6}
  21. \Hilbert[#1,#2,#3,#4,#5,#6,#7,#8]
  22. \DrawToNext {#3} {#4}
  23. \Hilbert[#7,#8,#5,#6,#3,#4,#1,#2]
  24. \addtocounter{HilbertOrder}{1}
  25. \fi
  26. }
  27. % \hilbert((x,y),order)
  28. \def\hilbert((#1,#2),#3){%
  29. \advance \HilbertLastX by #1
  30. \advance \HilbertLastY by #2
  31. \pgfpathmoveto{\pgfqpoint{\HilbertLastX}{\HilbertLastY}}
  32. % Alternative implementation using plot streams:
  33. % \pgfplothandlerlineto
  34. % \pgfplotstreamstart
  35. % \pgfplotstreampoint{\pgfqpoint{\HilbertLastX}{\HilbertLastY}}
  36. \setcounter{HilbertOrder}{#3}
  37. \Hilbert[1mm,0mm,-1mm,0mm,0mm,1mm,0mm,-1mm]
  38. \pgfusepath{stroke}%
  39. }
  40. \begin{figure}[htp]%
  41. \centering
  42. % draw Hilbert curves of order n=1,...,5
  43. % Warning! Curves with order > 6 may crash TeX
  44. \subfloat[$n=1$]{\tikz[scale=18] \hilbert((0mm,0mm),1);}~~
  45. \subfloat[$n=2$]{\tikz[scale=6] \hilbert((0mm,0mm),2);}~~
  46. \subfloat[$n=3$]{\tikz[scale=2.6] \hilbert((0mm,0mm),3);}~~
  47. \subfloat[$n=4$]{\tikz[scale=1.2] \hilbert((0mm,0mm),4);}~~
  48. \subfloat[$n=5$]{\tikz[scale=0.58] \hilbert((0mm,0mm),5);}%
  49. \caption{Hilbert-Kurve}\xindex{Hilbert-Kurve}
  50. \label{fig:hilbert-curve}
  51. \end{figure}%