Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Tracé de lignes | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Tracé de lignes Sam 12 Fév 2022 - 15:22 | |
| J'en avais déjà parlé il me semble, mais j'ai encore été confronté à ce que je considère comme une petite anomalie. Quand on trace une ligne avec 2D_LINE X1,Y1,X2,Y2, le dtracé commence bien en X1,Y1, mais dans certaines circonstances s'arrête un pixel trop tôt. En exemple: - Code:
-
DIM x1,x2,y1,y2,y3 PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 x1 = 50: x2 = x1+50 y1 = 150: y2 = 120: y3 = 50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y3,x2,y2: ' du haut vers le bas x1 = 70: x2 = x1+50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y2,x2,y3: ' du bas vers le haut END Zoom: Il manque le pixel de fin de ligne. C'est presque invisible sur l'écran, mais si je construis une figure fermée de cette façon et que je veux la colorier avec 2D_FLOOD, il y a une fuite et tout l'écran est rempli; Ça ne se produirait pas avec 2D_LINE suivi de plusieurs 2D_POLY_TO, mais ce n'est pas toujours possible de faire ainsi. A mon avis, dans tous les cas, dans un 2D_LINE du point A au point B, les deux points de départ et d'arrivée doivent être compris dans le tracé.
Dernière édition par JL35 le Sam 12 Fév 2022 - 15:31, édité 1 fois | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Tracé de lignes Sam 12 Fév 2022 - 15:29 | |
| Bonjour JL35 Oui tout à fait d'accord avec toi. C'est minime mais dans certains cas ça pose des problèmes comme par exemple une zone de remplissage. Et dans ce cas il y aura un débordement ! Un question à soumettre à Jack... C'est vrai qu'il ne s'est pas connecté depuis le début janvier. J'espère qu'il va bien. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Sam 12 Fév 2022 - 15:32 | |
| Bonjour Minibug, on s'est croisés, je finissais mon message... Bonne journée à toi ! (ici plein de soleil !) | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 0:34 | |
| Bug ou pas bug that's the question! Ce qu'il faut savoir c'est qu'un pixel n'est pas un point au sens strict, mais un carré. Même pour une très haute résolution graphique ce pixel aussi petit soit-il reste (jusqu'à nouvel ordre) un carré. La surface de l'écran est en quelque sorte une grille comme une feuille de papier quadrillée. Pour le tracé des segments verticaux et/ou horizontaux tout fonctionne à merveille puisqu'on colorie des pixels(carrés) qui ont une arête commune. Le problème se pose avec des segments obliques, d'où ce phénomène d'escalier ou effet crénelé. Heureusement il existe des algorithmes pour remédier à ce problème. Algorithme de tracé de segment de BresenhamVous pouvez aussi consulter Algorithmes de tracé de segment | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 2:40 | |
| J'ai codé l'algorithme du point milieu du tracé d'un segment et j'ai fait une comparaison avec 2d_line de Panoramic. Les résultats sont parfaitement identiques. C'est un bon point pour Panoramic. - Code:
-
rem ============================================================================
2d_pen_color 255,0,0 : Tracer_Segment_Algo_Point_Milieu(10,10,510,50) 2d_pen_color 0,0,255 : 2d_line 10,300-20,510,300-60 alpha 10 : top 10,10 : left 10,10 : font_color 10,255,0,0 caption 10, "En rouge : tracé du segment par l'algo du point milieu" alpha 20 : top 20,30 : left 20,10 : font_color 20,0,0,255 caption 20,"En bleu : tracé du segment par 2d_line de Panoramic" print_locate 10,60 : print "Les deux segments sont parallèles" print_locate 10,80 : print "Remarquez la parfaite correspondance du tracé" print_locate 10,100 : print "ça prouve que Panoramic utilise le bon algorithme pour tracer des segments" print_locate 10,150 : print "L'algo du point milieu considère l'axe des Y dirigé vers le haut" print_locate 10,170 : print "contrairement à Panoramic qui situe l'origine des axes en haut à gauche" print_locate 10,200 : print "Ceci explique le 300 - y dans le code" end rem ============================================================================ SUB Tracer_Segment_Algo_Point_Milieu(x0,y0,x1,y1) dim_local dx,dy,dp,deltaE,deltaNE,x,y
dx = x1 - x0 dy = y1 - y0 dp = 2*dy-dx deltaE = 2*dy deltaNE = 2*(dy-dx) x = x0 y = y0 2d_point x,300-y while x < x1 if dp <= 0 dp = dp + deltaE x = x + 1 else dp = dp + deltaNE x = x + 1 y = y + 1 end_if 2d_point x,300-y end_while END_SUB rem ============================================================================
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 12:31 | |
| D'accord papydall, mais que le pixel soit rond ou carré, ou que le trait soit horizontal, vertical ou oblique ne change rien à l'affaire, c'est un point de l'écran défini par son abscisse et son ordonnée. Je parle du point de départ et du point d'arrivée, je sais bien que pour les lignes obliques autres qu'à 45° il y a des accommodements en cours de parcours, forcément. Mais au moins le début et la fin de ligne sont bien définis et tous les deux représentés par un pixel bien identifié géométriquement. Et je ne dis pas que c'est un bug, mais un phénomène qui peut être gênant, notamment comme je disais pour 2D_FLOOD, la figure n'étant pas fermée. Plus simplement, je demande un trait du point A au point B, et dans certains cas le point B n'est pas atteint... NB: Plus simple, tracé de droites (pas de problèmes de lignes obliques): - Code:
-
DIM x1,x2,y1,y2 PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 x1 = 50: x2 = 100: y1 = 50: y2 = 100 ' lignes verticales 2D_LINE x1,y1,x1,y2: ' à gauche, tracé de haut en bas 2D_LINE x2,y2,x2,y1: ' à droite, tracé de bas en haut ' lignes horizontales (repères) 2D_LINE 10,y2+1,150,y2+1: 2D_LINE 10,y1-1,150,y1-1 END Zoom: le pixel d'arrivée n'est pas tracé.
Dernière édition par JL35 le Dim 13 Fév 2022 - 14:21, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 14:21 | |
| J'ai reproduit le code initial en Delphi, sachant que Panoramic est réalisé en Delphi. Voici le code résultant: - Code:
-
procedure TForm1.FormCreate(Sender: TObject); var x1,x2,y1,y2,y3: integer; begin { DIM x1,x2,y1,y2,y3 PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 x1 = 50: x2 = x1+50 y1 = 150: y2 = 120: y3 = 50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y3,x2,y2: ' du haut vers le bas x1 = 70: x2 = x1+50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y2,x2,y3: ' du bas vers le haut END } x1 := 50; x2 := x1+50; y1 := 150; y2 := 120; y3 := 50;
Image1.Canvas.MoveTo(x1,y1); Image1.Canvas.LineTo(x2,y2); Image1.Canvas.MoveTo(x2,y3); Image1.Canvas.LineTo(x2,y2);
x1 := 70; x2 := x1+50;
Image1.Canvas.MoveTo(x1,y1); Image1.Canvas.LineTo(x2,y2); Image1.Canvas.MoveTo(x2,y2); Image1.Canvas.LineTo(x2,y3); end; Or, le résultat est identique à ton constat initial: Et avec la loupe, on voit: Conclusion: Panoramic utilise bien les services Canvas de Delphi pour tracer une ligne, et ce problème est déjà inhérent à Delphi. Et comme la bibliothèque graphique de Delphi est une simpte enveloppe autour des API's de Windows, je parie fort que ce problème est présent à la base, dans les API's de Wiindows. Je suggère la solution suivante: Tracer explicitement le point d'arrivée.Ca donne ceci: - Code:
-
DIM x1,x2,y1,y2,y3 PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 x1 = 50: x2 = x1+50 y1 = 150: y2 = 120: y3 = 50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y3,x2,y2: ' du haut vers le bas
2d_point x2,y2 : ' solutioin: tracer explicitement le point d'arrvée !
x1 = 70: x2 = x1+50 2D_LINE x1,y1,x2,y2 2D_LINE x2,y2,x2,y3: ' du bas vers le haut END | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 14:25 | |
| Bonjour Klaus, et merci pour ton retour. Effectivement, la solution est de tracer individuellement le point d'arrivée, (ou de retracer la ligne dans l'autre sens), mais bon, ce n'est pas évident d'y penser... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 17:48 | |
| Je te conseille de créer une SUB du genre - Code:
-
sub 2D_Ligne(x1%,y1%,x2%,y2%) 2d_line x1%,y1%,x2%,y2% 2d_point x2%,y2%) end_sub et le tour est joué. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 18:56 | |
| Effectivement Klaus c'est une bonne idée. Mais c'est quand même moins simple à utiliser qu'un simple 2D_LINE... Ou alors il faut penser à ajouter un pixel au tracé... x+/-1 en horizontal, y+/-1 en vertical. C'est d'ailleurs ce que j'avais fait avant de remplir une surface. Mais il faut y penser ! En tout cas merci à toi et bonne soirée ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 21:09 | |
| Enfin... dans ma suggestion, au lieu d'utiliser 2d_line, tu utilises 2d_ligne. C'est pareil non ?
Ceci dit, on pourrait peut-être suggérer à Jack d'inclure cela dans son implémentation de la commande 2d_line ? Ce serait facile à faire, pas pénalisant en exécution et cerainement également facilement applicable pour le compilateur, la version Android etc.
Jack, si tu passes par ici... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 21:27 | |
| - Klaus a écrit:
- Panoramic utilise bien les services Canvas de Delphi pour tracer une ligne, et ce problème est déjà inhérent à Delphi
Ouf !!! Panoramic est hors de cause alors... - Klaus a écrit:
- Jack, si tu passes par ici...
Il s'est connecté ce midi donc il doit bien suivre le forum... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Dim 13 Fév 2022 - 23:25 | |
| Merci, Minibug ! Espérons... En attendant, voici la solution complète que 'ai suggérée, en éliminant les petites erreurs. Ceci est opérationnel: - Code:
-
dim x1%, x2%, y1%, y2%, y3%
x1% = 50: x2% = x1%+50 y1% = 150: y2% = 120: y3% = 50 D2_Ligne(x1%,y1%,x2%,y2%) D2_Ligne(x2%,y3%,x2%,y2%): ' du haut vers le bas
x1% = 70: x2% = x1%+50 D2_Ligne(x1%,y1%,x2%,y2%) D2_Ligne(x2%,y2%,x2%,y3%): ' du bas vers le haut END
sub D2_Ligne(x1%,y1%,x2%,y2%) 2d_line x1%,y1%,x2%,y2% 2d_point x2%,y2% end_sub | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 9:15 | |
| J'ai eu un doute que je viens de vérifier, c'est probablement la même cause: - Code:
-
DIM x1,y1,x2,y2 PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 x1 = 50: x2 = 100: y1 = 50: y2 = 100 2D_PEN_COLOR 255,0,0 2D_LINE 0,y1,200,y1: 2D_LINE 0,y2,200,y2 2D_LINE x1,0,x1,200: 2D_LINE x2,0,x2,200 2D_PEN_COLOR 0,0,0 2D_RECTANGLE x1,y1,x2,y2 END Image agrandie (x4): -> il manque un pixel en largeur et en hauteur. Le x2 et le y2 n'ont pas la même signification pour le 2D_LINE et pour le 2D_RECTANGLE... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 9:55 | |
| Rien d'anormal à cela, JL35. ela tient à la façon dont Delphi (encore lui !) dessine un rectangle sur un canvas. La doc Delphi stipule clairement: canvas.rectangle(x1,y1,x2,y2) trace un rectangle dont le coin en haut à gauche est (x1,y1) et le coin en bas à droite est (x2-1,y2-1).
Ceci permet de juxtaposer des rectangles sans que les bords se chevauchent. Il en est de même pour les lignes composant un polygone - en traçant chaque segment en prenant comme point de départ le point "d'arrivée" du segment précédent, il y a une continuité parfaite.
Tout cela est évidemment une conséquence directe des API's de Windows que Delphi utilise tels qu'ils sont fournis, avec juste une documentation plus claire et détaillée. Tout ce qu'on pourrait reprocher à Panoramic, c'est de ne pas avoir été suffisamment explicite dans la documentation de ces commandes. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 10:20 | |
| Tout à fait. Klaus a répondu à ma place. D'ailleurs, JL35 l'avait déjà signalé ici: https://panoramic.1fr1.net/t6684-rectangleet Marc lui avait répondu. Je vais modifier la documentation de 2D_LINE et 2D_RECTANGLE plutôt que de modifier le code. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 10:29 | |
| Merci, Jack ! Cela convient tout à fait. Pour ceux qui souhaitent que le point terminal soit respecté, il y a la solution par une SUB comme celle que j'ai indiquée ci-dessus pour 2D_LINE ==> D2_LIGNE(..) et, de façon analoque, 2D_RECTANGLE ==> D2_RECTANGLE(...). - Code:
-
sub D2_rectangle(x1%,y1%,x2%,y2%) 2d_rectangle(x1%,y1%,x2%+1,y2%+1) end_sub
Dernière édition par Klaus le Lun 14 Fév 2022 - 10:31, édité 2 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 10:29 | |
| Merci à vous deux, Klaus et Jack pour ces précisions. Mais il faut le savoir, et ce n'est pas évident quand on pense géométrie. Je me suis fait piéger en construisant des figures fermées avec des tracés de lignes successifs, ça laisse parfois des trous aux angles et ça fait fuir le 2D_Flood. On s'est croisés Klaus, bonne journée à tous. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 12:31 | |
| Merci Klaus et Jack pour vos explications. Même si le résultat reste 'bizarre' au moins l'explication est claire ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 16:55 | |
| Ce que je retiens: | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 21:05 | |
| Certes... as-tu essayé d'utiliser la SUB - Code:
-
sub D2_Ligne(x1%,y1%,x2%,y2%) 2d_line x1%,y1%,x2%,y2% 2d_point x2%,y2% end_sub Cette SUB devrait résoudre le problème... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé de lignes Lun 14 Fév 2022 - 22:04 | |
| Bonsoir Klaus, bien sûr que ça marche ! On peut aussi tracer la ligne deux fois, une fois dans chaque sens: 2D_LINE x1,y1,x2,y2: 2D_LINE x2,y2,x1,y1
Vérification faite, le 2D_POLY_TO X2,Y2 s'arrête lui aussi 1 pixel avant la fin (en X2-1 horizontal ou Y2-1 en vertical).
Je suis un peu surpris que pour le 2D_RECTANGLE, quel que soit le coin d'origine du tracé parmi les 4, c'est toujours à droite et en bas qu'il manque un pixel.
Maintenant que je connais ces contraintes je pourrai y parer (il faudra juste que j'y pense !) Simplement ça choquait un peu l'esprit géométrique que j'ai appris à l'école, le tracé d'un point à un autre contenant les points de départ et d'arrivée.
Bon, on va peut-être en rester là et faire avec, il suffit de le savoir. | |
| | | Contenu sponsorisé
| Sujet: Re: Tracé de lignes | |
| |
| | | | Tracé de lignes | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |