Un petit exemple de raccordement de courbes lisses de Bézier...
Le dessin ci-contre représente une pièce de révolution dont l'enveloppe extérieure est construite par trois courbes de Bézier (les vecteurs aux extrémités sont représentés en vert).
L'intérieur a une forme semi-sphérique et le dessous est un disque plat.
Source
GLamCircle* segm0 ;
GLamRevolution* segm1 ;
GLamRevolution* segm2 ;
GLamRevolution* segm3 ;
GLamSphere* segm4 ;
GLamRevolution* segm5 ;
GLamGroup* graal ;
int nbSect = 180 ;
segm0 = new GLamCircle( 30.0 * 2, nbSect ) ;
double pts1[][2] = { {30,0},{12,6},
{4,0},{16,0}} ;
segm1 = new GLamRevolution(
(double*)pts1, (double*)(pts1+2), nbSect ) ;
double pts2[][2] = { {12,6},{14,64},
{-12,0},{-14,-5}} ;
segm2 = new GLamRevolution(
(double*)pts2, (double*)(pts2+2), nbSect ) ;
double pts3[][2] = { {14,64},{42,104},
{14,5},{0,-21}} ;
segm3 = new GLamRevolution(
(double*)pts3, (double*)(pts3+2), nbSect ) ;
segm4 = new GLamSphere( 40.0 * 2, nbSect, -90, 0 ) ;
segm4->changeSide() ;
double pts5[][2] = { {42,0}, {41.5,1}, {40.5,1}, {40,0} } ;
segm5 = new GLamRevolution( (double*)pts5, 4, nbSect ) ;
graal = new GLamGroup ;
int dessous = graal->addObject( segm0 ) ;
graal->addObject( segm1 ) ;
graal->addObject( segm2 ) ;
graal->addObject( segm3 ) ;
int dedans = graal->addObject( segm4 ) ;
int bord = graal->addObject( segm5 ) ;
graal->addObjectRotate(dessous, 180, 0, 0 ) ;
graal->addObjectTranslate(dedans, 0, 0, 104 ) ;
graal->addObjectTranslate(bord, 0, 0, 104 ) ;
float gold[10] = { 0.24725, 0.1995, 0.0745,
0.75164, 0.60648, 0.22648,
0.628281, 0.555802, 0.366065,
51.2 } ;
graal->setMaterial( gold ) ;
glPushMatrix() ;
glScaled(0.1, 0.1, 0.1 ) ;
graal->draw() ;
glPopMatrix() ;
|
|