Canvas.ellipse(Trect), résultat bizarre ?

Résolu
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 23 avril 2006 à 18:09
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 23 avril 2006 à 23:24
Vala mon problème du jour :

j'ai un Trect, une form et son canvas, et l'envie de dessiner un cercle. Donc pouf, mon trect, j'en fais un carré, et dans le onPaint de ma form, zou :

With myform do
begin
Canvas.Pen.Width:=1;
Canvas.Ellipse(MyRect)
end;

Et hop. D'apres la doc de delphi, blahblah la fonction ellipse dessine l'ellipse inscrite dans le rectangle, etc etc.... Ouais, ca c'est avec un Pen.width de 1. Des que j'essaye autre chose, blam dans le mur la fonction ellipse, un coup sur deux elle commence 1 pixel trop tot en top/left et déborde aussi en bottom/right.
A croire que la fonction est pas foutue de prendre en compte l'épaisseur du trait.

Ca se corrige un truc comme ca ? (Oui je suis maniac, en plus je m'amuse a faire une capture d'écran pour verifier que mon ellipse est bien symétrique, au pixel pres).

Y a pas moyen de tracer un cercle à partir des coords du pixel du centre, et un rayon ?

4 réponses

DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
23 avril 2006 à 23:24
Bon ben apres tests, c'est toute la fonction de dessin d'ellipse qui me semble foireuse. Je m'explique, une ellispe, meme dans un espace discret (des pixels cote a cote) c'est symetrique, or dans le cas ou l'on donne un Trect qui est carré, ca plante, elle est pas symetrique.

Alors c'est peut-etre pas important, d'ailleurs Paintshoppro7 a cette tendance aussi, mais pour moi, un cercle c'est un cercle, et un cercle en pixel il doit se superposer a lui-meme (pixel a pixel) à chaque quart de tour.
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
23 avril 2006 à 18:51
Salut,
Mauricio avait reconnu ce problème il y a quelque temps et avait fourni sa solution au problème.
Regardes donc ici : Utilisation de Canvas.Rectangle()

Il avait fait cela pour dessiner un rectangle avec un Pen.Width > 1 mais je pense que tu peux assez facilement modifier sa procédrue pour l'adapter au dessin de cercles.

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
23 avril 2006 à 20:29
Merci ;)

Adapté :

procedure DrawInnerEllipse(aCanvas: TCanvas; aRect: TRect);
begin
if aCanvas.Pen.Width > 1 then
aRect := RECT(aRect.Left + aCanvas.Pen.Width div 2,
aRect.Top + aCanvas.Pen.Width div 2,
aRect.Right +1 -(aCanvas.Pen.Width-1) div 2,
aRect.Bottom +1 -(aCanvas.Pen.Width-1) div 2);

aCanvas.Ellipse(aRect);
end;
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
23 avril 2006 à 20:38
C'est bien d'avoir posté la réponse pour ceux qui passeront peut être après toi.
Mais alors valide-là, histoire que l'on sache que ton problème est résolu.

++
0
Rejoignez-nous