Canvas.ellipse(Trect), résultat bizarre ? [Résolu]

Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
- - Dernière réponse : DeltaFX
Messages postés
459
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 ?
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
3
Merci
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.

Dire « Merci » 3

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

Codes Sources 128 internautes nous ont dit merci ce mois-ci

Commenter la réponse de DeltaFX
Messages postés
1078
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
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
Commenter la réponse de florenth
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
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;
Commenter la réponse de DeltaFX
Messages postés
1078
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
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.

++
Commenter la réponse de florenth