import fr.upd.*; /** * Une animation du triangle de Sierpinski obtenu par décomposition * récursive d'un triangle équilatéral en 4 triangles équilatéraux, * auxquels (sauf le triangle central) on applique jusqu'à plus soif * la même décomposition. * Ici on s'amuse en plus à faire tourner le triangle dans le cercle * dans lequel il est inscrit, et ce à intervalles réguliers. * L'autre jeu est de modifier la couleur d'affichage pour chaque * sous-triangle. * Le programme utilise la classe fr.udp.Facile * @author JBY */ public class Triangle { public static void sierp(int n,int []px,int []py) { // condition d'arrêt (profondeur de la récursion) if (n==0) { Facile.fillPolygon(px,py,3); // on dessine le triangle plein return; } int []ppx = new int[3]; int []ppy = new int[3]; // premier sous-triangle (P0,milieu(P0,P1),milieu(P0,P2)) ppx[0] = px[0]; ppy[0] = py[0]; ppx[1] = (px[0]+px[1])/2; ppy[1] = (py[0]+py[1])/2; ppx[2] = (px[0]+px[2])/2; ppy[2] = (py[0]+py[2])/2; Facile.setColor(255,0,0); // red sierp(n-1,ppx,ppy); // second sous-triangle (P1,milieu(P0,P1),milieu(P1,P2)) ppx[0] = px[1]; ppy[0] = py[1]; ppx[1] = (px[0]+px[1])/2; ppy[1] = (py[0]+py[1])/2; ppx[2] = (px[1]+px[2])/2; ppy[2] = (py[1]+py[2])/2; Facile.setColor(0,255,0); // blue sierp(n-1,ppx,ppy); // troisième sous-triangle (P2,milieu(P0,P2),milieu(P1,P2)) ppx[0] = px[2]; ppy[0] = py[2]; ppx[1] = (px[0]+px[2])/2; ppy[1] = (py[0]+py[2])/2; ppx[2] = (px[1]+px[2])/2; ppy[2] = (py[1]+py[2])/2; Facile.setColor(0,0,255); // green sierp(n-1,ppx,ppy); } public static void main(String []a) { // Ouverture d'une fenêtre de taille 900x900 Facile.startDrawings(900,900); // Activer le noir pour les dessins Facile.setGray(0); int [] px = new int[3]; int [] py = new int[3]; int rayon = 400; double angle = 0.0; int n = 6; while (true) { // calcul initial des coordonnées du triangle de départ for (int i=0; i<3; i++) { px[i] = (int)(rayon*Math.cos(i*2*Math.PI/3+angle))+450; py[i] = (int)(rayon*Math.sin(i*2*Math.PI/3+angle))+450; } // on efface l'écran (remplissage en blanc) Facile.clearArea(); // on applique 6 fois la "décomposition" sierp(n,px,py); // on temporise un peu pour ralentir l'animation Facile.sleep(100); // allez on fait "tourner" le triangle angle += Math.PI/360; } } }