Autor |
Beitrag |
Tigu
      
Beiträge: 93
XP
Delphi 7
|
Verfasst: Mi 29.03.06 15:25
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
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Mi 29.03.06 15: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...
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 29.03.06 15:45
Eine Spirale ist doch kein rekursives Objekt...
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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Tigu 
      
Beiträge: 93
XP
Delphi 7
|
Verfasst: Mi 29.03.06 15: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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 29.03.06 16: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) |
_________________ Na denn, dann. Bis dann, denn.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 29.03.06 16: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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 29.03.06 16:08
@fear: So hab ich das doch erklärt (nur das ich nicht sehe, das eine Spirale ein rekursives/fraktales Objekt ist)...
_________________ Na denn, dann. Bis dann, denn.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 29.03.06 16: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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 29.03.06 16:57
Na gut  . Da ist ja dann auch eine Linie ein Fraktal, ein rekursives Objekt, selbstähnlich und endlos.
_________________ Na denn, dann. Bis dann, denn.
|
|
Tigu 
      
Beiträge: 93
XP
Delphi 7
|
Verfasst: Mi 29.03.06 17: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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 29.03.06 18:14
alzaimar hat folgendes geschrieben: | Na gut . 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.
|
|
|