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

Circle Class Reference

#include <circle.h>

Inheritance diagram for Circle:

Primitive List of all members.

Public Member Functions

 Circle ()
 Circle (Point3D *c, const double &r)
 Circle (Point3D *center, Point3D *p_radius)
 Circle (const Circle &c)
 ~Circle ()
virtual void display (QPainter &paint)
virtual void setPrimitive (QPoint &refPoint, QPoint &modifPoint)
virtual void toXML (QDomElement &elem)
Point3DgetCenter ()
Point3DgetRadiusPoint ()
double getRadius () const
double & getRadius ()
void setCenter (Point3D *c)
void setRadiusPoint (Point3D *pr)
void calculateRadius ()
void sortSamplesPointsList ()
int nbPoints ()
double getNbSamples ()
void setNbSamples (double sample)

Public Attributes

vector< Point3D * > pointsList
vector< Point3D * > samplesPointsList
double nbSamples
int type

Protected Attributes

double radius

Detailed Description

La classe Circle permet de spécifier et de dessiner des cercles.

Author:
Guitteny Fabrice

Idiart Baptiste

Le Goff Erwan


Constructor & Destructor Documentation

Circle::Circle  ) 
 

constructeur par défaut

00026 { 00027 type = CIRCLE; 00028 nbSamples = NORMAL_SAMPLE / 3; 00029 }

Circle::Circle Point3D c,
const double &  r
 

constructeur : centre et rayon

Parameters:
c centre du cercle
r rayon du cercle

00031 : radius(r) 00032 { 00033 pointsList.push_back(center); 00034 Point3D * radiusPts = new Point3D( center->getCoordinate(0) + radius, 00035 center->getCoordinate(1), 00036 center->getCoordinate(2) ); 00037 pointsList.push_back(radiusPts); 00038 type = CIRCLE; 00039 nbSamples = NORMAL_SAMPLE / 3; 00040 }

Circle::Circle Point3D center,
Point3D p_radius
 

constructeur : centre et point du cercle

Parameters:
center centre du cercle
p_radius point sur le cercle

00043 { 00044 pointsList.push_back(center); 00045 pointsList.push_back(radiusPts); 00046 calculateRadius(); 00047 type = CIRCLE; 00048 nbSamples = NORMAL_SAMPLE / 3; 00049 }

Circle::Circle const Circle c  ) 
 

constructeur par copie

Parameters:
c cercle

00051 : Primitive(c) 00052 { 00053 Point3D * center = c.pointsList[0]; 00054 Circle(center,c.radius); 00055 }

Circle::~Circle  )  [inline]
 

00068 {};


Member Function Documentation

void Circle::calculateRadius  ) 
 

calcul du rayon à partir du centre et d'un point sur le cercle

00100 { 00101 Point3D * center = pointsList[0]; 00102 Point3D * radiusPts = pointsList[1]; 00103 radius = sqrt((double)((center->getCoordinate(0) - radiusPts->getCoordinate(0)) * (center->getCoordinate(0) - radiusPts->getCoordinate(0)) 00104 + (center->getCoordinate(1) - radiusPts->getCoordinate(1)) * (center->getCoordinate(1) - radiusPts->getCoordinate(1)) 00105 + (center->getCoordinate(2) - radiusPts->getCoordinate(2)) * (center->getCoordinate(2) - radiusPts->getCoordinate(2)) ) ); 00106 }

void Circle::display QPainter &  paint  )  [virtual]
 

méthode d'affichage d'un cercle (Bresenham)

Parameters:
paint affichage dans un QPainter

Implements Primitive.

00112 { 00113 int x,y,d ; 00114 x = 0; 00115 y = (int)radius ; 00116 d = 1 - (int)radius ; 00117 00118 int xcenter = (int)pointsList[0]->getCoordinate(0); 00119 int ycenter = (int)pointsList[0]->getCoordinate(1); 00120 00121 int temp = 0; 00122 00123 samplesPointsList.clear(); 00124 00125 paint.drawPoint(x + xcenter, y + ycenter); 00126 paint.drawPoint(x + xcenter, -y + ycenter); 00127 paint.drawPoint(y + xcenter, x + ycenter); 00128 paint.drawPoint(-y + xcenter, x + ycenter); 00129 00130 while ( y > x ) 00131 { 00132 if ( d < 0 ) 00133 d += 2 * x + 3 ; 00134 else 00135 { 00136 d += 2 * (x - y) + 5 ; 00137 y-- ; 00138 } 00139 x++ ; 00140 00141 if (temp >= nbSamples) 00142 { 00143 samplesPointsList.push_back(new Point3D(x, y, 0)); 00144 samplesPointsList.push_back(new Point3D(-x, y, 0)); 00145 samplesPointsList.push_back(new Point3D(x, -y, 0)); 00146 samplesPointsList.push_back(new Point3D(-x, -y, 0)); 00147 samplesPointsList.push_back(new Point3D(y, x, 0)); 00148 samplesPointsList.push_back(new Point3D(-y, x, 0)); 00149 samplesPointsList.push_back(new Point3D(y, -x, 0)); 00150 samplesPointsList.push_back(new Point3D(-y, -x, 0)); 00151 00152 temp = 0; 00153 } 00154 temp++; 00155 00156 paint.drawPoint(x + xcenter, y + ycenter); 00157 paint.drawPoint(-x + xcenter, y + ycenter); 00158 paint.drawPoint(x + xcenter, -y + ycenter); 00159 paint.drawPoint(-x + xcenter, -y + ycenter); 00160 paint.drawPoint(y + xcenter, x + ycenter); 00161 paint.drawPoint(-y + xcenter, x + ycenter); 00162 paint.drawPoint(y + xcenter, -x + ycenter); 00163 paint.drawPoint(-y + xcenter, -x + ycenter); 00164 00165 } 00166 00167 // les points d'échantillons n'étant pas générés à la suite 00168 // (symétrie dans l'algorithme de Bresenham), il faut trier 00169 // la liste afin qu'ils soient dans l'ordre (pour la future 00170 // génération des facettes lors des extrusions). 00171 00172 sortSamplesPointsList(); 00173 00174 // le tri s'effectuant pour un cercle centré à l'origine, 00175 // il faut donc changer de repère ie ajouter les coordonnées 00176 // du centre à chaque point d'échantillon 00177 00178 for (unsigned int i = 0; i < samplesPointsList.size(); i++) 00179 { 00180 (*samplesPointsList[i])[0] += xcenter; 00181 (*samplesPointsList[i])[1] += ycenter; 00182 } 00183 00184 // on ajoute le premier poit à la fin afin que la forme soit fermée 00185 samplesPointsList.push_back(samplesPointsList[0]); 00186 }

Point3D * Circle::getCenter  ) 
 

accesseur : centre

Returns:
centre du cercle

00062 { 00063 return pointsList[0]; 00064 }

double Primitive::getNbSamples  )  [inline, inherited]
 

accesseur : valeur de l'échantillonage

Returns:
nombre d'échantillons

00081 {return nbSamples;}

double & Circle::getRadius  ) 
 

modificateur : rayon du cercle

Returns:
rayon du cercle

00080 { 00081 return radius; 00082 }

double Circle::getRadius  )  const
 

accesseur : rayon du cercle

Returns:
rayon du cercle

00074 { 00075 return radius; 00076 }

Point3D * Circle::getRadiusPoint  ) 
 

accesseur : point sur le cercle

Returns:
point sur le cercle

00068 { 00069 return pointsList[1]; 00070 }

int Primitive::nbPoints  )  [inline, inherited]
 

nombre de points définissant la primitive

00073 {return pointsList.size();}

void Circle::setCenter Point3D c  ) 
 

modificateur : centre du cercle

Parameters:
c nouveau centre du cercle

00087 { 00088 pointsList[0] = c; 00089 }

void Primitive::setNbSamples double  sample  )  [inline, inherited]
 

modificateur : valeur de l'échantillonage

Parameters:
sample nouvelle valeur de l'échantillonage

00087 { 00088 if (type == CIRCLE) 00089 nbSamples = sample / 3; 00090 else 00091 nbSamples = sample; 00092 }

void Circle::setPrimitive QPoint &  refPoint,
QPoint &  modifPoint
[virtual]
 

changement des points définissant un cercle

Parameters:
refPoint point à modifier
modifPoint nouvelle valeur du point

Implements Primitive.

00193 { 00194 Point3D * p = qPointToPoint3D(refPoint); 00195 if (*p == *getCenter()) 00196 setCenter(qPointToPoint3D(modifPoint)); 00197 if (*p == *getRadiusPoint()) 00198 setRadiusPoint(qPointToPoint3D(modifPoint)); 00199 calculateRadius(); 00200 }

void Circle::setRadiusPoint Point3D pr  ) 
 

modificateur : point sur le cercle

Parameters:
pr nouveau point sur le cercle

00093 { 00094 pointsList[1] = pr; 00095 }

void Circle::sortSamplesPointsList  ) 
 

tri de la liste d'échantillons

00218 { 00219 sort(samplesPointsList.begin(), samplesPointsList.end(), order()); 00220 }

void Circle::toXML QDomElement &  elem  )  [virtual]
 

ecrit la primitive dans un fichier xml

Parameters:
elem balise courante dans le fichier XML

Implements Primitive.

00206 { 00207 elem.setAttribute( "Ax", ( *getCenter())[0] ); 00208 elem.setAttribute( "Ay", ( *getCenter())[1] ); 00209 elem.setAttribute( "Bx", ( *getRadiusPoint())[0] ); 00210 elem.setAttribute( "By", ( *getRadiusPoint())[1] ); 00211 }


Member Data Documentation

double Primitive::nbSamples [inherited]
 

nombre d'échantillons

vector<Point3D*> Primitive::pointsList [inherited]
 

liste des points définissant la primitive

double Circle::radius [protected]
 

rayon du cercle

vector<Point3D*> Primitive::samplesPointsList [inherited]
 

liste des points pour l'échantillonage

int Primitive::type [inherited]
 

type de la primitive SEGMENT, CERCLE, BEZIER ou BSPLINE


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