Pythagorasbaum

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Pythagorasbaum

    Hallo,

    versuche gerade ein Pythagorasbaum zu code aber irgrendwie komm ich noch nicht sehr weit das ganze auch rekursiv zu machen. :(
    hat villeicht jemand ne Idee wie man son Baum coden kann?
    Wäre um jede Hilfe sehr erfreut. :)

    Hier noch mal ein Bild wies aussehen soll: http://de.wikipedia.org/wiki/Bild:Pythagoras_tree_construct_5of5.png
  • die Ansätze und die Hilfprozeduren hab ich ja schon..
    hier die Ansätze
    (turtles)


    (define ALPHA 30)
    (define BETA (- 90 ALPHA))

    ;; approximations for the length of the cathetus,
    ;; consumes the length of the hypothenusis
    ;; get-b: num -> num
    ;; get-a: num -> num
    (define (get-b c)
    (* c (sin (* (/ ALPHA 180) 3.14))))


    (define (get-a c)
    (* c (sin (* (/ BETA 180) 3.14))))

    ;; purpose: paints a triangle with the given base length x and given angle ALPHA
    ;; and returns the turtle to its starting position
    ;; contract: triangle: num -> does not matter
    (define (paintTriangle a)
    (list
    (draw a)
    (turn (+ 90 ALPHA))
    (draw (get-b a) )
    (turn 90)
    (draw (get-a a))
    (turn (- 180 ALPHA))))



    (define (pythagoras-step a)
    (list

    (draw a)
    (turn 90)
    (draw a)
    (turn 90)
    (draw a)
    (turn 180)
    (paintTriangle a)
    (turn -90)
    (draw a)
    (turn 180)
    (move a)
    (turn -60)
    ))

    fehlt nur noch der eigentliche Baum mit der Rekursion...:)
  • Hallo,

    mit Rekursion ist das nicht so schwer. Also du brauchst nur eine Funktion f schreiben, die dir ein Quadrat mit einer bestimmten Kantenlänge x und obendrauf ein rechtwinkliges Dreieck zeichnet. Statt die beiden Katheten im Dreieck als normale Linie zu zeichnen, rufst du dort einfach rekursiv die Funktion f wieder auf, allerdings mit der richtigen Katheten-Länge (kann man einfach ausrechnen). Wichtig ist dabei die Richtung der Turtle beim Funktionsbeginn und beim Funktionsende, sowie vor und nach den rekursiven Aufrufen. Am leichtesten ist es da, wenn die Turtle nach dem Aufruf der Funktion f in die gleiche Richtung zeigt wie vorher, nur um die Länge x weiter nach vorne steht.

    Hoffe das war einigermaßen verständlich. :)

    Edit: Kannst du mal posten, wo du die Turtle-Bibliothek herhast?


    Viele Grüße,

    Siracusa
  • Hallo,

    du braucht dir nur zu überlegen, an welcher Stelle im Baum man wieder anfangen müßte, einen neuen Baum zu zeichnen. In diesem Falle wären das die beiden Katheten des Dreiecks, d.h. du brauchst in der Funktion paintTriangle nur die entsprechenden draw-Befehle durch einen rekursiven Aufruf von pythagoras-step ersetzen. Und dann muß noch irgendwo ein Rekursionsende rein, z.B. bei einer Minimallänge, damit du keine Endlosrekursion bekommst. Das könnte man auch in der Funktion paintTriangle machen, daß also nur ein rekursiver Funktionsaufruf erfolgt, wenn die Länge größer 1 ist oder so.


    Viele Grüße,

    Siracusa