Rekurzivne krivulje


; Logo
; Example: ReCurves
;
; Collection of recursive curves:
;  Andromeda, Hilbert, Dragon, Knuth,
;  Peano, Sierpinski, Tree, Wirth, Cage,
;  4 x Dragon, Trees
;
; (c)1988,1991 V. Batagelj
; adaptation LCSI/LogoS  21. maj 1991
; adaptation MSW Logo    18. jan 1996

TO Hilb :n :a :h
   IF :n = 0 [ STOP ]
   RT :a Hilb :n - 1 (-:a) :h FD :h LT :a Hilb :n - 1 :a :h FD :h
   Hilb :n - 1 :a :h LT :a FD :h Hilb :n - 1 (-:a) :h RT :a
END

TO Hilbert
   PU SETPOS [-150 -150] PD SETPC [000 000 255]
   Hilb 5 90 10
END

TO Drag :n :a :h
   IF :n < 1 [ FD :h STOP ]
   Drag :n - 1 90 :h RT :a Drag :n - 1 -90 :h
END

TO Dragon
   PU SETPOS [ -60 -100 ] PD LT 90
   SETPC [255 000 000] SetPenSize [2 2]
   Drag 11 90 7
END

TO Dragons
   MAKE "c [ [255 000 000] [000 2555 000] [000 000 255] [000 255 255] ]
   SetPenSize [2 2] MAKE "k 0
   REPEAT 4 [
      PU HOME PD RT 90 * :k MAKE "k :k + 1 SETPC ITEM :k :c
      Drag 11 90 5
   ]
END

to follow :tr1 :tr2
   SetTurtle :tr2
   Make "T Pos
   SetTurtle :tr1
   SETH Towards :T
   FD 2
end

to Andromeda
   SetScreenColor [150 150 150]
   SetTurtle 1 PU SETPOS [ -170 -170] PD
   SetTurtle 2 PU SETPOS [ -170  170] PD
   SetTurtle 3 PU SETPOS [  170  170] PD
   SetTurtle 4 PU SETPOS [  170 -170] PD
   repeat 170 [
      SetPC [000 000 255] follow 1 2
      SetPC [255 000 000] follow 2 3
      SetPC [255 255 000] follow 3 4
      SetPC [255 000 255] follow 4 1
   ]
end

TO Knu :n :a :t :h
   IF :n = 0 [ RT 45 + :t FD :h LT 45 + :t STOP ]
   RT 2 * :t + :a Knu :n - 1 2 * :t (-:t) :h
   RT 45 - 3 * :t - :a FD :h  LT 45 - :t + :a
   Knu :n - 1 0 (-:t) :h RT :a
END

TO Knuth
   PU SETPOS [ 250 -130 ] PD LT 90
   SETPC [255 255 255] SetScreenColor [000 000 000]
   Knu 9 -90 45 8
END

TO Pean :n :a :h
   IF :n = 0 [STOP]
   RT :a Pean :n - 1 (-:a) :h FD :h Pean :n - 1 :a :h
   FD :h Pean :n - 1 (-:a) :h LT :a
END

TO Peano
   PU SETPOS [ -150 -160 ] PD SETPC [255 000 000] SetScreenColor [000 255 000]
   Pean 6 90 12
END

TO Sierp :n :a :h :k
   IF :n = 0 [ FD :k STOP ]
   RT :a Sierp :n - 1 (-:a) :h :k LT :a FD :h
   LT :a Sierp :n - 1 (-:a) :h :k RT :a
END

TO Sierpinski
   PU SETPOS [ -160 -170 ] PD SETPC [200 000 200] SetScreenColor [255 255 000]
   REPEAT 4 [ Sierp 7 45 12/sqrt 2 10 RT 45 FD 12/sqrt 2 RT 45 ]
   SetFloodColor [000 255 000] PU SetPos [-155 -170] PD FILL
END

TO Tr :n :h :q
   IF :n = 0 [ STOP ]
   FD :h LT 90  Tr :n - 1 :q * :h :q LT 90 FD 2 * :h  LT 90
   Tr :n - 1 :q * :h :q LT 90 FD :h
END

TO Tree
   HOME RT 90 SETPC [0 0 0] SetScreenColor [255 255 000]
   Tr 10 120 1 / sqrt 2
END

TO wi :n :a :h :k
   IF :n = 0 [ FD :h STOP ]
   RT :a iw :n (-:a) :h :k LT :a FD :h
   LT :a iw :n (-:a) :h :k RT :a
END

TO iw :n :a :h :k
   RT :a wi :n - 1 (-:a) :h :k FD :k LT 2 * :a
   FD :k wi :n - 1 (-:a) :h :k RT :a
END

TO Wirth
   PU SETPOS [ -155 -153 ] PD SETPC [0 0 0] SetScreenColor [150 150 255]
   REPEAT 4 [ wi 4 45 7 3 FD 3 RT 90 FD 3 ] PU
   SetFloodColor [255 255 0] PU SetPos [-150 -150] PD FILL
END

TO TWO :a :c :w
   IF :c < 1 [ STOP ]
   RT :a FD 1 RT :a FD :w LT :a IF :c > 1 [FD 1]
   LT :a FD :w TWO :a :c - 2 :w
END

TO Square :a :h :w
   FD :w TWO :a :h - 1 :w
END

TO Cag :n :a :w :h
   IF :n = 0 [ Square :a :h :w STOP ]
   RT :a Cag :n - 1 (-:a) :h/4 :w FD :h/8
   Cag :n - 1 :a :h/4 :w FD :h/8
   Cag :n - 1 (-:a) :h/4 :w LT :a
END

TO Cage
   PU SETPOS [ -160 -160 ] PD SETPC [0 0 0] SetScreenColor [255 100 100]
   Cag 4 90 320 320
END

TO Leaf
   RT 30 FD :d LT 120 FD :d LT 120 FD :d LT 150
END

TO TreeB :n :a
   IF :n < 1 [ FD (:a/4) SETPC :l Leaf SETPC :t PU BK (:a/4) PD STOP ]
   TreeA :a/3 0.75*:a  30 :n
   TreeA :a/3 0.65*:a -35 :n
   TreeA :a/3 0.50*:a  45 :n
   PU BK :a PD
END

TO TreeA :s :a :r :n
   FD :s RT :r
   (IF (:q < RANDOM 10) [MAKE "k 2] [MAKE "k 1])
   TreeB (:n - :k) :a
   LT :r
END

TO Trees
   MAKE "q 8 HT SetScreenColor [80 200 80]; RANDOMIZE
   MAKE "l [255 255 0] MAKE "t [0 0 0] MAKE "d 6 SETPC :t
   PU SETPOS [ -90 -160 ] PD SETH 0 TreeB 5 190
   MAKE "l [255 0 255] MAKE "t [255 0 0] MAKE "d 8 SETPC :t
   PU SETPOS [ 180 -100 ] PD SETH 0 TreeB 3 100
END

to GoodBye
   WindowDelete "SelWin
   SetScreenColor [255 255 255] SetPC [000 000 000] SetPenSize [1 1] cs
end

TO ReCurves
   CS HT
   WindowCreate "main "SelWin "Curves 0 0 80 200 []
   staticcreate "SelWin "st14 [Select a curve] 10 10 55 10
   ListBoxCreate "SelWin "SelList 10 25 55 100
   ListBoxAddString "SelList [Hilbert]
   ListBoxAddString "SelList [Sierpinski]
   ListBoxAddString "SelList [Trees]
   ListBoxAddString "SelList [Cage]
   ListBoxAddString "SelList [Andromeda]
   ListBoxAddString "SelList [Dragon]
   ListBoxAddString "SelList [Knuth]
   ListBoxAddString "SelList [Peano]
   ListBoxAddString "SelList [Dragons]
   ListBoxAddString "SelList [Tree]
   ListBoxAddString "SelList [Wirth]
   buttoncreate "SelWin "b1 "Exit  10 170 55 10 [GoodBye]
   buttoncreate "SelWin "b3 "Clear 10 155 55 10 [
      SetScreenColor [255 255 255] SetPC [000 000 000] SetPenSize [1 1] cs
   ]
   buttoncreate "SelWin "b2 "Draw  10 140 55 10 [
      SetPenColor [0 0 0] SetPenSize [2 2] SetScreenColor [255 255 255]
      PU Home PD CS HT
      Run  ListBoxGetSelect "SelList
   ]
END