Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frage zur Kochkurve (https://www.delphipraxis.net/93640-frage-zur-kochkurve.html)

gnui 8. Jun 2007 19:40


Frage zur Kochkurve
 
Hi, also ich beschäftige mich zur zeit mit rekursionsgrafiken und im speziellen mit der kochkurve

doch so ganz kappiere ich das nicht

1. problem

Delphi-Quellcode:
procedure koch (ordnung: Integer; laenge, winkel: Real);
begin
if ordnung = 0
then
begin
x := x+laenge*cos(winkel);
y := y-laenge*sin(winkel);
PaintBox.Canvas.LineTo (Round(x), Round(y));
end
else
begin
koch (ordnung-1, laenge / 3, winkel);
winkel := winkel + pi / 3;
koch (ordnung-1, laenge / 3, winkel);
winkel := winkel - 2 * pi / 3;
koch (ordnung-1, laenge / 3, winkel);
winkel := winkel + pi / 3;
koch (ordnung-1, laenge / 3, winkel);
end;
end;
müsste es hier nicht so sein dass die procedur immerwieder schon beim ersten koch aufruf nach begin wiederholt wird und die darauffolgenden befehle garnicht an die reihe kommen? schließlich wird schon mit dem 1. befehl die procedur erneut aufgerufen, eben bis die ordnung = 0 ist
versteh nicht wie die darauffolgenden befehle aufgerufen werden können, vllt nur ein denkfehler von mir irgendwie


2. problem
ja mein 2. problem ist eigentlich das mit den winkel und dem pi, wie kommt man auf die formel die den winkel ändern lässt und warum 2 mal die gleiche formel und dazwischen eine andere? selbst würdich da wohl nie draufkommen


ja das wärs auch, den rest versteh ich soweit
hab leider kein schönes tutorial gefunden in dem mal richtig das ganze erklärt wurde und musste es mir deswegen soweit nur an dem quellcode beibringen

ich hoffe hier kann mir wer helfen

danke schonmal
mfg gnui

Khabarakh 8. Jun 2007 19:48

Re: Frage zur Kochkurve
 
Zu den Winkeln: Das sind einfach die Bogenmaß-Äquivalente zu +60°, -120° und wiederum +60°, die Winkel beim Durchlaufen einer "Koch-Zacke".

Matze 8. Jun 2007 20:26

Re: Frage zur Kochkurve
 
Hi, herzlich Willkommen!

Zitat:

Zitat von gnui
müsste es hier nicht so sein dass die procedur immerwieder schon beim ersten koch aufruf nach begin wiederholt wird und die darauffolgenden befehle garnicht an die reihe kommen? schließlich wird schon mit dem 1. befehl die procedur erneut aufgerufen, eben bis die ordnung = 0 ist
versteh nicht wie die darauffolgenden befehle aufgerufen werden können, vllt nur ein denkfehler von mir irgendwie

Zugegeben, Rekursionen sind komplexer, als sich vermuten lässt. Ich versuche es mal bewusst sehr einfach auszudrücken:
Jede Prozedur/Funktion läuft im Prinzip von vorne bis hinten durch, da diese nicht vorzeitig verlassen wird. Ruft eine Prozedur sich selbst auf, wir der nachfolgende Code erst einmal ignoriert, jedoch nach Eintreten der Abbruchbedingung, die dafür sorgt, dass die Selbstaufrufe nicht mehr stattfinden, von hinten nach vorne abgearbeitet.

Der Grund hierbei liegt im Stack. Es wird sukzessive bei den Selbstaufrufen etwas in den Stack geschrieben und dieser wird dann wieder rückwärts geleert bzw. abgearbeitet.
Bildlich kannst du dir einen Stack (einen Speicher) vorstellen wie eine sehr schmale Sackgasse. Es fahren Autos hinein, doch ein Umdrehen ist nicht möglich. Daher müssen die zuletzt eingefahrenen Autos zuerst wieder entfernt werden, um ans erste Auto zu kommen.

gnui 8. Jun 2007 20:43

Re: Frage zur Kochkurve
 
ok vielen dank, hab mir das ganze mal im einzelschrittmodus mit variablenüberwachung angesehn und nun kappier ich die ganze reihenfolge in der prozedur

und mit dem bogenmaß ist nun auch logisch, werd mir da vllt ne funktion schreiben so dass ich in der prozedur zum besseren verständnis die gradzahl reinschreiben kann

gnui 9. Jun 2007 09:35

Re: Frage zur Kochkurve
 
noch eine frage
wie kommt man dadrauf:
Delphi-Quellcode:
 x := x+laenge*cos(winkel);
y := y-laenge*sin(winkel);
weiß nicht was ich damit anfangen soll, also wie ich da selber hätte draufkommen können

Kroko1999 9. Jun 2007 12:17

Re: Frage zur Kochkurve
 
Zitat:

Zitat von gnui
ok vielen dank, hab mir das ganze mal im einzelschrittmodus mit variablenüberwachung angesehn und nun kappier ich die ganze reihenfolge in der prozedur

und mit dem bogenmaß ist nun auch logisch, werd mir da vllt ne funktion schreiben so dass ich in der prozedur zum besseren verständnis die gradzahl reinschreiben kann

Dafür gibt es in der Unit Math die func. DegToRad und RadToDeg!
Zitat:

Zitat von gnui
noch eine frage
wie kommt man dadrauf:
Delphi-Quellcode:
 x := x+laenge*cos(winkel);
y := y-laenge*sin(winkel);
weiß nicht was ich damit anfangen soll, also wie ich da selber hätte draufkommen können

Drehung im 2D-Fall, mal Wikipedia befragen bzw. ebene Polarkoordinaten!

gnui 9. Jun 2007 14:38

Re: Frage zur Kochkurve
 
ok danke werd ich machen
meine funktion zru umwandlung klappt auch, aber so is natürlich bequemer^^

gnui 10. Jun 2007 18:27

Re: Frage zur Kochkurve
 
könnte mir vllt jemand noch ein wenig erklären wie das in der procedur mit den rekursiven aufrufen aussieht?
ist ziemlich verwirrend finde ich

ich versteh dass so das je höher die ordnung desto öfter wird der erste rekursive aufruf irgendwie durchlaufen und so oft wird die strecke geteilt, in jedem teilabschnitt werden dann durch die anderen rekursiven aufrufe die formen eingefügt
aber so richtig ist mir das eben nicht klar

Kroko1999 10. Jun 2007 19:29

Re: Frage zur Kochkurve
 
Gehe die Procedure mal mit dem Debugger durch, beobachte Bild und Variablen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz