Autor Beitrag
Tigu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 93

XP
Delphi 7
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 29.03.06 15: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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 93

XP
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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 Suche in: Delphi-Forum, Delphi-Library 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 29.03.06 16:57 
Na gut :cry: . Da ist ja dann auch eine Linie ein Fraktal, ein rekursives Objekt, selbstähnlich und endlos.

_________________
Na denn, dann. Bis dann, denn.
Tigu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 93

XP
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 29.03.06 18:14 
user profile iconalzaimar 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.