Sierpinski

virtual12

Aktives Mitglied
Ich möchte ein Sierpinski Dreieck mit einer rekursiven Methode zeichnen. Die main Methode, sowie eine Methode zum zeichnen eines einfachen Dreiecks habe ich schon. Bei der rekursiven Methode zum Sierpinski Dreieck habe ich allerdings so meine Schwierigkeiten. Vielleicht könnt ihr mir helfen. Hier meine bisherige Methode, die aber auch nur ein einfaches Dreieck ausgibt.
Code:
public static void Sierpinski(int n, double x, double y, double size) {
                        if(n==0)return;
                        zeichneDreieck(x,y,size);

                        double x0 = x-size/2;
                        double x1 = x+size/2;
                        double y0 = y+size;

                        zeichne(n-1,x0/2,x1/2,size/2);
                        zeichne(n-1,x1/2,y0/2,size/2);
                        zeichne(n-1,y0/2,x0/2,size/2);
                }
 

virtual12

Aktives Mitglied
Wie ich es schaffe ein Sierpinski Dreieck zu erstellen? Mit meiner jetzigen Methode sehe ich bei der Aufgabe nur ein normales Dreieck, aber keine weiteren innerhalb des ersten.
 

JStein52

Top Contributor
Willst du folgenden Algorithmus implementieren :

Das Sierpinski-Dreieck lässt sich auf vielfältige Art und Weise konstruieren. Eine der bekanntesten Methoden ist wohl, in einem vorgegebenen gleichseitigen Dreieck, einfach die Seitenmittelpunkte zu verbinden und dieses Verfahren, in den äußeren drei, der so entstehenden vier neuen Dreiecke fortzusetzen.

Was ist bei dir x und y ? (ich nehme an size ist die Seitenlänge.) Und was tut zeichneDreieck ? Ein Dreieck um den Punkt (x,y) als Mittelpunkt zeichnen ?? Spitze nach oben ?
 

JStein52

Top Contributor
Ich hätte es so gemacht:

Code:
public static void Sierpinski(int n, double x, double y, double size) {
                        if(n==0)return;
                        zeichneDreieck(x,y,size);

                        double x0 = x-size/2;
                        double x1 = x+size/2;
                        double y0 = y+size;

                        Sierpinski(n-1,x0/2,x1/2,size/2);
                        Sierpinski(n-1,x1/2,y0/2,size/2);
                        Sierpinski(n-1,y0/2,x0/2,size/2);
                }
 

virtual12

Aktives Mitglied
Danke für deine Antwort. Ja, das was du oben beschrieben hast, möchte ich machen. Du hast richtig vermutet, dass size die Seitenlänge ist, x0 und x1 sollen die Basis bilden und y die Spitze des Dreiecks. Die Methode zeichneDreieck soll das Ausgangsdreieck zeichnen. Aber noch klappt es nicht. Mir wird nur ein einfaches Dreieck ausgegeben mit einer schrägen Linie durch die rechte Seitenlänge, egal mit welchem Parameter ich das Programm aufrufe. Hast du noch eine Idee dazu?
 

JStein52

Top Contributor
Das mit dem x und y verstehe ich noch nicht ?? Was soll zeichneDreieck(x,y,size); denn zeichnen ?

Edit: x,y ergibt doch nur einen einzigen Punkt in einem zweidimensionalem Koordinatensystem (z.B. Pixel des Bildschirms)
 
Zuletzt bearbeitet:

virtual12

Aktives Mitglied
zeichneDreieck soll eine nicht rekursive Methode sein, die drei Werte x,y und size entgegennimmt. Ich sehe gerade, dass ich mich eben vertippt habe. x und y sollen die Basis darstellen. Sorry dafür.Die Methode soll die Koordinaten des Dreiecks festlegen und dann zeichnen. Ich hoffe, es ist jetzt klarer geworden.
 

virtual12

Aktives Mitglied
Na ja, ich dachte dabei eigentlich an die waagerechte der unteren Seite. Du kannst mir für die Koordinaten aber auch einen anderen Vorschlag machen.
 

JStein52

Top Contributor
Du musst dich nur mal genau ausdrücken damit ich verstehe was du meinst. Ein Zahl beschreibt ja keine Gerade. Und deine Methode zeichenDreieck scheint ja zu funktionieren !! Sag mir doch bitte mal in Worten was passiert wenn du zeichneDreieck(4,6,24); aufrufst. Ich will nur wissen was diese Zahlen bedeuten, denn ich glaube einfach dass du für die folgenden Aufrufe die neuen Werte x0,x1 etc. falsch berechnest
 

JStein52

Top Contributor
ich könnte dir auch einen Vorschlag machen wie man das ganze aufbauen könnte indem man die drei Ecken des Dreiecks jeweils als (x,y)-Koordinaten angibt. Aber dann müsstest du sicher deine zeichneDreieck umbauen. Und das muss ja vielleicht nicht sein
 

virtual12

Aktives Mitglied
Okay, dann poste ich mal die Methode:
Code:
public static void zeichneDreieck(double x, double y, double size) {
                double x0 = x-size/2;
                double x1 = x+size/2;
                double y0 = y+size;

                StdDraw.line(x0,0.0,x1,0.0);
                StdDraw.line(x1,0.0,0.5,y0);
                StdDraw.line(0.5,y0,x1,0.0);
        }
 

JStein52

Top Contributor
UUps, die zeichnet aber ein unkonventionelles Dreieck. Egal was du für x und y angibst liegt die
Basis des Dreiecks ja immer auf der x-Achse. Das kann ja nie ein Sierpinksi-Dreieck zeichnen.
Du solltest diese Methode so umbauen dass x,y die Koordinaten des linken untreren Eckpunktes sind.

Code:
public static void zeichneDreieck(double x, double y, double size) {

                StdDraw.line(x,y, x+size,y);
                StdDraw.line(x+size,y,x+size/2, y+Math.sqrt(3)*size/2);
                StdDraw.line(x+size/2, y+Math.sqrt(3)*size/2,x,y);
        }

Math.sqrt(3)*size/2 ist die Höhe im gleichseitigen Dreieck falls ich mich nicht verrechnet habe
 

JStein52

Top Contributor
Und jetzt musst du dir in der Sierpinski-Methode die Koordinaten der linken unteren Ecke für die Folgedreiecke noch richtig bestimmen !!
 

JStein52

Top Contributor
Ok, also die zeichneDreieck hast du ja oben. Jetzt noch die Sierpinski :

Code:
    public static void Sierpinski(int n, double x, double y, double size) {
                        if(n==0)return;
                        zeichneDreieck(x,y,size);

                        // die Ecken der nächsten drei dreiecke bestimmen
                        double x0 = x;
                        double y0 = y;

                        double x1 = x+size/2;
                        double y1 = y;

                        double x2 = x+size/4;
                        double y2 = y+Math.sqrt(3)*size/4;

                        Sierpinski(n-1,x0,y0,size/2);
                        Sierpinski(n-1,x1,y1,size/2);
                        Sierpinski(n-1,x2,y2,size/2);
                }

Probier mal so. Ich habe es nicht getestet
 

JStein52

Top Contributor
Warum die Koordinaten der linken unteren Ecke? Die sind doch 0.0,0.0
Warum sind die 0,0 ??? Die können doch irgendwo sein.
Lege mal ein Blatt Papier vor dich, male dir die x/y-Achse ein und zeichne mal irgendwohin ein gleichseitiges Dreieck, möglichst nicht zu winzig und zwar so dass die untere Seite waagerecht, d.h. parallel zur x-Achse verläuft. Nun markierst du dir jeweils die Mitte der drei Seiten und zeichnest mit diesen Punkten ein neues, auf dem Kopf stehendes gleichseitiges Dreieck. Um dieses herum siehst du nun drei neue Dreiecke, das sind die Folgedreiecke für den Sierpinski-Algorithmus. Von diesen markierst du dir den linken unteren Eckpunkt. Das ist der um den es jeweils geht.
 

virtual12

Aktives Mitglied
Ich habe wohl vergessen, etwas in meinem ursprünglichen Versuch zu ändern. Vielen Dank für deine Hilfe und die Erklärung am Schluss. Jetzt kann ich mir das viel besser vorstellen. Danke!
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Sierpinski Sechseck Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben