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