1
Général / Re: Chaine de Toda
« le: Mars 14, 2019, 09:10:58 pm »
Oui vous avez tout à fait raison, c'était juste que je ne savais pas par quoi commencer. Si on regarde le code sfml, posté en second dans mon message
n p1 v1 a1 p2 v2 a2 p3 v3 a3
Ensuite je récupère la position (ainsi que la vitesse et l'accélération) des points que je stock dans des vecteurs séparés :
Ensuite je crée une fenêtre vidéo de 700 pixels ainsi que trois cercles qui représentent les trois points (je pense que y a pas de problème là dessus) et je crée des transformations t1 t2 et t3 qui sont des rotate de la classe transform.
circle1.setOrigin(-fen_size/2,-fen_size/2);
circle2.setOrigin(-fen_size/2,-fen_size/2);
circle3.setOrigin(-fen_size/2,-fen_size/2);
sf::Transform t1; //definit une transformation qu'on appelle t1
sf::Transform t2;
sf::Transform t3;
t1.rotate(angle1,350,350); //fait une rotation de centre de coordonnées (350,350) d'un angle 1
t2.rotate(angle2,350,350);
t3.rotate(angle3,350,350);
Puis pour gérer le temps entre chaque rotation je crée un variable t0 qui vaut 1/60è de secondes, je mets les rotations et les angles dans une boucle qui va dessiner les cercles et actualiser leurs positions tout en actualisant la valeur des angles.
Le problème c'est que les cercles bougent n'importe comment, ils se passent au travers par exemple alors que c'est pas possible d'après l'intégration qui a l'air assez juste. Tout se passe comme ci le code ne lisait pas le fichier ou plutôt pas comme je le souhaite car le fichier est bien lu (j'ai testé en ajoutant une boucle et ça me donnait bien les 10 premières valeurs du fichiers)
N'hésitez pas à me dire si je dois être plus précis.
{
//Partie récupération données du fichier
std::ifstream valeurs("valeursverlet.txt");
if (!valeurs){
std::cout<<"Impossible d'ouvrir le fichier"<<std::endl;
exit(1);
}
Je récupère d'abord les valeurs du fichier texte. Le fichier texte se présente comme un tableau, avec en première colonne le numéro de la ligne, la deuxième donne la position (l'angle) du point 1, la troisième donne la vitesse du point 1, la quatrième donne l'accélération du point 1 et etc ... ça donne qqchose comme ://Partie récupération données du fichier
std::ifstream valeurs("valeursverlet.txt");
if (!valeurs){
std::cout<<"Impossible d'ouvrir le fichier"<<std::endl;
exit(1);
}
n p1 v1 a1 p2 v2 a2 p3 v3 a3
Ensuite je récupère la position (ainsi que la vitesse et l'accélération) des points que je stock dans des vecteurs séparés :
for (int j=0;j<size;j++)
{
valeurs>>ignore; //On ignore le numéro de ligne
for (int i=0;i<pointnumber;i++)
{
valeurs>>omegatemp[i]>>omegapointtemp[i]>>omegapointpointtemp[i];
omega[j][i]=omegatemp[i];
omegapoint[j][i]=omegapointtemp[i];
omegapointpoint[j][i]=omegapointpointtemp[i];
}
valeurs.ignore(std::numeric_limits<int>::max(),'\n'); //On passe à la prochaine ligne
for (int i=0;i<pointnumber;i++)
{
theta0[i]=fmod(omega[0][i]+(i-1)*2*PI/3,2*PI)*180/PI;
}
double angle1 = theta0[0] ;
double angle2 = theta0[1] ;
double angle3 = theta0[2] ;
}
{
valeurs>>ignore; //On ignore le numéro de ligne
for (int i=0;i<pointnumber;i++)
{
valeurs>>omegatemp[i]>>omegapointtemp[i]>>omegapointpointtemp[i];
omega[j][i]=omegatemp[i];
omegapoint[j][i]=omegapointtemp[i];
omegapointpoint[j][i]=omegapointpointtemp[i];
}
valeurs.ignore(std::numeric_limits<int>::max(),'\n'); //On passe à la prochaine ligne
for (int i=0;i<pointnumber;i++)
{
theta0[i]=fmod(omega[0][i]+(i-1)*2*PI/3,2*PI)*180/PI;
}
double angle1 = theta0[0] ;
double angle2 = theta0[1] ;
double angle3 = theta0[2] ;
}
Ensuite je crée une fenêtre vidéo de 700 pixels ainsi que trois cercles qui représentent les trois points (je pense que y a pas de problème là dessus) et je crée des transformations t1 t2 et t3 qui sont des rotate de la classe transform.
circle1.setOrigin(-fen_size/2,-fen_size/2);
circle2.setOrigin(-fen_size/2,-fen_size/2);
circle3.setOrigin(-fen_size/2,-fen_size/2);
sf::Transform t1; //definit une transformation qu'on appelle t1
sf::Transform t2;
sf::Transform t3;
t1.rotate(angle1,350,350); //fait une rotation de centre de coordonnées (350,350) d'un angle 1
t2.rotate(angle2,350,350);
t3.rotate(angle3,350,350);
Puis pour gérer le temps entre chaque rotation je crée un variable t0 qui vaut 1/60è de secondes, je mets les rotations et les angles dans une boucle qui va dessiner les cercles et actualiser leurs positions tout en actualisant la valeur des angles.
while (window.isOpen() && i<size-1)
{
clock.restart();
while (clock.getElapsedTime()<t0)
{
int j=0;
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
t1.rotate(angle1*t0.asSeconds(),350,350);
t2.rotate(angle2*t0.asSeconds(),350,350);
t3.rotate(angle3*t0.asSeconds(),350,350);
window.clear();
window.draw(circle1,t1); // dessine le cercle 1 et lui applique t1
window.draw(circle2,t2); //dessine le cercle et lui applique t2
window.draw(circle3,t3);
window.display();
}
i++;
angle1=omegapoint[i][0]*180/PI;
angle2=omegapoint[i][1]*180/PI;
angle3=omegapoint[i][2]*180/PI;
}
{
clock.restart();
while (clock.getElapsedTime()<t0)
{
int j=0;
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
t1.rotate(angle1*t0.asSeconds(),350,350);
t2.rotate(angle2*t0.asSeconds(),350,350);
t3.rotate(angle3*t0.asSeconds(),350,350);
window.clear();
window.draw(circle1,t1); // dessine le cercle 1 et lui applique t1
window.draw(circle2,t2); //dessine le cercle et lui applique t2
window.draw(circle3,t3);
window.display();
}
i++;
angle1=omegapoint[i][0]*180/PI;
angle2=omegapoint[i][1]*180/PI;
angle3=omegapoint[i][2]*180/PI;
}
Le problème c'est que les cercles bougent n'importe comment, ils se passent au travers par exemple alors que c'est pas possible d'après l'intégration qui a l'air assez juste. Tout se passe comme ci le code ne lisait pas le fichier ou plutôt pas comme je le souhaite car le fichier est bien lu (j'ai testé en ajoutant une boucle et ça me donnait bien les 10 premières valeurs du fichiers)
N'hésitez pas à me dire si je dois être plus précis.