Dessin d'ellipse inclinée [Résolu]

Messages postés
8
Date d'inscription
mercredi 21 avril 2010
Dernière intervention
13 juillet 2010
- - Dernière réponse : cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
- 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
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
3
Merci
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+.

Merci cs_pseudo3 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_pseudo3
Messages postés
8
Date d'inscription
mercredi 21 avril 2010
Dernière intervention
13 juillet 2010
3
Merci
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

Merci Nyio 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Nyio
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
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+.
Commenter la réponse de cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
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+.
Commenter la réponse de cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
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+.
Commenter la réponse de cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
Re,

Oups, encore une erreur de copier-coller :

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

A+.
Commenter la réponse de cs_pseudo3
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Dernière intervention
23 novembre 2010
0
Merci
Slt,

et comment faire svp pour dessiner la courbe pleine?.


Cordialement,
Commenter la réponse de moukfif
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
Salut,

Pour dessiner la courbe pleine :

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

A+.
Commenter la réponse de cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
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+.
Commenter la réponse de cs_pseudo3
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Dernière intervention
23 novembre 2010
0
Merci
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.
@+
Commenter la réponse de moukfif
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
0
Merci
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+.
Commenter la réponse de cs_pseudo3
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Dernière intervention
23 novembre 2010
0
Merci
OK. merci pour le lien
Commenter la réponse de moukfif
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Dernière intervention
6 mai 2018
0
Merci
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
Commenter la réponse de PhilLu
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Dernière intervention
7 juin 2018
Commenter la réponse de cs_pseudo3

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.