-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimulation.h
More file actions
206 lines (166 loc) · 6.36 KB
/
simulation.h
File metadata and controls
206 lines (166 loc) · 6.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#ifndef SIMULATION_H
#define SIMULATION_H
#include <QWidget>
#include <QPainter>
#include <QLabel>
#include <QPushButton>
#include <QSlider>
#include <QTimer>
#include <QElapsedTimer>
#include <QMessageBox>
#include <QApplication>
#include "general.h"
#include "particule.h"
#include "remplissage.h"
#include "particuleliste.h"
#include <QtMath>
#include "thermometre.h"
#include "phmetre.h"
#include "conductimetre.h"
#include "chronometre.h"
#include "colorimetre.h"
#include "ordinateur.h"
/*
* [Simulation]
*
* Partie de gauche de MainWindow contenant la simulation
* Essaye de tourner à 60 FPS
*
*/
class Simulation : public QWidget
{
Q_OBJECT
public:
Simulation(QList<ParticuleListe*> *particulesListeT, General *generalT, QWidget *parent = nullptr);
~Simulation();
void calculPH(double H3O = 0, double HO = 0);
//double calculCoeffAleatoire(double p, double t);
void refaireListeParticule();
void nettoyer();
//Instruments
void utiliserChronometre(bool checked);
void utiliserThermometre(bool checked);
void utiliserPHMetre(bool checked);
void utiliserConductimetre(bool checked);
void utiliserColorimetre(bool checked);
void utiliserOrdinateur(bool checked);
//Set et Get pour les variables
double getVolumeBecher() const;
void setVolumeBecher(double value);
double getVolumeBurette() const;
void setVolumeBurette(double value);
int getTypeBecher() const;
void setTypeBecher(int value);
int getTypeBurette() const;
void setTypeBurette(int value);
bool getPaused() const;
void setPaused(bool value, bool bouton = false);
void setConcentration(bool value);
double getTemperatureBecher() const;
void setTemperatureBecher(double value);
QColor getCouleurArrierePlan() const;
void setCouleurArrierePlan(const QColor &value);
bool getFpsAEnvoyer() const;
void setFpsAEnvoyer(bool value);
public slots:
void loop(); //Fonction principale, appelée 1000 fois par secondes mais le bloc principal est exécuté à une fréquence dépendant du nombre de FPS (Par défaut : 60 fois par secondes)
void donneeRemplissageRecu(Remplissage remplir);
void donneeAnnuler();
signals:
void chronoStart();
void chronoReset();
void chronoMode();
void pause();
void lagging(QString lag); //lag = message à afficher
protected:
virtual void paintEvent(QPaintEvent *event) override;
virtual void keyPressEvent(QKeyEvent *event) override;
private:
General *general;
QList<ParticuleListe*> *particulesListe;
bool concentration; //Vis-à-vis de la liste de particules à droite de MainWindow
//Pause
bool paused;
bool pauseBouton;
bool pauseDialog;
//Timers et FPS
int compteFps; //Augmente de 1 à chaque frame, remis à 0 chaque secondes
int fpsActuel; //compteFPS avant sa remise à 0
int fpsCible;
bool fpsAEnvoyer;
double dernierElapsed; //Utile dans la détection des lag spikes
int rateFps; //Nombre de fois d'affilée où (fpsActuel) < (fpsCible) / 2
bool messageFps; //Le message de ralentissement est t-il affichée ?
QElapsedTimer timerGlobal; //Compte le temps de simulation, pauses comprises
QElapsedTimer timerPause; //Compte le temps que la simulation a été en pause
long totalTempsPause; //Temps total passé en pause
QElapsedTimer timerFrame; //Remis à 0 à chaque frame
QElapsedTimer timerSecondes; //Remis à 0 toutes les secondes
//Images de la simulations
QLabel *becher;
QLabel *burette;
//Interactions burette-becher
QSlider *debitBurette;
//Quantités de liquides (en mL)
double volumeBecher;
double volumeBurette;
double volumeInitialBurette;
int typeBecher; //Type 1 : 100 mL ; Type 2 : 200 mL ; Type 4 : 400 mL
int typeBurette; //Type 1 : 25 mL ; Type 2 : 50 mL
//Particules
QList<Particule*> particules;
int nombreDansBurette;
int nombreDansBecher;
QList<int> degagementGazeux; //Nombre de particules gazeuses sortie du becher pour chaque type (y compris particules non gazeuses)
//Couleurs
QColor couleurArrierePlan;
QColor couleurBecher;
QColor couleurBurette;
//Quadrillage de concentrations (pour éviter que toutes les particules se concentre au même endroit)
int maxX;
int maxY;
int maxXmini;
int maxYmini;
QList<unsigned int> concentrationBecher[20][19]; //[x][y][typeParticule]
QList<QPoint> concentrationMaxBecher; //[typeParticule]
QVector<QVector<Particule*>> concentrationBecherParticule[15][15]; //[x][y][typeParticule][particule]
QVector<int> concentrationBecherParticuleTaille[15][15]; //[x][y][typeParticule]
bool concentrationBecherParticuleInitialise;
QList<unsigned int> concentrationBurette[73]; //[y][typeParticule]
QList<int> presenceSolide[172][163]; //[x][y][typeParticule]
//Attirances entre réactifs
void refaireReactifsAttires();
QList<int> reactionsPossibles; //[Réaction]
QList<int> reactionsPossiblesPrecedent; //reactionsPossibles lors de la frame précédente
QList<QList<int>> reactifsAttires; //[typeParticule] attiré par [n]
QList<int> coefficientAttiranceReactif; //[typeParticule]
QList<int> coefficientAttiranceReactifCinetique; //[typeParticule]
QList<bool> stopReactif[15][15]; //[x][y][typeParticule]
double mouvementConcentration(int n); //(|n| < 1) -> 0 ; (0 < |n| < 22) -> (0.2 + (|n| - 1) / 50) * (|n| / n) ; (|n| > 21) -> 0.6 * (|n| / n)
double vibrationConcentration(unsigned int n); //(n < 22) -> 1 + (n - 1) * 0.1 ; (n > 21) -> 3
//Temps
long frames; //1 frame = 1/50 secondes
bool chronometrePresent;
Chronometre *chronometre;
//Température
double temperatureBecher;
double temperatureBurette;
bool thermometrePresent;
Thermometre *thermometre;
//pH
double pH;
bool pHMetrePresent;
PHMetre *pHMetre;
//Conductivité
bool conductimetrePresent;
Conductimetre *conductimetre;
//Absorbance
bool colorimetrePresent;
Colorimetre *colorimetre;
//Ordinateur
bool ordinateurPresent;
QLabel *ecran;
Ordinateur *ordinateur;
double obtenirValeurPourOrdinateur(int type);
};
#endif // SIMULATION_H