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?
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.
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
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+.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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;
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;
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