AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

problem mit sierpinski- Dreieck

Ein Thema von Gregor00 · begonnen am 20. Jan 2004 · letzter Beitrag vom 22. Jan 2004
Antwort Antwort
Gregor00

Registriert seit: 18. Aug 2003
29 Beiträge
 
Delphi 5 Standard
 
#1

problem mit sierpinski- Dreieck

  Alt 20. Jan 2004, 21:39
hallo erstmal zusammen

also ich habe folgendes problem: ich möchte das sierpinski dreieck mit hilfe der rekursion programmieren.So wie ich es versucht habe funktioniert es allerdings nicht ich kann aber einfach nicht den fehler finden. ich hoffe ihr könnt mir weiterhelfen

Hier ist mein quelltext:


Delphi-Quellcode:
procedure sierpinski (ordnung : Integer; laenge, winkel:Real; a: integer)
var x,y: real;

begin
x := x+laenge*cos(winkel);
y := y-laenge*sin(winkel);
//Form1.PaintBox1.Canvas.LineTo (Round(x),Round(y));

sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,a);
Inc(a);
Form1.paintbox1.Canvas.LineTo(Round(x),Round(y));
If a < (StrToInt(Form1.Combobox1.Text)) then
  sierpinski (ordnung, laenge, winkel,a)
  else
  exit;
end;
//end;


procedure TForm1.Button1Click(Sender: TObject);

var ordnung : Integer;
x, y, laenge, winkel : Real;
a: Integer;

begin
x := 100;
y := 380;
a:= 0;
refresh;
laenge :=400;
winkel :=0;
ordnung := (StrToInt(ComboBox1.Text));
PaintBox1.Canvas.MoveTo (Round(x), Round(y));
sierpinski (ordnung, laenge, winkel,a);
end;
Erklärung:
procedure siepinski... ist die rekursive Procedure, welche über den Button1 (nach Anglicken) aufgerufen wird. Die stufe des dreieckes (bzw. wie oft die rekursion wiederhohlt werden soll) wird in ComboBox1.Text angegeben.
problem: jedesmal kommt die nur zu bekannte fehlermeldung "Stack- überlauf" d.h. Irgendetwas muss mit der Abbruchbedingung nicht stimmen. ich weiß aber nicht was...

also vielen Dank schon mal für alle Antworten
cu gregor
  Mit Zitat antworten Zitat
Gregor00

Registriert seit: 18. Aug 2003
29 Beiträge
 
Delphi 5 Standard
 
#2

Re: problem mit sierpinski- Dreieck

  Alt 21. Jan 2004, 15:31
hat denn hier niemand eine Idee?? ich komme so echt nicht weiter...
was ein sierpinski- dreieck ist ist warscheinlich allen klar, ich bin bestimmt nicht der erste, der soetwas in Informatik programmieren muss...

also bin für alle Kommentare/Hilfen dankbar...
  Mit Zitat antworten Zitat
Benutzerbild von Seniman
Seniman

Registriert seit: 15. Sep 2003
Ort: Münster
98 Beiträge
 
#3

Re: problem mit sierpinski- Dreieck

  Alt 21. Jan 2004, 21:52
Hallo Gregor00,

letztenendes hast du garkeine Abbruchbedingung in deiner Prozedur drin. Denn nämlich gleich zu Beginn wird ohne weitere Abfrage gleich viermal die Prozedur selbst aufgerufen.
Mein Rat:
Lass die Variable "a" weg, dazu hast du ja die Variable "Ordnung". Setz vor die vier Aufrufe die Abfrage
if Ordnung>0 then //usw Den unteren If-Abfrage-Block kannst du ganz weglassen.

Grüße
Seniman
  Mit Zitat antworten Zitat
Gregor00

Registriert seit: 18. Aug 2003
29 Beiträge
 
Delphi 5 Standard
 
#4

Re: problem mit sierpinski- Dreieck

  Alt 22. Jan 2004, 13:22
Hallo Seniman
danke für den Tipp!! hat wirklich funktioniert, jetzt wo ich die Lösung kenne erscheint es mir auch relativ naheliegend, weiß auch nicht warum ich nicht selber darauf gekommen bin...trotzdem nochmal thx...
so richtig funktionieren tut es aber trotzdem noch nicht, das ergebnis sieht noch nicht wirklich wie ein sierpinski- dreieck aus, ist alles irgentwie verzerrt und verschoben...
Vielleicht kann sich jemand noch mal meine Zeichnenanweisungen betrachten:

Code:
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel - 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
winkel := winkel + 2 * pi / 3;
sierpinski (ordnung-1, laenge / 2, winkel,x,y);
hier irgentwo muss noch ein fehler liegen..

cu gregor
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.613 Beiträge
 
#5

Re: problem mit sierpinski- Dreieck

  Alt 22. Jan 2004, 13:40
Ich bin zwar kein Mod, aber dennoch: Neue Frage -> Neuer Thread.

Hilft Dir sicher auch mehr, weil oben steht was von Rekursion, und da lesen dann schon einige nicht mehr weiter, obwohls jetzt ja ums Zeichnen geht...
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.613 Beiträge
 
#6

Re: problem mit sierpinski- Dreieck

  Alt 22. Jan 2004, 14:18
Hier trotzdem kurz eine inline - Lösung für das Dreieck...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   ordnung: integer;
   x, y, laenge, winkel : Real;

   procedure sierpinsky(ordnung: integer; laenge: real; winkel: real);
   begin
      if ordnung = 0 then
      begin
         x := x + laenge * cos(winkel);
         y := y - laenge * sin(winkel);
         PaintBox1.Canvas.LineTo(Round(x), Round(y));
      end   else
      begin
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel + 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel - 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel - 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
         winkel := winkel + 2 * pi / 3;
         sierpinsky(ordnung-1, laenge / 2, winkel);
      end;
   end;

begin
   refresh;
   laenge := 400;
   winkel := 0;
   ordnung := StrToInt(Combobox1.Text);
   x := 100;
   y := 380;
   PaintBox1.Canvas.MoveTo (Round(x), Round(y));
   sierpinsky(ordnung, laenge, winkel);
end;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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