Bonjour à tous.
J'ai récemment dû réécrire une fonction qui lisais un fichier et remplissait un tableau de points dans un soucis de simplification et de type de dessin demandé. Ma fonction maintenant lis un fichier et dessine directement les points en lisant le fichier, en sélectionnant au préalable un type qui dépends du contenu du fichier (si la première ligne contient un symbole particulier on change de style de dessin). Le seul ennui, bah c'est que ça dessine rien à l'écran...
Voilà ma fonction :
Et voilà le contenu de la classe que j'utilise pour le widget openGL que j'ai créé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void drawFromFile(string filename) { ifstream file(filename.c_str()); //Ouverture du fichier. string nom_motif; point p1, p2; int x1, y1, x2, y2; bool dots = true; if (!file) //Si le fichier n'est pas lu... { cerr << "setDataTable : can't read " << filename << "." << endl; throw std::runtime_error("file not opened: "+ filename); //Erreur ! + envoi d'erreur. } string line; while (getline(file,line)) //Tant qu'on lit des lignes dans le fichier. { istringstream iss(line); iss >> nom_motif; //Le premier élément trouvé se place dans la variable nom_motif if (nom_motif[0]=='#') { dots = false; cout << "dots passé à false" << endl; continue; //Si ce premier élément //commence par # ou un espace, on ignore le reste de la ligne. } if (dots) { iss >> x1; iss >> y1; p1.setX(x1); p1.setY(y1); cout << fixed << p1.getX() << " " << p1.getY() << endl; drawDot(p1); } else { iss >> x1; iss >> y1; iss >> x2; iss >> y2; p1.setX(x1); p1.setY(y1); p2.setX(x2); p2.setY(y1); cout << fixed << p1.getX() << " " << p1.getY() << " " << p2.getX() << " " << p2.getY() << endl; drawLine(p1, p2); } //Mise en place des éléments sous forme de points dans le vecteur passé en paramètre. } cout << "Fin fonction drawFromFile" << endl; file.close(); }
poly1, poly2 et poly3 se dessinent sans problème. C'est vraiment ce qu'il y a dans la fonction drawFromFile() qui ne passe pas du tout, sans que je capte pourquoi. Pourtant toutes les autres fonctions que j'ai faites passent sans problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include "VistaWindow.h" VistaWindow::VistaWindow(QWidget *parent) : VistaWidget(60, parent, "VISTA") { } void VistaWindow::initializeGL() { glShadeModel(GL_SMOOTH); //Sélection du shading. glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Sépcification des valeurs pour lesquelles //le rouge, le bleu, le vert et la transparence sont nuls. glClearDepth(1.0f); //Définie la valeur pour laquelle on est "au fond" du repère. glEnable(GL_DEPTH_TEST); //Active les comparaisons de profondeur. glDepthFunc(GL_LEQUAL); //Définie la valeur utilisée pour les fonctions de //comparaison de profondeur. Ici, plus petit ou égal. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //Définie des options de qualité. //Ici : qualité la plus haute, correction de la perspective. } void VistaWindow::resizeGL(int width, int height) { //Redéfinit les vertex en cas de changement de taille de la fenêtre. if(height == 0) height = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glClearColor(1.0,1.0,1.0,1.0); } void VistaWindow::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //gluOrtho2D(6,7,68,69); setCamera(point(0,0),100); glTranslatef(0.0, 0.0, 2.5); //Positionne le prochain objet déclaré dans la matrice. glColor3f(0.0, 0.5, 1.0); drawFromFile("../Phase6/IM/motifs_lambert93.txt"); //N'est pas dessiné pour une raison que j'ignore vector<point> poly1; poly1.push_back(point(-50,50)); poly1.push_back(point(50,50)); poly1.push_back(point(50,-50)); poly1.push_back(point(-50,-50)); drawEmptyPolygon(poly1); vector<point> poly2; poly2.push_back(point(-25,25)); poly2.push_back(point(25,25)); poly2.push_back(point(25,-25)); poly2.push_back(point(-25,-25)); drawEmptyPolygon(poly2); vector<point> poly3; poly3.push_back(point(-75,75)); poly3.push_back(point(75,75)); poly3.push_back(point(75,-75)); poly3.push_back(point(-75,-75)); drawEmptyPolygon(poly3); glFlush(); }
Je vous met également le projet complet a disposition si vous voulez regarder tout le code : http://www44.zippyshare.com/v/CA58ZhIj/file.html
Merci d'avance pour votre aide.
Partager