# Sierpinski Dreieck rekursiv zeichnen



## donhachako (24. Jan 2021)

Hallo,
meine Aufgabe ist es, ein Sierpinski Dreieck rekursiv zu zeichnen.
Ich habe dazu bereits folgenden Code verfasst, der jedoch noch nicht funktioniert.
Es wird zwar das schwarze Dreieck mit dem weißen Dreieck in der Mitte gezeichnet, mehr jedoch nicht.

Es ist in der Aufgabe vorgegeben, erst die Punkte des schwarzen und weißen Dreiecks zu berechnen, diese zu zeichnen, und dann die Methode mit den richtigen Abbruchbedingungen wieder aufzurufen und die beiden Dreiecke erneut im ersten großen Dreieck zu zeichnen. Dabei soll bei einer Rekursionstiefe von 0 das erste Dreieck immer noch gezeichnet werden.

Ich hoffe jemand kann mir eine Anregung dazu geben, was an meinem Code noch falsch ist.


```
protected void drawTriangleRec(int ax, int ay, int bx, int by, int cx, int cy, int depth, Color color) {
           
            int width = bx - ax;
            int höhe = ay + cy;
            int[] dreieckSchwarzX = {ax, bx, cx};
            int[] dreieckSchwarzY = {ay, by, cy};
            g.setColor(color.black);
            g.fillPolygon(dreieckSchwarzX, dreieckSchwarzY, 3);
            int dx = width / 4 + 10;
            int dy = höhe / 2;
            int ex = (width / 4) * 3 + 10;
            int ey = dy;
            int fx = width / 2;
            int fy = ay;
            int[] dreieckWeissX = {dx, ex, fx};
            int[] dreieckWeissY = {dy, ey, fy};
            g.setColor(color.WHITE);
            g.fillPolygon(dreieckWeissX, dreieckWeissY, 3);
           
            if (depth == 0 || Math.sqrt(Math.pow(fx - ax, 2) + Math.pow(ay + cy, 2)) > 2) {
                return;
            }
           
            drawTriangleRec(ax, ay, fx, fy, dx, dy, depth - 1, color);
            drawTriangleRec(fx, fy, bx, by, ex, ey, depth - 1, color);
            drawTriangleRec(dx, dy, ex, ey, cx, cy, depth - 1, color);
           
    }
```

Vielen Dank schonmal im Voraus!


----------



## mihe7 (24. Jan 2021)

Ich würde das erstmal anders beschreiben:

Ist die Abbruchedingung erfüllt, muss nichts gezeichnet werden. Ansonsten seien A, B und C die Punkte eines Dreiecks. AB sei die untere, BC die rechte und AC die linke Kante, die sich als Vektoren auffassen lassen. Halbiert man die Vektoren, findet man den Mittelpunkt der Kanten: AA' = 0,5*AB, AB'=AB+0,5*BC, AC'=0,5*AC. Über die Ortsvektoren sind die Punkte A', B' und C' bestimmt: OA'=OA+AA', OB'=OA+AB' und OC'=OA+AC'

Damit hat man vier innere Dreiecke: AA'C', A'BB', C'B'C und A'B'C'. Das letzte ist weiß zu füllen, die anderen schwarz und mit den Punkten der schwarzen Dreiecke ist der Spaß erneut aufzurufen.

Wenn ich mir jetzt Deinen Code ansehe, dann fallen mir ein paar Dinge auf:

1. Deine Rechnung unterstellt, dass Höhe und Breite gleich groß sind. Unsinn: für die einzelnen Koordinaten passt das.
2. Du berücksichtigst die Ortsvektoren nicht.
3. Warum Du height als Summe berechnest, ist mir unklar.
4. Nachtrag: den Parameter color brauchst Du nicht. Die Konstanten sind auf Klassenebene definiert: Color.BLACK, Color.WHITE.


----------

