Système solaire
Objectif:
Créer une animation de système solaire avec: un Soleil immobile au centre, la Terre en mouvement circulaire avec sa trajectoire, de même pour la Lune et un astéroïde et enfin la gestion du choc astéroïde-Terre.
Processing:
État du code 1:
int cx = 250;
int cy = 250;
int r = 100;
int rlune=30;
PImage lune;
PImage soleil;
PImage terre;
PImage asteroide;
int xlune=0;
int ylune=0;
int xasteroide=0;
int yasteroide=0;
int aasteroide=110;
int basteroide=90;
int [] positionLuneX;
int [] positionLuneY;
void setup(){
size(500, 500);
terre = loadImage("terre.png");
soleil=loadImage("soleil.png");
lune=loadImage("lune.png");
asteroide=loadImage("asteroide.png");
positionLuneX = new int [0];
positionLuneY = new int [0];
}
void draw(){
background(0);
stroke(255);
text("(99942) Apophis en collision avec la Terre 13 avril 2036 ?", 20,20);
text(" L'astéroïde mesurant moins d'un kilomètre de diamètre, ",20,50);
text("son impact n'aurait eu que des conséquences « régionales »",20,80);
text("demi-grand axe = 0.92 ua; période= 0,89 a", 20,470);
text("périhélie 0.9 ua, aphélie = 1,1 ua",20,440);
float t = millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
int xlune = (int)(x+rlune*cos(12*t));
int ylune = (int)(y+rlune*sin(12*t));
int xasteroide = (int)(cx+aasteroide*cos(0.89*t+ PI/2));
int yasteroide = (int)(cy+basteroide*sin(0.89*t+PI/2));
positionLuneX= append(positionLuneX,xlune);
positionLuneY= append(positionLuneY,ylune);
println(positionLuneX.length);
for (int i=0;
i<positionLuneX.length-1;i++){
point(positionLuneX[i],positionLuneY[i]);
}
État du code 2:
int cx = 250;
int cy = 250;
int r = 100;
int rlune=30;
PImage lune;
PImage soleil;
PImage terre;
PImage asteroide;
PImage sun;
PImage espace;
int xlune=0;
int ylune=0;
int xasteroide=0;
int yasteroide=0;
int aasteroide=110;
int basteroide=90;
int [] positionLuneX;
int [] positionLuneY;
int compteurPositionlune=0;
PShape globesoleil;
PShape globeterre;
PShape globelune;
PShape globeespace;
PShape globeasteroide;
void setup()
{
size(500,500, P3D);
terre = loadImage("terre.png");
soleil=loadImage("soleil.png");
lune=loadImage("lune.png");
asteroide=loadImage("asteroide.png");
sun=loadImage("sun.jpg");
espace=loadImage("espace.jpg");
globesoleil = createShape(SPHERE, 35);
globeterre = createShape(SPHERE, 20);
globelune = createShape(SPHERE, 5);
globeespace = createShape(SPHERE, 800);
globeasteroide =createShape(SPHERE,5);
globesoleil.setTexture(sun);
globeterre.setTexture(terre);
globelune.setTexture(lune);
globeespace.setTexture(espace);
globeasteroide.setTexture(asteroide);
positionLuneX = new int [0];
positionLuneY = new int [0];
noStroke();
fill(255);
sphereDetail(40);
}
void draw()
{
background(0);
camera(width/2, mouseY, mouseX, width/2, height/2, 0, 0, 1, 0);
text("(99942) Apophis en collision avec la Terre 13 avril 2036 ?", 20, 20);
text(" L'astéroïde mesurant moins d'un kilomètre de diamètre, ", 20, 50);
text("son impact n'aurait eu que des conséquences « régionales »", 20, 80);
text("demi-grand axe = 0.92 ua; période= 0,89 a", 20, 470);
text("périhélie 0.9 ua, aphélie = 1,1 ua", 20, 440);
text("inclinaison 3,3°", 20, 410);
float t = 0.5*millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
int xlune = (int)(x+rlune*cos(12*t));
int ylune = (int)(y+rlune*sin(12*t));
int xasteroide = (int)(cx+2*aasteroide*cos(0.89*t+ PI));
int yasteroide = (int)(cy+1*basteroide*sin(0.89*t+PI));
//positionLuneX[compteurPositionlune]=xlune;
positionLuneX= append(positionLuneX, xlune);
positionLuneY= append(positionLuneY, ylune);
println(positionLuneX.length);
for (int i=0; i<positionLuneX.length-1; i++) {
point(positionLuneX[i], positionLuneY[i]);
}
//positionLuneY[compteurPositionlune]=ylune;
compteurPositionlune++;
noFill();
ellipse(cx, cy, r*4/2, r*4/2);
ellipse(cx, cy, aasteroide*4, basteroide*4/2);
pushMatrix();
translate(250, 250, 0);
noStroke();
// directionalLight(255, 255, 0, 10, -1, 0);
//ambientLight(0,0,255);
//texture(soleil);
// pointLight(xasteroide, yasteroide, 0, width/2, height/2, 3000);
rotateY(PI * frameCount / 500);
shape(globesoleil);
stroke(255);
//sphere(25);
popMatrix();
pushMatrix();
translate(x,y,0);
rotateX(PI*frameCount / 500);
noStroke();
shape(globeterre);
stroke(255);
popMatrix();
pushMatrix();
translate(xlune,ylune,0);
rotateX(PI*frameCount / 500);
noStroke();
shape(globelune);
stroke(255);
popMatrix();
pushMatrix();
translate(5,4,0);
//rotateX(PI/20);
noStroke();
stroke(255);
//ellipse(cx, cy, aasteroide*4, basteroide*4/2);
shape(globeasteroide, xasteroide, yasteroide, 20, 10);
popMatrix();
//ellipse(x, y, rlune*4/2, rlune*4/2);
// translate(0,0,-750);
//rotateZ(0.5);
//rotateX(0.5);
//image (lune, xlune-10, ylune-10, 20, 20);
//image(terre, x-25, y-25, 50, 50);
//affichage_astre(soleil, 225, 225, 50, 50);
//image(soleil, 250-25, 250-25, 50, 50);
pushMatrix();
translate(250,250,0);
noStroke();
shape(globeespace);
stroke(255);
popMatrix();
if ( xasteroide>x-10 && xasteroide<x+10 && yasteroide>y-10 && yasteroide<y+10) {
noLoop();
text("BOUM", 50, 110);
}
}
void affichage_astre( PImage astre, int positionX, int positionY, int tailleX, int tailleY) {
image (astre, positionX, positionY, tailleX, tailleY);
État du code final:
//Déclaration des objets lune, terre, asteroide, sun, espace, explosion d'instance de la class PImage
PImage lune;
PImage terre;
PImage asteroide;
PImage sun;
PImage espace;
PImage explosion;
//Déclaration des variables entières en lien avec les positions du soleil, de l'espace , de la terre, de la lune et de l'asteroide et affectation de leur valeurs
int cx = 250;
int cy = 250;
int r = 100;
int rlune = 30;
int xlune = 0;
int ylune = 0;
int xasteroide = 0;
int yasteroide = 0;
int aasteroide = 110;
int basteroide = 90;
//Déclaration des variables entières des tableaux positionLuneX, positionLuneY et du compteur de position de la lune
int [] positionLuneX;
int [] positionLuneY;
int compteurPositionlune=0;
//Déclaration des objets globesoleil, globeterre, globelune, globeasteroide, globeespace d'instance de la class PShape
PShape globesoleil;
PShape globeterre;
PShape globelune;
PShape globeasteroide;
PShape globeespace;
void setup(){
//Affectation de la tailles et de la dimension (3D) de la fonction size (fenêtre)
size(500, 500, P3D);
//Affectation d'images aux objets d'instance de la class PImage
terre = loadImage("terre plate 2.jpg");
lune = loadImage("lune.png");
asteroide = loadImage("surface asteroide.jpg");
sun = loadImage("surface soleil.jpg");
espace = loadImage("space.jpg");
explosion = loadImage("explosion 2.png");
//Affectation de spheres (sans lignes) avec leur tailles aux objets d'instance de la class PShape
noStroke();
globesoleil = createShape(SPHERE, 35);
globeterre = createShape(SPHERE, 20);
globelune = createShape(SPHERE, 5);
globeasteroide = createShape(SPHERE, 4);
globeespace = createShape(SPHERE, 800);
//Affectation de textures (objets d'instance de la class PImage) aux objets d'instance de la class PShape
globesoleil.setTexture(sun);
globeterre.setTexture(terre);
globelune.setTexture(lune);
globeasteroide.setTexture(asteroide);
globeespace.setTexture(espace);
//Création des tableaux positionLuneX et positionLuneY sans cases
positionLuneX = new int [0];
positionLuneY = new int [0];
}
void draw(){
//Affectation de la couleur a la fonction background (fond d'écran)
background(0);
//Affectation des paramétres de la fonction camera
camera(width/2, mouseY, mouseX, width/2, height/2, 0, 0, 1, 0);
//Affichage des textes
text("(99942) Apophis en collision avec la Terre 13 avril 2036 ?", 40, 20, 30);
text(" L'astéroïde mesurant moins d'un kilomètre de diamètre, ", 40, 50, 30);
text("son impact n'aurait eu que des conséquences « régionales »", 40, 80, 30);
text("demi-grand axe = 0.92 ua; période= 0,89 a", 40, 440, 30);
text("périhélie 0.9 ua, aphélie = 1,1 ua", 40, 410, 30);
text("inclinaison 3,3°", 40, 380, 30);
//Déclaration d'une variable à virgule, t (temps) et affectation de la valeur
float t = 0.5*millis()/1000.0f;
//Déclaration des variables entières x (x terre) et y (y terre) et affectation de leur valeurs (trajectoire de la terre)
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
//Déclaration des variables entières xlune et ylune et affectation de leur valeurs (trajectoire de la lune)
int xlune = (int)(x+rlune*cos(12*t));
int ylune = (int)(y+rlune*sin(12*t));
//Déclarartion des variables entières xasteroide et yasteroide et affectation de leur valeurs (trajectoire de l'asteroide)
int xasteroide = (int)(cx+2*aasteroide*cos(0.89*t+ PI/2));
int yasteroide = (int)(cy+basteroide*sin(0.89*t+PI/2));
//positionLuneX[compteurPositionlune] = xlune;
positionLuneX = append(positionLuneX, xlune);
//positionLuneY[compteurPositionlune] = ylune;
positionLuneY = append(positionLuneY, ylune);
//Affichage des points du passage de la lune
for (int i = 0; i<positionLuneX.length-1; i++) {
point(positionLuneX[i], positionLuneY[i]);
compteurPositionlune++;
}
//Affichage des points du passage de la lune sur la console
println(positionLuneX.length);
//Affichage des trajectoires de la terre et de l'asteroide
noFill();
ellipse(cx, cy, r*4/2, r*4/2);
ellipse(cx, cy, aasteroide*4, basteroide*4/2);
stroke(255);
//Affichage de l'objet globesoleil, de sa position et de sa rotation
pushMatrix();
translate(cx, cy, 0);
rotateY(PI * frameCount / 500);
shape(globesoleil);
popMatrix();
//Affichage de la lumière
pointLight(255, 255, 255, 255, 255, 100);
//Affichage de l'objet globeterre, de sa position et de sa rotation
pushMatrix();
translate(x, y, 0);
rotateX(PI*frameCount / 500);
shape(globeterre);
popMatrix();
//Affichage de l'objet globelune, de sa position et de sa rotation
pushMatrix();
translate(xlune, ylune, 0);
rotateX(PI*frameCount / 500);
shape(globelune);
popMatrix();
//Affichage de l'objet globeasteroide, de sa position et de sa rotation
pushMatrix();
translate(xasteroide, yasteroide, 0);
rotateY(PI*frameCount/50);
shape(globeasteroide, 4, 3, 15, 10);
popMatrix();
//Affichage de l'objet globeespace et de sa position
pushMatrix();
translate(cx, cy, 0);
shape(globeespace);
popMatrix();
//Affichage du texte "Collision" et de l'objet explosion lorsque l'asteroide percute la terre (c'est la fin de l'animation)
if ( xasteroide>x-10 && xasteroide<x+10 && yasteroide>y-20 && yasteroide<y+20) {
noLoop();
text("Collision", 100, 180, 120);
image(explosion, xasteroide-50, yasteroide-50, 90, 90);
}
}
État du code final ordonné:
Void_asteroide:
void creation_asteroide(){
asteroide = loadImage("surface asteroide.jpg");
explosion = loadImage("explosion 2.png");
globeasteroide = createShape(SPHERE, 4);
globeasteroide.setTexture(asteroide);
}
void affichage_asteroide(){
float t = 0.5*millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
int xasteroide = (int)(cx+2*aasteroide*cos(0.89*t+ PI/2));
int yasteroide = (int)(cy+basteroide*sin(0.89*t+PI/2));
noFill();
ellipse(cx, cy, aasteroide*4, basteroide*4/2);
stroke(255);
pushMatrix();
translate(xasteroide, yasteroide, 0);
rotateY(PI*frameCount/50);
shape(globeasteroide, 4, 3, 15, 10);
popMatrix();
if ( xasteroide>x-10 && xasteroide<x+10 && yasteroide>y-20 && yasteroide<y+20) {
noLoop();
text("Collision", 100, 180, 120);
image(explosion, xasteroide-50, yasteroide-50, 90, 90);
}
}
Void_espace:
void creation_espace(){
espace = loadImage("space.jpg");
globeespace = createShape(SPHERE, 800);
globeespace.setTexture(espace);
}
void affichage_espace(){
pushMatrix();
translate(cx, cy, 0);
shape(globeespace);
popMatrix();
}
Void_lune:
void creation_lune(){
lune = loadImage("lune.png");
globelune = createShape(SPHERE, 5);
globelune.setTexture(lune);
positionLuneX = new int [0];
positionLuneY = new int [0];
}
void affichage_lune(){
float t = 0.5*millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
int xlune = (int)(x+rlune*cos(12*t));
int ylune = (int)(y+rlune*sin(12*t));
positionLuneX = append(positionLuneX, xlune);
positionLuneY = append(positionLuneY, ylune);
for (int i = 0; i<positionLuneX.length-1; i++) {
point(positionLuneX[i], positionLuneY[i]);
compteurPositionlune++;
}
println(positionLuneX.length);
pushMatrix();
translate(xlune, ylune, 0);
rotateX(PI*frameCount / 500);
shape(globelune);
popMatrix();
}
Void_soleil:
void creation_soleil(){
soleil = loadImage("surface soleil.jpg");
globesoleil = createShape(SPHERE, 35);
globesoleil.setTexture(soleil);
}
void affichage_soleil(){
float t = 0.5*millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
pushMatrix();
translate(cx, cy, 0);
rotateY(PI * frameCount / 500);
shape(globesoleil);
popMatrix();
pointLight(255, 255, 255, 255, 255, 100);
}
Void_terre:
void creation_terre(){
terre = loadImage("terre plate 2.jpg");
globeterre = createShape(SPHERE, 20);
globeterre.setTexture(terre);
}
void affichage_terre(){
float t = 0.5*millis()/1000.0f;
int x = (int)(cx+r*cos(t));
int y = (int)(cy+r*sin(t));
noFill();
ellipse(cx, cy, r*4/2, r*4/2);
stroke(255);
pushMatrix();
translate(x, y, 0);
rotateX(PI*frameCount / 500);
shape(globeterre);
popMatrix();
}
Système_solaire:
PImage lune;
PImage terre;
PImage asteroide;
PImage soleil;
PImage espace;
PImage explosion;
int cx = 250;
int cy = 250;
int r = 100;
int rlune = 30;
int xlune = 0;
int ylune = 0;
int xasteroide = 0;
int yasteroide = 0;
int aasteroide = 110;
int basteroide = 90;
int [] positionLuneX;
int [] positionLuneY;
int compteurPositionlune=0;
PShape globesoleil;
PShape globeterre;
PShape globelune;
PShape globeasteroide;
PShape globeespace;
void setup(){
size(500, 500, P3D);
noStroke();
creation_soleil();
creation_terre();
creation_lune();
creation_espace();
creation_asteroide();
}
void draw(){
background(0);
camera(width/2, mouseY, mouseX, width/2, height/2, 0, 0, 1, 0);
text("(99942) Apophis en collision avec la Terre 13 avril 2036 ?", 40, 20, 30);
text(" L'astéroïde mesurant moins d'un kilomètre de diamètre, ", 40, 50, 30);
text("son impact n'aurait eu que des conséquences « régionales »", 40, 80, 30);
text("demi-grand axe = 0.92 ua; période= 0,89 a", 40, 440, 30);
text("périhélie 0.9 ua, aphélie = 1,1 ua", 40, 410, 30);
text("inclinaison 3,3°", 40, 380, 30);
affichage_soleil();
affichage_terre();
affichage_lune();
affichage_espace();
affichage_asteroide();
}

