Bonjour, voici un petit script dans lequel j'ai créé un simple système, type solaire, avec un attracteur au centre (le soleil). Rien de bien compliqué jusqu'ici, mais là où les choses se compliquent, c'est que j'aimerais trouver le moyen de faire en sorte que l'orbite de ma planète soit circulaire, c-à-d que sa rotation autour de son soleil décrive une courbe parfaitement ronde!
J'ai gratté jusqu'au bout mes neurones afin de trouver la solution... Il est évident que c'est la vélocité de départ de ma planète qui lui permettra cela...
Je pense être proche de la solution, mais dans mon résultat final, la planète finit néanmoins toujours par s'éloigner de + en +... Serait-ce à cause de l'imprécision du calculateur qui, à force d'utiliser les résultats des calculs précédents, provoque une espèce d'effet papillon, ou bien est-ce du à une erreur de ma part?
Avis au matheux!
Voici le sketch:
float distPlanet = 200;
float G = 1000; // constante gravitationnelle
PVector sun; // position soleil
PVector pos; // position planète
PVector vel; // vélocité planète
PVector acc; // attraction soleil
float velMag; // longueur du vecteur vélocité ( = sa force )
void setup(){
size(600, 600);
sun = new PVector(width/2, height/2);
pos = new PVector(width/2, height/2 - distPlanet);
vel = new PVector(distPlanet * cos(asin (1 - ( map(G/(distPlanet*distPlanet), 0, distPlanet, 0, 1) ) )), 0); // 1. on calcul la vélocité nécessaire pour une orbite circulaire
acc = new PVector();
velMag = vel.mag();
}
void draw(){
//background(0);
ellipse(sun.x, sun.y, 40, 40); // dessin soleil
// 2. on calcul la force d'attraction du soleil sur la planète
acc = sun.get();
acc.sub(pos); // orientation du vecteur d'attraction
float dsquared = acc.magSq(); // d*d
float strength = G / dsquared; // force d'attraction => F = G * (m1 * m2)/(d*d)
acc.setMag(strength); // longueur du vecteur d'attraction
vel.add(acc);
pos.add(vel);
ellipse(pos.x, pos.y, 10, 10); // dessin planète
// 3. à chaque étape, on corrige l'angle de vélocité => perpendiculaire à la force d'attraction
vel = sun.get();
vel.sub(pos); // orientation du vecteur d'attraction
vel.rotate(-HALF_PI); // rotation de 90°
vel.setMag(velMag); // longueur du vecteur velocité
}
Merci !
Dernière modification par AcousticQuantum (2017-05-03 18:47:11)
Hors ligne