# Sierpinski



## virtual12 (17. Dez 2015)

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.

```
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);
                }
```


----------



## JStein52 (17. Dez 2015)

Und wie ist die Frage ? Was möchtest du denn wissen ?


----------



## virtual12 (17. Dez 2015)

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.


----------



## virtual12 (17. Dez 2015)

Vielleicht kann du mir ja sagen, was ich falsch gemacht habe, denn so klappt es nicht.


----------



## JStein52 (17. Dez 2015)

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 (17. Dez 2015)

Ich hätte es so gemacht:


```
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 (17. Dez 2015)

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 (17. Dez 2015)

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)


----------



## virtual12 (17. Dez 2015)

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.


----------



## JStein52 (17. Dez 2015)

Sorry dass ich rumbohre aber x,y legt doch nur einen Punkt fest. Soll das also der  linke untere Eckpunkt sein ?


----------



## virtual12 (17. Dez 2015)

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 (17. Dez 2015)

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 (17. Dez 2015)

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 (17. Dez 2015)

Okay, dann poste ich mal die Methode:

```
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 (17. Dez 2015)

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.


```
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 (17. Dez 2015)

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


----------



## virtual12 (17. Dez 2015)

Okay, werde es gleich mal versuchen.


----------



## virtual12 (17. Dez 2015)

Komme leider gerade nicht drauf. Hast du noch einen Tipp für mich?


----------



## virtual12 (17. Dez 2015)

Warum die Koordinaten der linken unteren Ecke? Die sind doch 0.0,0.0. Ich verstehe dich gerade nicht ganz. Bitte erkläre das genauer.


----------



## JStein52 (17. Dez 2015)

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


```
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 (17. Dez 2015)

virtual12 hat gesagt.:


> 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 (17. Dez 2015)

Leider nein. Es kommt nur das erste Dreieck zum Vorschein, egal was ich eingebe.


----------



## virtual12 (17. Dez 2015)

Hast du noch eine Idee?


----------



## virtual12 (17. Dez 2015)

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!


----------



## JStein52 (17. Dez 2015)

Wenns nicht funktioniert poste nochmal deinen aktuellen Code, am besten dann main, Sierpinski und zeichneDreieck.


----------

