Simplexus  1.0
Création d'un pavage par des simplexes de dimension N et visualisation graphique en dimension 2.
graphicutil.cpp
Go to the documentation of this file.
1 #include "graphicutil.hpp"
2 
3 using namespace grapic;
4 
5 //TODO interface plus friendly, boutons fonctionnalités, écran d'accueil et choix pavage de départ?
6 void drawPavage(Pavage<2>& pavage){
7 
8  //Création de la fenetre
9  winInit("Pavage Drawing", 800, 610);
10  backgroundColor( 185, 210, 225, 255 );
11 
12  //Definition de la taille de police
13  fontSize(16);
14 
15  //Nettoyage de la fenetre
16  winClear();
17 
18  Point<2> pt((double)(300.), (double)(300.));
19  bool stop = false;
20  while(!stop)
21  {
22  stop = winManageEvent();
23 
24  int x,y;
25  mousePos(x, y);
26  pt.setCoord(0, (double)x - 300.);
27  pt.setCoord(1, (double)y - 300.);
28 
29  bool clicked = false;
30  bool addpt = false;
31  bool insidePavage = false;
32  bool empty = pavage.empty();
33 
34  if(grapic::isMousePressed(SDL_BUTTON_LEFT)) {
35  clicked = true;
36  }
37 
38  if(grapic::isMousePressed(SDL_BUTTON_RIGHT)) {
39  addpt = true;
40  }
41 
42  color(0,0,0);
43  std::set<std::vector<Point<2>*>> figures = pavage.getFigures();
44 
45  std::vector<Point<2>*> highlight;
46 
47  //On créé le dessin du pavage : les points liés entre eux par des segments
48  for (std::vector<Point<2>*> figure : figures){
49 
50  if ((clicked || addpt) && pavage.isPointInFigure(figure, pt)) {
51  highlight.empty();
52  highlight=figure;
53  insidePavage=true;
54  }
55  else if (pavage.isPointInFigure(figure, pt)) {
56  insidePavage=true;
57  }
58 
59  for (unsigned int i=0; i<figure.size(); i++){
60  Point<2>* pointCur = figure.at(i);
61  for (unsigned int j=i+1; j<figure.size(); j++){
62  Point<2>* pointCur2 = figure.at(j);
63  line(300+pointCur->getCoord(0),300+pointCur->getCoord(1),300+pointCur2->getCoord(0),300+pointCur2->getCoord(1));
64  }
65  }
66 
67  }
68 
69  //Si l'on a cliqué avec la souris sur le bouton droit
70  //Et que l'on est à l'intérieur du pavage ou que le pavage est vide (sans figure)
71  //On demande à l'utilisateur un point pour l'ajouter dans l'espace et dans le pavage
72  if (addpt && (insidePavage || empty)){
73  double valeur;
74  std::cout << "Entrez une valeur : ";
75  std::cin >> valeur;
76  pavage.addPoint(pt, valeur);
77  std::cout<<pt<<std::endl;
78  }
79  //Si l'on est hors du pavage, on ne peut pas ajouter de point
80  else if (addpt && !insidePavage){
81  color(255,0,0);
82  std::stringstream avert;
83  avert << "Impossible d'ajouter le point " << pt << " qui n'est pas dans le pavage!";
84  grapic::print(1, 1, avert.str().c_str());
85  }
86  //Si l'on a cliqué sur le bouton gauche et que l'on est à l'intérieur du pavage
87  //On met en valeur la figure à laquelle appartient le point pointé par la souris
88  //Et on affiche les informations de la figure, puis la valeur d'interpolation du point
89  else if (clicked && insidePavage) {
90  color(255,0,0);
91  for (unsigned int i=0; i<highlight.size(); i++){
92  Point<2>* pointCur = highlight.at(i);
93  for (unsigned int j=i+1; j<highlight.size(); j++){
94  Point<2>* pointCur2 = highlight.at(j);
95  line(300+pointCur->getCoord(0),300+pointCur->getCoord(1),300+pointCur2->getCoord(0),300+pointCur2->getCoord(1));
96  }
97  }
98 
99  color(0,0,0);
100  std::stringstream coord;
101  coord << pt.getCoord(0) << " " << pt.getCoord(1) << " " << "figure : " ;
102  for (int i=0; i<3 ;i++){
103  coord << *highlight.at(i) << " ";
104  }
105 
106 
107  grapic::print(1, 25, coord.str().c_str());
108 
109  fontSize(20);
110  color(255,0,0);
111 
112  std::stringstream interpo;
113  interpo << "Valeur d'interpolation : " << pavage.interpolation(pt);
114 
115  grapic::print(1, 1, interpo.str().c_str());
116 
117  fontSize(16);
118  color(0,0,0);
119  }
120  //Si on est en dehors du pavage on et qu'on a cliqué sur aucun bouton, on l'indique à l'utilisateur
121  else if (!insidePavage){
122  color(255,0,0);
123  std::stringstream avert;
124  avert << "Vous etes en dehors du pavage!";
125  grapic::print(1, 1, avert.str().c_str());
126  }
127  //Sinon on affiche le point associé a la position de la souris
128  else if (insidePavage){
129  color(0,0,0);
130  std::stringstream coord;
131  coord << pt.getCoord(0) << " " << pt.getCoord(1);
132  grapic::print(1, 1, coord.str().c_str());
133  }
134 
135  //On créé des petits rectangles pour chaque points
136  std::list<Point<2>*> list = pavage.getSinglePoints();
137  for (const auto pt : pavage.getSinglePoints()){
138  color(0,0,0);
139  rectangleFill(pt->getCoord(0)+299,pt->getCoord(1)+299,pt->getCoord(0)+301,pt->getCoord(1)+301);
140  }
141 
142  //On affiche les dessins précédemment créé
143  winDisplay();
144  delay(50);
145  winClear();
146  highlight.empty();
147  }
148 
149  pause();
150  winQuit();
151 }
bool isPointInFigure(const std::vector< Point< N > * > &figure, const Point< N > &pt) const
Test d'appartenance d'un point à une figure.
Definition: pavage.hpp:385
classe representant un pavage consitué de trisimplexe dans un espace de dimension N ...
Definition: pavage.hpp:38
double getCoord(unsigned int index) const
Getter d'une coordonnée.
Definition: point.hpp:341
bool empty() const
Teste si le pavage est vide.
Definition: pavage.hpp:377
void drawPavage(Pavage< 2 > &pavage)
Dessin d'un pavage.
Definition: graphicutil.cpp:6
void addPoint(Point< N > &pt, double val)
Ajout d'un point au pavage.
Definition: pavage.hpp:430
void setCoord(unsigned int index, double val)
setter d'une coordonnée du point e la coordonnée d'index index du point
Definition: point.hpp:320
double interpolation(const Point< N > &point) const
Calcul de la valeur d'interpolation d'un point.
Definition: pavage.hpp:578
classe representant un point dans un espace de dimension N
Definition: point.hpp:29
std::set< std::vector< Point< N > * > > & getFigures()
Getter des figures du pavage.
Definition: pavage.hpp:367
std::list< Point< N > * > getSinglePoints() const
Getter des points du pavage.
Definition: pavage.hpp:331