Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Spirale rekursiv zeichnen
Tigu - Mi 29.03.06 14:25
Titel: Spirale rekursiv zeichnen
Hallo!
Ich muss ein Programm schreiben, was rekursiv eine Spirale zeichnet.
Den größten Teil des Quelltextes habe ich schon fertig:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.BnzeichnenClick(Sender: TObject); var h,w:integer; procedure zeichnen(x1,x2,x3,x4,y1,y2,y3,y4:integer); begin image1.Canvas.LineTo(x1,y1); image1.Canvas.LineTo(x2,y2); image1.Canvas.LineTo(x3,y3); image1.Canvas.LineTo(x4,y4); zeichnen(?????????????????????); end; begin h:=image1.Height; w:=image1.Width; zeichnen(0,0-spinEditAbstand.Value,w-SpineditAbstand.Value,SpinEditAabstand.Value, SpinEditAbstand.Value,h-SpinEditAbstand.Value,w-SpinEditAbstand.Value, SpinEditAbstand.Value); end; |
aber ich habe keine Idee, was in den Selbstaufruf muss, damit es funktioniert. :(
Ich hoffe, dass mir jemand helfen kann.
Schon einmal danke für die Hilfe
Tigu
Horschdware - Mi 29.03.06 14:40
... bist du dir darüber im Klaren, dass die sich selbst aufrufende Zeichne - Prozedur gar keine Abbruchbedingung hat, d.h. immer und immer weiterlaufen wird? Nur so am Rande...
alzaimar - Mi 29.03.06 14:45
Eine Spirale ist doch kein rekursives Objekt... :shock:
Ist das eine Schulaufgabe? Na, den Lehrer würde ich mir mal gerne vorknöpfen tss, tss, tss.
Na gut, wenn es denn aber sein muss:
Ich würde mir mal überlegen, wie ich eine Spirale in kleinste Einheiten zerlegen kann, die dann hintereinander aufgerufen werden.
Bei einer Linie ginge das so:
Quelltext
1: 2: 3: 4:
| Linie Zeichnen (Von, Nach) P := 1/10000 der Strecke Von-Nach DrawLine (Von, P) Zeichnen (P, Nach) |
Das ist zwar absolut bescheuert, aber (Primitiv-)Rekursiv. Siehe auch dazu den wiki-Artikel.
Tigu - Mi 29.03.06 14:50
Ja, ist ne Schulaufgabe und der Anfang ist angeblich richtig so.
Ich glaube,es sollen immer wieder die 4 Lienen geezichnet werden(die 4Linien stimmen so in ihrer PRogramierung), aber weil ich nicht weiß wie ich ihm das sgen soll, habe ich den Selbstaufruf noch nicht.
alzaimar - Mi 29.03.06 15:00
Ich glaub, da ist ein kleiner Fehler drin, aber egal. Den findest Du dann schon. So, Rekursiv zeichnen:
Du hast einen Ausgangspunkt (P0).
Von da zeichnest Du
1. um h Einheiten nach unten, dann
2. um w Einheiten nach rechts, dann
3. um h-d Einheiten nach oben und dann
4. um w-d Einheiten nach links.
(Mach das mal mit einem Stift)
Nun bist Du an einem neuen Ausgangspunkt, von dem Du o.g. Geschicht wiederholen kannst, allerdings mit kleinerem w und h.
Damit hättest Du eine Den-Lehrer-peitsch-ich-bis-er-lacht-Primitiv-Rekursion.
Also wäre das so etwas
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Spirale (x0, y0, w, h, d : Integer); Move(x0,y0) DrawDown (h) DrawRight (w) DrawUp (h-d) DrawLeft (w-d) P := CurrentPoint Spirale (P.x, P.y, w-2*d, h-2*d, d) |
F34r0fTh3D4rk - Mi 29.03.06 15:05
in gewisser Weise ist auch eine Spirale ein Fraktal.
Ich würde das ganze mit einer Turtle Grafik umsetzen, indem du dann einfach sagst 90 grad nach rechts und die strecke nach vorne und diese dann immer verkürzen, die abbruchbedingung ist dann, wenn die strecke 1px erreicht hat.
Such mal nach
TURTLE da solltest du was finden, ansonsten kann ich dir auch meine Facharbeit über Rekursive Algorithmik ans Herz legen, in der es zwar nicht sehr um Methodik geht, aber viele Beispiele erklärt sind.
alzaimar - Mi 29.03.06 15:08
@fear: So hab ich das doch erklärt (nur das ich nicht sehe, das eine Spirale ein rekursives/fraktales Objekt ist)...
F34r0fTh3D4rk - Mi 29.03.06 15:10
Doch eine Spirale (eine endlose Spirale) ist schon ein Fraktal, da selbstähnlich und endlos. ich denke das reicht um ein Fraktal zu definieren, auch wenn nur ein selbstaufruf stattfindet
alzaimar - Mi 29.03.06 15:57
Na gut :cry: . Da ist ja dann auch eine Linie ein Fraktal, ein rekursives Objekt, selbstähnlich und endlos.
Tigu - Mi 29.03.06 16:08
@alzaimar
Danke für deine Hilfe, aber ein paar Fragen habe ich noch zu dem Quelltext:
1. d ist der Abstand oder?
2. was sagt CurrentPoint? (in der Delphi-Hilfe nichts brauchbares gefunden)
3. Ist es richtig, dass dieser Teil die Rekursion-Procedure ist?
Dann muss ich ja darunter, außere Procedure, noch einmal Spirale..... schreiben oder
fällt das in diesem Fall weg? Wenn es weg fällt, wo weise ich dann h,w... zu?
F34r0fTh3D4rk - Mi 29.03.06 17:14
alzaimar hat folgendes geschrieben: |
| Na gut :cry: . Da ist ja dann auch eine Linie ein Fraktal, ein rekursives Objekt, selbstähnlich und endlos. |
EINE linie nicht, zumindest eine Gerade nicht, ein Dreieck ist ja auch nicht gleich ein Sierpinski Dreieck, mehrere immer kleiner werdende Strecken aufeinander schon, würde man aber nicht sehen, also nicht wirklich sehr fraktal, die Spirale stößt schon an die Grenze der Definition.
CurrentPoint ist eine Variable, such am besten mal nach Turtle, da findest du die eine oder andere Vorlage, wie das (mathematisch) zu lösen ist.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!