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

Signaler
Messages postés
8
Date d'inscription
mercredi 21 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010
-
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021
-
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

Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
8
Date d'inscription
mercredi 21 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

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
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

Re,

Oups, encore une erreur de copier-coller :

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

A+.
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 novembre 2010

Slt,

et comment faire svp pour dessiner la courbe pleine?.


Cordialement,
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

Salut,

Pour dessiner la courbe pleine :

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

A+.
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 novembre 2010

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.
@+
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021

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+.
Messages postés
4
Date d'inscription
lundi 19 novembre 2007
Statut
Membre
Dernière intervention
23 novembre 2010

OK. merci pour le lien
Messages postés
251
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
11 mai 2021

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
Messages postés
268
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
2 février 2021