REMPLISSAGE DE POLYGONE

cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013 - 22 nov. 2006 à 00:10
cs_bitben Messages postés 2 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 18 juillet 2008 - 29 août 2011 à 15:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40419-remplissage-de-polygone

cs_bitben Messages postés 2 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 18 juillet 2008
29 août 2011 à 15:47
et bien 5 ans aprés, ce code est toujours utile. moi aussi, j'avais besoin de dessiner le contenu d'un fichier de cartocraphie non pas à l'écran mais dans un tableau, pour des tests et traitements. merci.
Francky23012301 Messages postés 400 Date d'inscription samedi 6 août 2005 Statut Membre Dernière intervention 11 février 2016 1
30 nov. 2006 à 18:51
Salut,

Ca faisait bien longtemps que l'on ne t'avait pas vu : ca fait plaisir.

Ton petit bout de code est très instructif ;).

Ca a été codé dans les règles de l'art : Bon travail

9/10

@+
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
27 nov. 2006 à 19:43
Merci bien pour cette possibilité.
En effet, ça peut être une solution.

J'ai toujours le même problème qu'il faut que je dessin dans un tableau et non sur un canvas.
J'ai pensé à passer par les canvas. Mais ça demande à chaque fois à lire le bitmap avec scanline pour retransferer les points dans mon tableau. C'est plus simple mais question rapidité, c'est pas super.
Je cherchait donc l'algo qu'utilise windows pour remplir un polygone.
Bien sur, il fait ça mieux que ma version puisque ça doit être optimisé à mort.

bon, on va pas parler tout la soirée, un exemple est mieux qu'un long texte.
Voilà mon projet de programme :
http://barbichetteworld.free.fr/zip/brailledrawingv2.rar
Sur une imprimante Braille, on peu faire des points tout les 0.5mm mais un point fait 2mm.
Et quand ils se chevauchent, cela fragilise et même déchire le papier.

Je cherche à faire un logiciel de dessin en Braille, avec un affichage qui ressemble le plus au dessin en relief final.

Il me semble par ailleurs que canvas.polygon utilise la rêgle du pair impair et non l'enroulement.

Barbichette
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 nov. 2006 à 18:38
Bonsoir

je ne sais pas si j'ai bien saisi ton problème, et donc si ce qui suit est bien approprié dans ton cas, si ce n'est pas le cas alors cela pourra certainement servir à d'autres que toi ;P

Pour remplir une zone, avec un modulo de 4, moi j'utiliserais une brosse spécifique de taille 4x4 dont un seul pixel serait actif, ce qui laisserais tout le travail de remplissage, d'un polygone quelconque, à windows.

Suggestion :

procedure TForm1.Button1Click(Sender: TObject);
var
bmp, oldbmp : TBitmap ;
Polygone : array[0..9] of tPOINT ;
i : integer ;
begin
// On efface le fond
image1.Canvas.FillRect(image1.ClientRect);

// on crée un polygone aléatoire
for i:=0 to 9 do
begin
Polygone[i].x := Random(300) + 100 ;
Polygone[i].y := Random(300) + 100 ;
end ;

// On crée un bitmap 4x4 monochrome avec un seul pixel noir
bmp := TBitmap .Create ;
try
with bmp do
begin
width := 4;
height := 4;
pixelformat := pf1bit;
with canvas do
begin
brush.color := clWhite ;
fillrect(cliprect);
Pixels[0,0]:=clBlack;
end;
end ;

with Image1 do
begin
with Canvas do
begin
// Sauvegarde de l'ancienne brosse
oldbmp := Brush.Bitmap ;

// Pas d'affichage du contour du polygone !! Prévoir certainement une sauvegarde !!
Pen.Style := psClear ;

// Remplissage de la zone avec notre brosse
Brush.Bitmap := bmp ;
Polygon( Polygone );

// Restauration de la brosse sauvegardée
Brush.Bitmap := oldbmp ;
end ;
end ;
finally
bmp.free;
end ;
end ;

Cordialement.
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
22 nov. 2006 à 10:18
la réponse en est simple, (pour moi)
je suis entrain de réaliser un programme pour faire des dessins sur une imprimante braille (donc des dessins en relief) et j'ai donc besoin de dessiner non pas sur un canvas ou un bitmap mais dans un tableau et seulement sur les cases avec x mod 4=0 et y mod 4=0.
Il m'ai donc impossible d'utiliser les floodfill ou polygon et pour les régions, ça veux dire créer une région polygonale et tester tous les points pour savoir si ils sont dedans.
Pas vraiment super rapide comme solution.

sinon, je prend bonne note des remarques. quelques cycles de gagnés sont toujours bon a prendre...

Sinon, je vais mettre à jour d'ici peu ce code pour ajouter une deuxième option. Le remplissage suivant la règle de l'enroulement et non celle-ci, la la règle du pair-impair.


Barbichette
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 nov. 2006 à 09:56
pas mal, tu peu aussi faire quelque petite optimisations en remplacant :

"*2" par "shl 1"
"div 2" par "shr 1"

(gain de quelques cycles d'horloge)

tu peu aussi assigner directement un TPoint a un autre sans faire :

P1.X := P2.X;
P1.Y := P2.Y;

tu fait directement :

P1 := P2;

ce sont des petites optimisations qui sont presque invisible car la routine est deja rapide.
mais ça permettras de soulager les plus petits processeurs (<1ghz).
sinon c'est pas mal interressant, mais pourquoi ne pas avoir utiliser les regions et les possibilitée du Brush a pouvoir remplir avec un bitmap ?
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
22 nov. 2006 à 00:10
a, j'ai oublié de dire,
dans mon exemple, on clic pour ajouter un point et on double clic pour ajouter le dernier point et fermer le polygone.

C'est pas forcement le plus simple, mais le but n'était pas de faire un logiciel de dessin...
Rejoignez-nous