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

Nyio 8 Messages postés mercredi 21 avril 2010Date d'inscription 13 juillet 2010 Dernière intervention - 13 juil. 2010 à 09:38 - Dernière réponse : cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention
- 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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 13 juil. 2010 à 14:03
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de cs_pseudo3
Meilleure réponse
Nyio 8 Messages postés mercredi 21 avril 2010Date d'inscription 13 juillet 2010 Dernière intervention - 13 juil. 2010 à 15:14
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de Nyio
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 13 juil. 2010 à 14:33
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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 13 juil. 2010 à 16:22
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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 13 juil. 2010 à 17:08
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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 13 juil. 2010 à 17:11
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
moukfif 4 Messages postés lundi 19 novembre 2007Date d'inscription 23 novembre 2010 Dernière intervention - 22 nov. 2010 à 15:55
0
Merci
Slt,

et comment faire svp pour dessiner la courbe pleine?.


Cordialement,
Commenter la réponse de moukfif
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 22 nov. 2010 à 17:12
0
Merci
Salut,

Pour dessiner la courbe pleine :

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

A+.
Commenter la réponse de cs_pseudo3
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 23 nov. 2010 à 11:23
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
moukfif 4 Messages postés lundi 19 novembre 2007Date d'inscription 23 novembre 2010 Dernière intervention - 23 nov. 2010 à 11:54
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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 23 nov. 2010 à 12:56
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
moukfif 4 Messages postés lundi 19 novembre 2007Date d'inscription 23 novembre 2010 Dernière intervention - 23 nov. 2010 à 13:43
0
Merci
OK. merci pour le lien
Commenter la réponse de moukfif
PhilLu 249 Messages postés lundi 9 novembre 2009Date d'inscription 6 mai 2018 Dernière intervention - 9 févr. 2013 à 17:08
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
cs_pseudo3 270 Messages postés mardi 24 juillet 2007Date d'inscription 7 juin 2018 Dernière intervention - 15 févr. 2013 à 09:18
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.