import java.awt.*; public class PythagorasTree extends java.applet.Applet { /* phi ist einer der Winkel der entstehenden Dreiecke, * tan (phi) kann etwa zwischen 0.5 und 1.1 variiert * werden, um zu verwertbaren Bildern zu gelangen. */ double tanphi = 1.1; // dauert zwar länger, aber sieht schöner aus static int rot_s = 0; /** * Die eigentliche Zeichenroutine */ public void paint (Graphics g) { g.clearRect (0, 0, 500, 500); // es wird jetzt zusätzlich auch noch die Farbe übergeben (r,g,b,alpha) paintTree (g, 200, 400, 300, 400, 0, 0, 160, 255); } /** * rekursive Pythagoras-Funktion */ void paintTree (Graphics g, double x1, double y1, double x2, double y2, int rot, int gruen, int blau, int alpha ) { // (1) Eckpunkte bestimmen double dx = x2 - x1; double dy = y1 - y2; double x3 = x1 - dy; double y3 = y1 - dx; double x4 = x2 - dy; double y4 = y2 - dx; // (2) vollständiges Quadrat zeichnen /* g.drawLine ((int)x1, (int)y1, (int)x2, (int)y2); g.drawLine ((int)x2, (int)y2, (int)x4, (int)y4); g.drawLine ((int)x4, (int)y4, (int)x3, (int)y3); g.drawLine ((int)x1, (int)y1, (int)x3, (int)y3); */ // habe die Linien durch ein gefülltest Polygon ersetzt. Ich finde das sieht schöner aus. // außerdem wird dem Ding jetzt auch mal 'ne Farbe gegeben... g.setColor(new Color(rot_s,gruen,blau,alpha)); g.fillPolygon(new int[] {(int)x1,(int)x2,(int)x4,(int)x3}, new int[] {(int)y1,(int)y2,(int)y4,(int)y3}, 4); // (3) Koordinaten des neuen Eckpunktes errechnen double v = (x3 + x4) / 2 - (dy / 2 * tanphi); double w = (y3 + y4) / 2 - (dx / 2 * tanphi); if (dx * dx + dy * dy > 2) { // hier werden die Farben variiert // rot wird immer stärker... rot_s = (rot_s + 255 + 2) % 255; // blau wird dagegen abgeschwächt... blau = 255-rot_s; // der Baum wird nach außen hin ausgeblendet... alpha = Math.abs((int)(( dx / (580-420) )*255)); // (4) kleine Teilbäume zeichnen paintTree (g, x3, y3, v, w, rot, gruen, blau, alpha); paintTree (g, v, w, x4, y4, rot, gruen, blau, alpha); } } }