Bonjour,
J'ai débuté l'apprentissage du langage C++ il n'y a pas très longtemps. Mon but est d'effectuer de petites simulations avec SFML 1.6.
J'ai réussi a réaliser une partie du programme que je veux faire en lisant la documentation ici. Je suis maintenant confronté à une plus grande difficulté. Je n'ai pas vu d'exemple de ce genre.
Je voudrais savoir comment afficher, en temps réel, la valeur des différentes variables (t, y, v et a) dans la fenêtre supérieure gauche. Par exemple, comment afficher le temps au dixième de seconde près et l'altitude correspondante avec une décimale?
Merci
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <SFML/Audio.hpp>
#include <SFML/Window.hpp>
#include <SFML/Window/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Glyph.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/System/Resource.hpp>
#include <SFML/System/Vector2.hpp>
#include <SFML/System/Unicode.hpp>
using namespace std;
int main()
{
// Paramètres de la fenêtre principale.
int XM=240; // Largeur en pixels selon x de la fenêtre de données.
int YM=480; // Hauteur en pixels selon y de la fenêtre de données.
// Paramètres physiques.
const int MF=3000000; // Masse totale de la fusée [kg].
const int DMAS=13500; // Débit massique [kg/s].
const int VEJECT=2500; // Vitesse d'éjection des gaz [m/s].
double MT; // Masse de la Terre [kg].
MT=5.98*pow(10,24);
const long RT=6378000; // Rayon de la Terre [m].
double G;
G=6.67*pow(10,-11); // Constante de gravitation universelle [m^3/s^2*kg].
// Compteurs.
int i=0; // Compteur.
int n; // Numéro de l'élément échantillonné.
int N=10000; // Nombre d'éléments dans les tableaux.
// Variables physiques.
double temps; // Temps actuel [s].
double t[N]; // Tableau des temps [s].
double delta_t[N]; // Tableau des différences de temps [s].
double y[N]; // Altitude de la fusée [m].
double v[N]; // Vitesse de la fusée [m/s].
double a[N]; // Accélération de la fusée [m/s^2].
// Ouverture du fichier saturn.txt.
ofstream outputFile;
outputFile.open("saturn.txt");
// Création de la fenêtre.
sf::RenderWindow App(sf::VideoMode(800, 600), "Lancement d'une fusee");
sf::Font Arial;
if (!Arial.LoadFromFile("arial.ttf"))
return EXIT_FAILURE;
sf::Shape Rect1 = sf::Shape::Rectangle(0, 0, XM, YM, sf::Color(25, 65, 30));
sf::Shape Rect2 = sf::Shape::Rectangle(XM, 0, 800, YM, sf::Color(20, 25, 200));
sf::Shape Rect3 = sf::Shape::Rectangle(0, YM, 800, 600, sf::Color(91, 24, 24));
// Initialisation des variables.
sf::Clock Clock;
n = 0;
t[0] = 0;
delta_t[0] = 0;
y[0] = 0;
v[0] = 0;
a[0] = (DMAS*VEJECT)/(MF-DMAS*t[0])-((G*MT)/pow((RT+y[0]),2));
// Écriture du titre et des premières données dans le fichier saturn.txt.
outputFile << "t[n] y[n] v[n] a[n]"<< endl << endl;
outputFile << std::fixed << setprecision (2) << t[0]<<" "<< y[0]<<" "<< v[0]<<" "<<a[0] << endl;
// Début de la simulation.
while (App.IsOpened())
{
sf::Event Event;
while (App.GetEvent(Event))
{
if (Event.Type == sf::Event::Closed)
App.Close();
}
App.Clear();
temps = Clock.GetElapsedTime(); // Mesure du temps.
if (i==99) // Échantillonnage des données (1:100).
{
t[n] = temps;
delta_t[n] = t[n] - t[n-1];
y[n] = v[n-1]*delta_t[n-1] + y[n-1];
v[n] = a[n-1]*delta_t[n-1] + v[n-1];
a[n] = (DMAS*VEJECT)/(MF-DMAS*t[n])-((G*MT)/pow((RT+y[n]),2));
cout << "t["<< std::fixed << setprecision (2) << n<<"]= "<<t[n]<<" delta t= "<<delta_t[n]<< " y= " << y[n] <<" v= "<<v[n]<<" a= "<<a[n]<< endl<<endl;
outputFile << std::fixed << setprecision (2) << t[n]<<" "<< y[n]<<" "<< v[n]<<" "<<a[n] << endl;
n++;
i = 0;
}
i++;
// Affichage des fenêtres et du contenu à l'intérieur.
App.Draw(Rect1);
App.Draw(Rect2);
App.Draw(Rect3);
sf::String Titre1("Donnees", Arial, 25);
sf::String Texte11("Temps (s) :", Arial, 15);
sf::String Texte12("Altitude (km) :", Arial, 15);
sf::String Texte13("Vitesse (m/s) :", Arial, 15);
sf::String Texte14("Acceleration (m/s^2) :", Arial, 15);
Titre1.Move(50.f, 20.f);
Texte11.Move(20.f, 80.f);
Texte12.Move(20.f, 120.f);
Texte13.Move(20.f, 160.f);
Texte14.Move(20.f, 200.f);
sf::String Titre2("Simulation graphique", Arial, 25);
Titre2.Move(400.f, 20.f);
sf::String Titre3("Messages", Arial, 25);
Titre3.Move(350.f, 500.f);
sf::String Texte30("La fusee vient de decoller.", Arial, 15);
Texte30.Move(30.f, 550.f);
sf::String Texte31("La fusee a atteint l'altitude de 1 km.", Arial, 15);
Texte31.Move(30.f, 550.f);
sf::String Texte32("Limite d'Armstrong atteinte (18,9 km).", Arial, 15);
Texte32.Move(30.f, 550.f);
sf::String Texte33("La fusee a atteint l'ionosphere (85 km).", Arial, 15);
Texte33.Move(30.f, 550.f);
App.Draw(Titre1);
App.Draw(Texte11);
App.Draw(Texte12);
App.Draw(Texte13);
App.Draw(Texte14);
App.Draw(Titre2);
App.Draw(Titre3);
// Affichage des messages dans la fenêtre du bas.
if (y[n-1] < 1000)
App.Draw(Texte30);
else
if (y[n-1] < 18900)
App.Draw(Texte31);
else
if (y[n-1] < 85000)
App.Draw(Texte32);
;
// Réafficher la fenêtre entière.
App.Display();
}
return 0;
}