Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

Window2D Class Reference

#include <window2D.h>

List of all members.

Public Member Functions

 Window2D (QWidget *parent=0, const char *name=0)
 ~Window2D ()
vector< Primitive * > getPrimitivesList ()
int getTypePrimitive ()
int getNbPrimitives ()
int getNbPoints ()
int getSample ()
void setSample (int s)
bool isModified ()
void setTypePrimitive (const int typePrim)
void load (vector< Primitive * > &prim)
void clear ()
void changeCoordinateSystemWindow ()
void changeCoordinateSystemReverseWindow ()
void setModified (bool modified=false)

Public Attributes

bool closedShape

Protected Member Functions

void clearVectors ()
void paintEvent (QPaintEvent *)
void mousePressEvent (QMouseEvent *)
void mouseReleaseEvent (QMouseEvent *)
void mouseMoveEvent (QMouseEvent *)
void closeEvent (QCloseEvent *)

Private Attributes

vector< QPoint > pointsList
int typePrimitive
int nbPoints
bool down
vector< Primitive * > primitivesList
int nbPrimitives
bool move
int selectedPoint
int indexCurrentPoint
QPoint currentPoint
vector< Point3D * > lastPointsList
Point3D origin
bool toBezier
bool modification
int sample


Detailed Description

La classe Window2D regroupe l'ensemble des fonctionnalités nécéssaires au dessin de primitives. Les dessins s'effectuent sur des objets Qpainter

Author:
Guitteny Fabrice

Idiart Baptiste

Le Goff Erwan


Constructor & Destructor Documentation

Window2D::Window2D QWidget *  parent = 0,
const char *  name = 0
 

constructeur par défaut

00008 : QWidget( parent, name ) 00009 { 00010 // initialisation de la fenêtre 00011 setBackgroundColor( white ); 00012 setCaption(name); 00013 setBaseSize( QSize(WIDTH,HEIGHT) ); 00014 00015 // initialisation des paramètres de la fenêtre 00016 nbPoints = 0; 00017 nbPrimitives = 0; 00018 down = FALSE; 00019 move = FALSE; 00020 closedShape = FALSE; 00021 00022 origin = Point3D(width() / 2, height() / 2, 0); 00023 00024 indexCurrentPoint = 0; 00025 toBezier = FALSE; 00026 00027 sample = NORMAL_SAMPLE; 00028 00029 // type de prinitive par défaut --> SEGMENT 00030 typePrimitive = SEGMENT; 00031 00032 modification = FALSE; 00033 }

Window2D::~Window2D  ) 
 

00040 { 00041 clearVectors(); 00042 }


Member Function Documentation

void Window2D::changeCoordinateSystemReverseWindow  ) 
 

changement de repère inverse par rapport au centre de la fenêtre

00485 { 00486 for (int i = 0; i < nbPrimitives; i++) 00487 { 00488 for (unsigned int j = 0; j < primitivesList[i]->samplesPointsList.size(); j++) 00489 { 00490 primitivesList[i]->samplesPointsList[j] = new Point3D(changeCoordinateSystemReverse(*(primitivesList[i]->samplesPointsList[j]),origin)); 00491 } 00492 00493 for (unsigned int j = 0; j < primitivesList[i]->pointsList.size(); j++) 00494 { 00495 primitivesList[i]->pointsList[j] = new Point3D(changeCoordinateSystemReverse(*(primitivesList[i]->pointsList[j]),origin)); 00496 } 00497 } 00498 for (unsigned int i = 0; i < pointsList.size(); i++) 00499 { 00500 Point3D * point = qPointToPoint3D(pointsList[i]); 00501 pointsList[i] = point3DToQPoint(new Point3D(changeCoordinateSystemReverse(*point,origin))); 00502 } 00503 for (unsigned int i = 0; i < lastPointsList.size(); i++) 00504 { 00505 lastPointsList[i] = new Point3D(changeCoordinateSystemReverse(*lastPointsList[i],origin)); 00506 } 00507 }

void Window2D::changeCoordinateSystemWindow  ) 
 

changement de repère par rapport au centre de la fenêtre

00455 { 00456 for (int i = 0; i < nbPrimitives; i++) 00457 { 00458 for (unsigned int j = 0; j < primitivesList[i]->samplesPointsList.size(); j++) 00459 { 00460 primitivesList[i]->samplesPointsList[j] = new Point3D(changeCoordinateSystem(*(primitivesList[i]->samplesPointsList[j]),origin)); 00461 } 00462 00463 for (unsigned int j = 0; j < primitivesList[i]->pointsList.size(); j++) 00464 { 00465 primitivesList[i]->pointsList[j] = new Point3D(changeCoordinateSystem(*(primitivesList[i]->pointsList[j]),origin)); 00466 } 00467 } 00468 for (unsigned int i = 0; i < pointsList.size(); i++) 00469 { 00470 Point3D * point = qPointToPoint3D(pointsList[i]); 00471 pointsList[i] = point3DToQPoint(new Point3D(changeCoordinateSystem(*point,origin))); 00472 } 00473 for (unsigned int i = 0; i < lastPointsList.size(); i++) 00474 { 00475 lastPointsList[i] = new Point3D(changeCoordinateSystem(*lastPointsList[i],origin)); 00476 } 00477 }

void Window2D::clear  ) 
 

réinitialisation de la fenêtre

00431 { 00432 clearVectors(); 00433 nbPrimitives = 0; 00434 indexCurrentPoint = 0; 00435 toBezier = FALSE; 00436 closedShape = FALSE; 00437 update(); 00438 }

void Window2D::clearVectors  )  [protected]
 

efface les vecteurs de la fenêtre

00051 { 00052 primitivesList.clear(); 00053 pointsList.clear(); 00054 lastPointsList.clear(); 00055 }

void Window2D::closeEvent QCloseEvent *   )  [protected]
 

00446 {}

int Window2D::getNbPoints  )  [inline]
 

Returns:
entier correspondant au nombre de points

00147 {return nbPoints;}

int Window2D::getNbPrimitives  )  [inline]
 

Returns:
entier correspondant au nombre de primitives
See also:
primitive.h

00144 {return nbPrimitives;}

vector<Primitive *> Window2D::getPrimitivesList  )  [inline]
 

accesseur aux différents types de primitives utilisées

Returns:
vecteur de pointeur sur des Primitives
See also:
primitive.h

00133 {return primitivesList;}

int Window2D::getSample  )  [inline]
 

accesseur : valeur de l'échantillonage

Returns:
nombre d'échantillons

00152 {return sample;}

int Window2D::getTypePrimitive  )  [inline]
 

accesseur au type de la primitive courante

Returns:
entier correspondant à une primitive
See also:
primitive.h

00139 {return typePrimitive;}

bool Window2D::isModified  )  [inline]
 

Returns:
booléen indiquant s'il faut rafraichir la fenetre OpenGL

00166 {return modification;}

void Window2D::load vector< Primitive * > &  prim  ) 
 

charge des primitives dans la fenêtre.

Parameters:
prim vecteur de primitives.

00388 { 00389 // réinitialisation des données de la fenêtre 00390 clearVectors(); 00391 00392 // récupération des primitives du fichier 00393 nbPrimitives = prim.size(); 00394 primitivesList = prim; 00395 00396 closedShape = FALSE; 00397 sample = NORMAL_SAMPLE; 00398 00399 // création des points de contrôle 00400 for (int i = 0; i < nbPrimitives; i++) 00401 { 00402 for (unsigned int j = 0; j < primitivesList[i]->pointsList.size(); j++) 00403 { 00404 QPoint point = point3DToQPoint(primitivesList[i]->pointsList[j]); 00405 int nearTest = nearPoint(point,pointsList); 00406 if (nearTest == -1) 00407 pointsList.push_back(point); 00408 else 00409 closedShape = TRUE; 00410 } 00411 } 00412 00413 // on initialise le point en cours au 1er point de la liste de points 00414 indexCurrentPoint = 0; 00415 if (nbPrimitives != 0) 00416 { 00417 currentPoint = pointsList[indexCurrentPoint]; 00418 lastPointsList.push_back(qPointToPoint3D(currentPoint)); 00419 } 00420 update(); 00421 toBezier = FALSE; 00422 }

void Window2D::mouseMoveEvent QMouseEvent *   )  [protected]
 

00134 { 00135 // si le bouton droit de la souris est pressé, 00136 // l'utilisateur peut bouger les primitives 00137 00138 if (move && down) 00139 { 00140 // on récupère le point initial à bouger 00141 QPoint refPoint = pointsList[selectedPoint]; 00142 00143 // on récupère la nouvelle position 00144 QPoint modifPoint = e->pos(); 00145 00146 // on vérifie si cette nouvelle position est "proche" d'un autre point déjà défini 00147 int nearTest = nearPoint(e->pos(), pointsList); 00148 00149 if (nearTest == selectedPoint || nearTest == -1) 00150 { 00151 // si on n'est pas proche d'un autre point, 00152 // on modifie les coordonnées du point 00153 pointsList[selectedPoint] = modifPoint; 00154 00155 // et on modifie toutes les primitives basées sur ce point 00156 for(unsigned int i = 0; i < primitivesList.size(); i++) 00157 primitivesList[i]->setPrimitive(refPoint,modifPoint); 00158 00159 currentPoint = pointsList[indexCurrentPoint]; 00160 00161 lastPointsList[0] = qPointToPoint3D(currentPoint); 00162 } 00163 00164 // appel à la fonction de dessin 00165 update(); 00166 } 00167 }

void Window2D::mousePressEvent QMouseEvent *   )  [protected]
 

00176 { 00177 // la souris est pressée 00178 down = TRUE; 00179 00180 // bouton de gauche --> dessin d'un point 00181 if (e->button() == LeftButton) 00182 { 00183 // cas particulier : l'utilisateur passe du dessin d'une bspline à une autre primitive 00184 // problème : si le nouveau type de primitives est une bezier, cette dernière n'est 00185 // pas dessinée tant qu'il n'a pas défini 4 points et donc ce test est vrai 00186 // tant que les 4 points ne sont pas définis 00187 if ( (nbPrimitives > 0) && (primitivesList[nbPrimitives-1]->type == BSPLINE) && (typePrimitive != BSPLINE) ) 00188 { 00189 if (typePrimitive != BEZIER) 00190 { 00191 if (toBezier == FALSE) 00192 { 00193 lastPointsList.clear(); 00194 lastPointsList.push_back(qPointToPoint3D(currentPoint)); 00195 } 00196 } 00197 else 00198 { 00199 if (toBezier == FALSE) 00200 { 00201 lastPointsList.clear(); 00202 lastPointsList.push_back(qPointToPoint3D(currentPoint)); 00203 toBezier = TRUE; 00204 } 00205 } 00206 } 00207 00208 int nearTest = nearPoint(e->pos(), pointsList); 00209 00210 // on vérifie si le point désigné par l'utilisateur est déjà défini 00211 00212 if (nearTest == -1) // si ce n'est pas le cas, on ajoute ce point 00213 { // et on met à jour le point courant 00214 indexCurrentPoint = pointsList.size(); 00215 pointsList.push_back(e->pos()); 00216 currentPoint = e->pos(); 00217 } 00218 else // sinon, le point courant est le point déjà défini 00219 { 00220 indexCurrentPoint = nearTest; 00221 closedShape = TRUE; 00222 currentPoint = pointsList[indexCurrentPoint]; 00223 } 00224 00225 lastPointsList.push_back(qPointToPoint3D(currentPoint)); // on crée le point3D associé au point courant et on l'ajoute à la liste 00226 00227 nbPoints = pointsList.size(); // on met à jour le nombre de points définis 00228 00229 // on crée les primitives selon le type selectionné 00230 00231 switch (typePrimitive) 00232 { 00233 case SEGMENT : 00234 if (lastPointsList.size() >= 2) // il faut au moins 2 points pour dessiner un segment 00235 { 00236 for (unsigned int i = 0; i < lastPointsList.size() - 1; i++) 00237 { 00238 Segment *seg = new Segment(); // on crée un segment à partir des 2 derniers points définis par l'utilisateur 00239 seg->pointsList.push_back(lastPointsList[i]); 00240 seg->pointsList.push_back(lastPointsList[i + 1]); 00241 00242 primitivesList.push_back(seg); // on ajoute le segment créé à la liste de primitives de la fenêtre 00243 nbPrimitives++; // on incrémente le nombre de primitives 00244 } 00245 lastPointsList.clear(); 00246 lastPointsList.push_back(qPointToPoint3D(currentPoint)); 00247 } 00248 break; 00249 00250 case CIRCLE : 00251 00252 if (lastPointsList.size() >= 2) // il faut au moins 2 points pour dessiner un cercle 00253 { 00254 for (unsigned int i = 0; i < lastPointsList.size() - 1; i++) 00255 { 00256 Circle *cir = new Circle(); // on crée un cercle à partir des 2 derniers points définis par l'utilisateur 00257 cir->pointsList.push_back(lastPointsList[i + 1]); 00258 cir->pointsList.push_back(lastPointsList[i]); 00259 cir->calculateRadius(); // on calcule le rayon 00260 00261 primitivesList.push_back(cir); // on ajoute le cercle créé à la liste de primitives de la fenêtre 00262 nbPrimitives++; // on incrémente le nombre de primitives 00263 } 00264 00265 // on repart du point définissant le rayon du cercle et non de son centre 00266 Point3D * lastButOnePoint = lastPointsList[lastPointsList.size() - 2]; 00267 lastPointsList.clear(); 00268 lastPointsList.push_back(lastButOnePoint); 00269 } 00270 break; 00271 00272 case BEZIER : 00273 if (lastPointsList.size() >= 4) // il faut au moins 4 points pour dessiner une bézier 00274 { 00275 for (unsigned int i = 0; i < lastPointsList.size() - 1; i += 4) 00276 { 00277 Bezier * bez = new Bezier(); // on crée une courbe de Bézier à partir des 4 derniers points définis par l'utilisateur 00278 bez->pointsList.push_back(lastPointsList[i]); 00279 bez->pointsList.push_back(lastPointsList[i + 1]); 00280 bez->pointsList.push_back(lastPointsList[i + 2]); 00281 bez->pointsList.push_back(lastPointsList[i + 3]); 00282 00283 primitivesList.push_back(bez); // on ajoute la courbe de Bézier créée à la liste de primitives de la fenêtre 00284 nbPrimitives++; // on incrémente le nombre de primitives 00285 } 00286 lastPointsList.clear(); 00287 lastPointsList.push_back(qPointToPoint3D(currentPoint)); 00288 00289 toBezier = FALSE; 00290 } 00291 break; 00292 00293 case BSPLINE : 00294 if (lastPointsList.size() >= 4) // il faut au moins 4 points pour dessiner une bspline 00295 { 00296 Bspline * bspl = new Bspline(); 00297 00298 // si la dernière primitive dessinée n'est pas une bspline, 00299 if ( (nbPrimitives == 0) || ( (nbPrimitives > 0) && (primitivesList[nbPrimitives-1]->type != BSPLINE) ) ) 00300 { 00301 for (unsigned int i = 0; i < lastPointsList.size(); i++) 00302 bspl->pointsList.push_back(lastPointsList[i]); 00303 00304 primitivesList.push_back(bspl); // on ajoute la bspline à la liste des primitives 00305 nbPrimitives++; // on incrémente le nombre de primitives 00306 } 00307 else // sinon, on met à jour la dernière primitive de l'ensemble 00308 { 00309 int max = primitivesList[nbPrimitives-1]->pointsList.size(); 00310 00311 for (int i = 0; i < max; i++) 00312 { 00313 Point3D * point = primitivesList[nbPrimitives-1]->pointsList[i]; 00314 bspl->pointsList.push_back(point); 00315 } 00316 00317 if (toBezier) 00318 { 00319 for (unsigned int i = 1; i < lastPointsList.size(); i++) 00320 { 00321 bspl->pointsList.push_back(lastPointsList[i]); 00322 } 00323 toBezier = FALSE; 00324 } 00325 else 00326 bspl->pointsList.push_back(qPointToPoint3D(currentPoint)); 00327 00328 primitivesList.pop_back(); // on remplace l'ancienne bspline par la nouvelle 00329 primitivesList.push_back(bspl); 00330 } 00331 } 00332 break; 00333 00334 default : 00335 break; 00336 } 00337 00338 } 00339 else 00340 { 00341 if (e->button() == MidButton) // si l'utilisateur clique sur le bouton droit de la souris --> on ferme la forme 00342 { 00343 if (nbPoints > 2) // il faut au moins 3 points pour pouvoir fermer la forme 00344 { 00345 Segment *seg = new Segment(); // on crée le segment entre le point en cours et le 1er point de la liste 00346 seg->pointsList.push_back(qPointToPoint3D(currentPoint)); 00347 Point3D * refPoint = qPointToPoint3D(pointsList[0]); 00348 seg->pointsList.push_back(refPoint); 00349 lastPointsList.clear(); 00350 lastPointsList.push_back(refPoint); 00351 primitivesList.push_back(seg); // on ajoute ce segment à la liste de primitives 00352 nbPrimitives++; 00353 closedShape = true; 00354 } 00355 else 00356 { 00357 // sinon, on envoie un message d'erreur 00358 QMessageBox *mbox = new QMessageBox(QString("ERREUR"),QString("Il faut au moins 3 points pour fermer la forme !"), 00359 QMessageBox::Critical,QMessageBox::Ok,QMessageBox::NoButton, 00360 QMessageBox::NoButton,this); 00361 mbox->show(); 00362 } 00363 } 00364 else 00365 { 00366 // boutton de droite --> mode déplacement de point 00367 // on test si l'utilisateur sélectionne bien un point de la fenêtre 00368 int nearTest = nearPoint(e->pos(), pointsList); 00369 00370 // si c'est le cas et qu'il n'est pas en train de bouger un autre, 00371 // on met à jour la valeur du point sélectionné 00372 if (nearTest != -1 && !move) 00373 { 00374 move = TRUE; 00375 selectedPoint = nearTest; 00376 } 00377 } 00378 } 00379 }

void Window2D::mouseReleaseEvent QMouseEvent *   )  [protected]
 

00120 { 00121 down = FALSE; // la souris est relâchée 00122 move = FALSE; // l'utilisateur ne peut plus bouger de primitives 00123 update(); // appel à la fonction de dessin 00124 }

void Window2D::paintEvent QPaintEvent *   )  [protected]
 

dessin de la fenêtre

00065 { 00066 00067 // création et initialisation d'un painter 00068 QPainter paint( this ); 00069 QPen pen(black,5); 00070 paint.setPen(pen); 00071 paint.setWindow(0,0,width(),height()); 00072 paint.setViewport(0,0,width(),height()); 00073 paint.setBrushOrigin(width()/2,height()/2); 00074 00075 // changement de repère 00076 if (origin[0] != width()/2 || origin[1] != height()/2) 00077 { 00078 changeCoordinateSystemWindow(); 00079 origin[0] = width()/2; 00080 origin[1] = height()/2; 00081 changeCoordinateSystemReverseWindow(); 00082 } 00083 00084 // dessin des axes 00085 int x0 = paint.brushOrigin().x(); 00086 int y0 = paint.brushOrigin().y(); 00087 Point3D * p1 = new Point3D(x0 + width()/2, y0, 0); 00088 Point3D * p2 = new Point3D(x0, y0 + width()/2, 0); 00089 Point3D * p3 = new Point3D(x0 - width()/2, y0, 0); 00090 Point3D * p4 = new Point3D(x0, y0 - width()/2, 0); 00091 Segment * axisX = new Segment(p1,p3); 00092 Segment * axisY = new Segment(p2,p4); 00093 axisX->display(paint); 00094 axisY->display(paint); 00095 00096 delete axisX; 00097 delete axisY; 00098 00099 // dessin de tous les points définis par l'utilisateur 00100 for (unsigned int i = 0; i < pointsList.size(); i++) 00101 // on dessine un rectangle pour les points afin qu'ils soient bien visibles 00102 paint.drawRect(pointsList[i].x()-2,pointsList[i].y()-2,4,4); 00103 00104 // si l'utilisateur a créé des primitives, on les dessine 00105 if (nbPrimitives > 0) 00106 for (int i = 0; i < nbPrimitives; i++) 00107 primitivesList[i]->display(paint); 00108 00109 modification = TRUE; 00110 }

void Window2D::setModified bool  modified = false  )  [inline]
 

00187 {modification = modified;}

void Window2D::setSample int  s  )  [inline]
 

modificateur : valeur de l'échantillonage

Parameters:
s nouvelle valeur de l'échantillonage

00158 { 00159 sample = s; 00160 for (int i = 0; i < nbPrimitives; i++) 00161 primitivesList[i]->setNbSamples(sample); 00162 update(); 00163 }

void Window2D::setTypePrimitive const int  typePrim  )  [inline]
 

change le type courant de primitive

Parameters:
typePrim entier correspondant à un type de primitives

00171 {typePrimitive = typePrim;}


Member Data Documentation

bool Window2D::closedShape
 

pour savoir si la forme dessinée est fermée

QPoint Window2D::currentPoint [private]
 

dernier point cliqué par l'utilisateur

bool Window2D::down [private]
 

vrai si la souris est pressée

int Window2D::indexCurrentPoint [private]
 

indice du dernier point cliqué par l'utilisateur

vector<Point3D *> Window2D::lastPointsList [private]
 

liste des derniers points sélectionnés pour dessiner une primitive

bool Window2D::modification [private]
 

pour tester s'il faut rafraichir la fenetre OpenGL

bool Window2D::move [private]
 

vrai si l'utilisateur bouge un point

int Window2D::nbPoints [private]
 

nombre de points définis par l'utilisateur

int Window2D::nbPrimitives [private]
 

nombre de primitives

Point3D Window2D::origin [private]
 

coordonnées de l'origine du repère (centre de la fenêtre)

vector<QPoint> Window2D::pointsList [private]
 

liste des points dans la fenêtre

vector<Primitive *> Window2D::primitivesList [private]
 

liste des primitives de la fenêtre

int Window2D::sample [private]
 

nombre d'échantillons des primitives

int Window2D::selectedPoint [private]
 

indice du point sélectionné par l'utilisateur

bool Window2D::toBezier [private]
 

gère le changement bspline - bézier

int Window2D::typePrimitive [private]
 

type de la primitive dessinée


The documentation for this class was generated from the following files:
Generated on Tue Nov 29 21:59:00 2005 for CylinderGenerator by doxygen 1.3.7