Surface de révolution

Voir le sujet précédent Voir le sujet suivant Aller en bas

Surface de révolution

Message  P.Fradin le Sam 19 Jan - 21:48

Dans cet exemple, nous allons écrire la macro rotCurve permettant de faire tourner une courbe paramètrée de l'espace autour d'un axe, créant ainsi une surface de révolution.
Commençons par une petite macro pour définir plus facilement la fenêtre courante dans l'espace c'est à dire les intervalles [Xinf, Xsup], [Yinf, Ysup] et [Zinf, Zsup]. Appelons cette marco Fenetre3D, voici sa commande:

Code:

[Xinf:=%1, Xsup:=%2,
 Yinf:=%3, Ysup:=%4,
 Zinf:=%5, Zsup:=%6
]

Les six variables Xinf, ..., Zsup sont prédéfinies. Rappelons que dans la version actuelle de TeXgraph, la fenêtre 3D ne clippe pas les objet graphiques 3D.

Regardons maintenant la macro:

rotCurve( x(u), y(u), z(u), [ point3D, point3D], uMin, uMax, angleMin, angleMax, uNbLignes, vNbLignes)

c'est une macro à 10 paramètres:

- les 3 premiers constituent la courbe paramétrée.
- le 4 ième: [point3D, point3D] représente l'axe de rotation, plus précisement c'est une liste constituée de 2 points de l'espace: un point de l'axe et un vecteur directeur de l'axe (par exemple: [Origin, vecK] )
- les deux paramètres suivants représentent l'intervalle de la variable u.

les 4 derniers seront facultatifs:
- angleMin, angleMax: indiquent l'amplitude de la rotation autour de l'axe, par défaut ce sera de -pi à pi (cet intervalle correspondra au paramètre v de la surface).
- uNbLignes, vNbLignes: indique le nombre de subdivisions de l'intervalle pour u et pour v (25 par défaut).

Si on note M le point de coordonnés (x(u),y(u),z(u)), A le point donné sur l'axe, V un vecteur directeur de l'axe normalisé, alors pour chaque valeur de v dans l'intervalle [angleMin, angleMax] il nous faut déterminer M', l'image de M par la rotation autour de l'axe d'angle v (axe orienté par V), c'est à dire, en notant U=vec{AM} et x le produit vectoriel:

M'= A+ (U|V).V + cos(v). (VxU)xV + sin(v).(VxU)

L'ennui c'est que la commande Surface ne prend pas en paramètre un point3D mais les trois fonctions x(u,v), y(u,v) et z(u,v). Il faut donc faire ce calcul des 3 coordonnées de M', c'est ce qui est fait dans la macro rotCurve dont voici la commande:

Code:

{rotCurve( x(u), y(u), z(u) ,Axe, uMin, uMax [, angleMin, angleMax [, uNbLignes, vNbLignes]]) où Axe=[point3D, point3D]}
[$A:=Copy(%4,1,2), $V:=Copy(%4,3,2), V:=normalize(V),
$xa:=Xde(A), $ya:=Yde(A), $za:=Zde(A),
$xv:=Xde(V), $yv:=Yde(V), $zv:=Zde(V),
$a2:=sqr(xv), $b2:=sqr(yv), $c2:=sqr(zv),
$ab:=xv*yv, $ac:=xv*zv, $bc:=yv*zv,

Surface(
xa+(%1-xa)*(a2+cos(v)*(b2+c2) )+(%2-ya)*( ab*(1-cos(v)) -sin(v)*zv ) +
(%3-za)*( ac*(1-cos(v))+yv*sin(v) ), {abscisse}

ya+(%1-xa)*(ab*(1-cos(v)) +zv*sin(v) )+(%2-ya)*( b2+cos(v)*(a2+c2) )+
(%3-za)*(bc*(1-cos(v))+xv*sin(v) ) , {ordonnée}

za+(%1-xa)*( ac*(1-cos(v))-yv*sin(v) )+ (%2-ya)*( bc*(1-cos(v))+xv*sin(v) )+
(%3-za)*( c2+cos(v)*(a2+b2) ), {cote}

%5+i*%6, {intervalle pour u}

if nil(%7) then -pi else %7 fi + i*(if nil(%8) then pi else %8 fi), {pour v}

if nil(%9) then 25 else %9 fi +i*(if nil(%10) then 25 else %10 fi ), {nb lignes}
1)
]

Une fois fait et saisi ce calcul fastidieux, il n' y a plus qu'à essayer! Voici deux exemples:



La première figure a été obtenue en faisant tourner le cercle de centre (0,2,0) et de rayon 1 dans le plan yOz, autour de l'axe Oz, l'angle allant de 0 à 3pi/2. Voici la commande (élément graphique Utilisateur):

Code:

[Fenetre3D(-4,4,-4,4,-3,3),
Axes3D(0,0,0,1,1,1), Color:=blue, Width:=1,
rotCurve( 0, 2+cos(u), sin(u), [Origin, vecK], -pi, pi, 0, 3*pi/2, 30, 30)
]

Le paramètrage du cercle est (0,2+cos(u), sin(u)) pour u allant de -pi à pi. L'axe de la rotation est [Origin, vecK] (Origin et vecK sont prédéfinis, Origin=[0,0] et vecK=[0,1]).

Dans la deuxième figure, nous avons pris la courbe d'équation y=exp(x) dans la plan xOy pour x allant de -1 à 1, et nous l'avons faite tourner autour de l'axe Ox. Le paramètrage est donc (u, exp(u), 0), et l'axe [Origin, vecI]. Voici la commande (élément graphique Utilisateur):

Code:

[Fenetre3D(-2,1.5,-3,3.5,-3,3.5),
Arrows:=1,
Axes3D(-2,-3,-3,1,1,1), Arrows:=0,
$P:=Parallelep(dot(-1,-e, -e), 2*vecI, 2*e*vecJ, 2*e*vecK),
DrawPoly(P,0),
SaveAttr(),
LineStyle:=noline, FillStyle:=full, Width:=1,
LabelStyle:=special,
rotCurve( u, exp(u), 0, [Origin, vecI], -1, 1),
RestoreAttr(),
DrawPoly(P,1)
]

Après le dessin des axes, nous avons déterminé le parallèlèpipède circonscrit à cette surface et stocké celui-ci la variable locale P, on dessine alors ce polyèdre en mode 0, c'est à dire avec arêtes cachées.

On sauvegarde les attributs en cours, puis on dessine la surface de révolution, ce qui entraîne une altération du dessin du parallèlèpipède, on restaure donc les attributs pour redessiner celui-ci mais en mode 1, c'est à dire sans les arêtes cachées.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum