Dessin d'ellipse inclinée

Résolu
Nyio Messages postés 8 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 13 juillet 2010 - 13 juil. 2010 à 09:38
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 - 15 févr. 2013 à 09:18
Bonjour à tous,

Je dois tracer sur un bmp le périmètre d'une ellipse dont je connais les coordonnées en X et Y du centre, les deux longueurs des diagonales et son angle d'inclinaison. La rotation se fait par rapport au cente de l'ellipse

j'ai déjà testé la méthode Arc en utilisant la matrice de rotation pour déterminer la position des points après rotation mais il semblerai que cette méthode ne permet de tracer que des ellipses horizontales. Même soucis avec la méthode ellipse qui en plus remplie l'intérieur de l'ellipse (après j'ai pas cherché à supprimer le remplissage vu que l'ellipse n'était pas bonne).

Si vous avez une solution ou un début de piste n'hésitez pas, je suis preneur.

Je pensais tracer la courbe conique de mon ellipse à partir de l'équation, est-ce possible sous delphi?

Merci d'avance.

Nyio
A voir également:

14 réponses

cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
13 juil. 2010 à 14:03
Salut,

Pour commencer avec le cas d'une ellipse horizontale centrée en x=0 et y=0 on sait que dans ce cas on a :
x = a.cosinus(t)
y = b.sinus(t)
avec a = (largeur/2) >= b = (Hauteur/2)

Donc pour une Ellipse centrée en xo,yo et inclinée de Incli Radians les coordonnées d'un point du contour sont de la forme :

x = xo + a.sinu(t + Incli)
y = yo + b.sinus(t + Incli)

Y'a plus qu'à tracer cela par exemple en 360 points par exemple reliés par LineTo(x,y) ou bien mémorisés dans un array of tPoint nommé MonEllipse et comme un array de tPoint c'est rien d'autre qu'un polygone ça peut se tracer en une seule ligne avec MonCanvas.Polygon(MonEllipse).

MonCanvas désigne ici soit le canvas d'une Form soit le canvas de n'importe quoi comme celui d'un Bmp par exemple.

Pour plus de détails sur les ellipses ou d'autre courbes, voir ici : http://www.mathcurve.com/courbes2d/ellipse/ellipse.shtml

A+.
3
Nyio Messages postés 8 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 13 juillet 2010
13 juil. 2010 à 15:14
J'ai réussi à obtenir ce que je voulais, je vous donne mon code comme exemple :

// Rx et Ry sont les longueurs de mes demi-diagonales
// phi mon angle de rotation
for i:= 0 to 360 do begin
//-- Calcul du vecteur 
    Rxx := Rx * sin(i*PI/180+phi);
    Ryy := Ry * cos(i*PI/180+phi);
//-- On applique la matrice de rotation par rapport au centre de coordonnées Cx,Cy au vecteur
    xx :=  Cx + (Rxx*cos(Phi) -  Ryy*sin(phi));
    yy :=  Cy + (Rxx*sin(Phi) +  Ryy*cos(phi));
//-- On mémorise les coordonnées du point
    MonEllipse[i].x := xx;
    MonEllipse[i].y := yy;
end;
Polygon(MonEllipse); // On trace notre ellipse
3
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
13 juil. 2010 à 14:33
Re-salut,

Oups : y'a une faute de frappe dans mon message précédent :

Prière d'y remplacer x = xo + a.sinu(t + Incli)
par x = xo + a.cosinus(t + Incli)

A+.
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
13 juil. 2010 à 16:22
Re-bonjour,

Je viens de me rendre compte que je m'étais un peu planté dans mes formules j'ai oublié allègrement la matrice de rotation mais l'essentiel c'est que ça marche chez toi.

A+.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
13 juil. 2010 à 17:08
Re-bonjour,

Tiens pour le fun, sur le même modèle, code pour le dessin d'un coeur incliné :

procedure TraceCoeur(bmp : tBitMap; Ro,cx,cy,IncliDeg : integer; clBord : tColor);
// Ro = rayon du coeur
// cx,cy = coordonnées du centre de rotation de l'ellipse
// IncliDeg = inclinaison en degrés du coeur par rapport à la verticale
// clBord = couleur du contour
var i : integer; iRad,Theta: Single; MaCourbe : Array [0..359] of tpoint;
Rxx,Ryy,xx,yy : single;
begin with bmp.canvas do begin
pen.width:=1; pen.color:=clBord; brush.style:=bsClear;
iRad:=DegToRad(IncliDeg);
for i:= 0 to 359 do begin
//-- Calcul du vecteur du Coeur avec Formule de Raphaël Laporte
Theta := i*PI/180+iRad;
Rxx := Ro*sin(Theta)*sin(Theta)*sin(Theta);
Ryy := Ro*(cos(Theta) - cos(Theta)*cos(Theta)*cos(Theta)*cos(Theta));
//-- Application de la matrice de rotation par rapport au centre cx,cy
xx := cx + (Rxx*cos(iRad) - Ryy*sin(iRad));
yy := cy - (Rxx*sin(iRad) + Ryy*cos(iRad));
//-- Mémorisation des coordonnées du point
MaCourbe[i].x := round(xx);
MaCourbe[i].y := round(yy);
end;
Polygon(MaCourbe); // On trace notre ellipse
end;
end;

A+.
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
13 juil. 2010 à 17:11
Re,

Oups, encore une erreur de copier-coller :

Remplacer Polygon(MaCourbe); // On trace notre ellipse
par Polygon(MaCourbe); // On trace la courbe.

A+.
0
moukfif Messages postés 4 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 novembre 2010
22 nov. 2010 à 15:55
Slt,

et comment faire svp pour dessiner la courbe pleine?.


Cordialement,
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
22 nov. 2010 à 17:12
Salut,

Pour dessiner la courbe pleine :

placer : SetPolyFillMode(Handle,WINDING);
juste avant : Polygon(MaCourbe);

A+.
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
23 nov. 2010 à 11:23
Re-salut,

En plus du SetPolyFillMode il faudra également initialiser la Brush :

1) pour un remplissage couleur : brush.style:=bsSolid; brush.color:=clRed par exemple.
2) ou pour un remplissage avec un bitMap de texture : BrushBitmap:=MonBitMap;

A+.
0
moukfif Messages postés 4 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 novembre 2010
23 nov. 2010 à 11:54
Merci pour la réponse. J'ai modifier ma form comme suit:

1) Rgn := CreatePolygonRgn(MaCourbe,359,WINDING);
2) SetWindowRgn(form1.Handle, Rgn, true);

Et j'ai une form1 sous forme d'un coeur.
@+
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
23 nov. 2010 à 12:56
Re-salut,

Ok, vu.

Et si tu veux d'autres formes que le coeur tu peux trouver plein d'équations polaires telles que celle du trèfle à quatre feuilles ici :

http://www.mathcurve.com/courbes2d/ornementales/ornementales.shtml

A+.
0
moukfif Messages postés 4 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 novembre 2010
23 nov. 2010 à 13:43
OK. merci pour le lien
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
9 févr. 2013 à 17:08
Salut,
J'ai utilisé le code de NYIO, mais j'ai un soucis!
En fait la pente de l'ellipse est légèrement trop accentuée.
C'est facile à voir si par exemple le petit rayon est =0 et la pente de 1 ((45°)
Je ne voit pas où est le bug?!?
Qui a une idée???
THANKS !!!
PhilLu
0
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
15 févr. 2013 à 09:18
0
Rejoignez-nous