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 |
|
|
| Dessin 2D: largeur de trait (résolu !) | |
| | |
Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Ven 22 Juin 2018 - 16:57 | |
| - JL trente cinq a écrit:
- Y a-t'il moyen de connaître la largeur de trait courante (fixée par 2D_PEN_WIDTH n) ?
… As-tu d’autres questions ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Ven 22 Juin 2018 - 17:23 | |
| Tu es en train de me suggérer discrètement que le problème est résolu, c'est bien ça papydall ? Bon, d'accord, je le classe... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Sam 23 Juin 2018 - 0:06 | |
| Les intelligents se comprennent au clin d’œil ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Sam 23 Juin 2018 - 9:45 | |
| Évidemment ! la classe ! Je n'ai pas d'autres questions, mais j'espérais vaguement avoir d'autres réponses, une astuce originale par exemple. Mais bon, les solutions proposées me conviennent, et on va en rester là. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Sam 23 Juin 2018 - 15:36 | |
| Résolu, mais pas terminé ! Bon papydall et consorts, pour la petite histoire, pourquoi j'avais besoin de l'épaisseur du trait: - Je trace un arc d'ellipse fermé (ici entre 120 et 180 degrés): - Je veux colorer l'intérieur de la figure: j'ai besoin des coordonnées d'un point à l'intérieur. Je sais me positionner au milieu de l'arc, côté intérieur, mais je dois être sûr de ne pas me trouver sur le trait du tracé, donc je dois chercher le point juste au_dessous du trait. Dans l'exemple ci-dessous (qui a servi à tracer la figure), je me mets arbitrairement 10 pixels au-dessous, mais c'est plutôt empirique... - Code:
-
DIM xc%,yc%,w%,h%,d%,f%,rgb%,ff% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 10: 2D_PEN_COLOR 255,0,0 xc% = WIDTH(1)/2: yc% = HEIGHT(1)/2 w% = WIDTH(1)-25: h% = HEIGHT(1)-50 d% = 0: f% = 45: ' degrés ff% = 0 Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) END
SUB Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) ' Tracé d'un arc d'une ellipse vide centrée en xc%,yc% de la cible 2d ' w%, h%: enveloppe de l'ellipse complète. ' Début d% degrés, fin f% degrés (de 0 à 360 degrés dans le sens trigonométrique) ' Ellipse complète si f% = d% ' Si rgb% <> -1, couleur de remplissage = rgb% (r*256*256+g*256+b) ' Si ff% = 1: figure fermée (fin de tracé reliée au début par un trait: arc d'ellipse) ' Tracé de la couleur courante et de l'épaisseur (1 à 20) courante DIM_LOCAL rx%,ry%,xdp%,ydp%,xf%,yf%,p%,t%,r%,g%,b% rx% = w%/2: ry% = h%/2: ' rayons de l'ellipse IF f% = d% THEN d% = 0: f% = 360: ff% = 1: ' ellipse complète DEGREES p% = 5: ' pas = 5 degrés xdp% = xc%+rx%*COS(d%): ydp% = yc%-ry%*SIN(d%): ' point de départ du tracé 2D_POLY_FROM xdp%,ydp% IF d% > f% FOR t% = d% TO 360 STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% d% = 0 END_IF FOR t% = d% TO f% STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% 2D_POLY_TO xc%+rx%*COS(f%),yc%-ry%*SIN(f%) IF ff% = 1 THEN 2D_POLY_TO xdp%,ydp%: ' fermeture de l'arc IF rgb%<>-1 AND ff% = 1: ' coloriage figure fermée (secteur ou ellipse entière) t% = (f%+d%)/2: xf% = xc%+(rx%-10)*COS(t%): yf% = yc%-(ry%-10)*SIN(t%) r% = INT(rgb%/65536): g% = BIN_AND(rgb%,65280)/256: b% = BIN_AND(rgb%,255) 2D_FLOOD xf%,yf%,r%,g%,b% END_IF END_SUB Disons que le problème est réglé, mais ça ne vaut pas une simple instruction qui dirait w = 2D_PEN_WIDTH(N) ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 1:03 | |
| Bonjour à tous ! Salut JL35 ! - JL35 a écrit:
- Résolu, mais pas terminé !
Je me permets de rouvrir ce sujet. Si tu veux connaitre le centre de la forme créée pour la colorier, tu appliques ces formules : en reprenant tes noms de variables : - Code:
-
xf% = (rx%*COS((d%+f%)/2) +(rx%*COS(d%)+rx%*COS(f%))/2)/2 + xc% yf% = (ry%*SIN((d%+f%)/2) +(ry%*SIN(d%)+ry%*SIN(f%))/2)/-2 + yc% 2D_FLOOD xf%,yf%,r%,g%,b%
Voici ton code modifié (lignes 38 et 39) : - Code:
-
DIM xc%,yc%,w%,h%,d%,f%,rgb%,ff% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 10: 2D_PEN_COLOR 255,0,0 xc% = WIDTH(1)/2: yc% = HEIGHT(1)/2 w% = WIDTH(1)-25: h% = HEIGHT(1)-50 d% = 0: f% = 45: ' degrés ff% = 1 Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) END
SUB Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) ' Tracé d'un arc d'une ellipse vide centrée en xc%,yc% de la cible 2d ' w%, h%: enveloppe de l'ellipse complète. ' Début d% degrés, fin f% degrés (de 0 à 360 degrés dans le sens trigonométrique) ' Ellipse complète si f% = d% ' Si rgb% <> -1, couleur de remplissage = rgb% (r*256*256+g*256+b) ' Si ff% = 1: figure fermée (fin de tracé reliée au début par un trait: arc d'ellipse) ' Tracé de la couleur courante et de l'épaisseur (1 à 20) courante DIM_LOCAL rx%,ry%,xdp%,ydp%,xf%,yf%,p%,t%,r%,g%,b% rx% = w%/2: ry% = h%/2: ' rayons de l'ellipse IF f% = d% THEN d% = 0: f% = 360: ff% = 1: ' ellipse complète DEGREES p% = 5: ' pas = 5 degrés xdp% = xc%+rx%*COS(d%): ydp% = yc%-ry%*SIN(d%): ' point de départ du tracé 2D_POLY_FROM xdp%,ydp% IF d% > f% FOR t% = d% TO 360 STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% d% = 0 END_IF FOR t% = d% TO f% STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% 2D_POLY_TO xc%+rx%*COS(f%),yc%-ry%*SIN(f%) IF ff% = 1 THEN 2D_POLY_TO xdp%,ydp%: ' fermeture de l'arc IF rgb%<>-1 AND ff% = 1: ' coloriage figure fermée (secteur ou ellipse entière) xf% = (rx%*COS((d%+f%)/2) +(rx%*COS(d%)+rx%*COS(f%))/2)/2 + xc% yf% = (ry%*SIN((d%+f%)/2) +(ry%*SIN(d%)+ry%*SIN(f%))/2)/-2 + yc% r% = INT(rgb%/65536): g% = BIN_AND(rgb%,65280)/256: b% = BIN_AND(rgb%,255) 2D_FLOOD xf%,yf%,r%,g%,b% END_IF END_SUB ce qui donne : Plus besoin de connaitre l'épaisseur du trait | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 1:37 | |
| Marc, c'est toi le plus fort ! Je testerai plus en détail demain (là il se fait un peu tard), mais a priori ta solution est géniale ! Merci à toi. En regardant d'un peu plus près, il semble bien que ça convienne à tous les cas, j'adopte !
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 11:04 | |
| Quoique... ça ne marche pas à tous les coups.
Avec le code ci-dessus, essaie d% = 240 et f% = 10 degrés... ça colore le trait, mais pas l'intérieur. | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 11:52 | |
| Désolé ! Effectivement si d% > f% ça ne marche pas. Ajoute une condition en ligne 23 : - Code:
-
IF d%>f% THEN d%=d%-360
Nouveau code : - Code:
-
DIM xc%,yc%,w%,h%,d%,f%,rgb%,ff% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 10: 2D_PEN_COLOR 255,0,0 xc% = WIDTH(1)/2: yc% = HEIGHT(1)/2 w% = WIDTH(1)-25: h% = HEIGHT(1)-50 d% = 10: f% = 240: ' degrés ff% = 1 Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) END
SUB Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) ' Tracé d'un arc d'une ellipse vide centrée en xc%,yc% de la cible 2d ' w%, h%: enveloppe de l'ellipse complète. ' Début d% degrés, fin f% degrés (de 0 à 360 degrés dans le sens trigonométrique) ' Ellipse complète si f% = d% ' Si rgb% <> -1, couleur de remplissage = rgb% (r*256*256+g*256+b) ' Si ff% = 1: figure fermée (fin de tracé reliée au début par un trait: arc d'ellipse) ' Tracé de la couleur courante et de l'épaisseur (1 à 20) courante DIM_LOCAL rx%,ry%,xdp%,ydp%,xf%,yf%,p%,t%,r%,g%,b% rx% = w%/2: ry% = h%/2: ' rayons de l'ellipse IF f% = d% THEN d% = 0: f% = 360: ff% = 1: ' ellipse complète DEGREES IF d%>f% THEN d%=d%-360 p% = 5: ' pas = 5 degrés xdp% = xc%+rx%*COS(d%): ydp% = yc%-ry%*SIN(d%): ' point de départ du tracé 2D_POLY_FROM xdp%,ydp% IF d% > f% FOR t% = d% TO 360 STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% d% = 0 END_IF FOR t% = d% TO f% STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% 2D_POLY_TO xc%+rx%*COS(f%),yc%-ry%*SIN(f%) IF ff% = 1 THEN 2D_POLY_TO xdp%,ydp%: ' fermeture de l'arc IF rgb%<>-1 AND ff% = 1: ' coloriage figure fermée (secteur ou ellipse entière) xf% = (rx%*COS((d%+f%)/2) +(rx%*COS(d%)+rx%*COS(f%))/2)/2 + xc% yf% = (ry%*SIN((d%+f%)/2) +(ry%*SIN(d%)+ry%*SIN(f%))/2)/-2 + yc% r% = INT(rgb%/65536): g% = BIN_AND(rgb%,65280)/256: b% = BIN_AND(rgb%,255) 2D_FLOOD xf%,yf%,r%,g%,b% END_IF END_SUB Est-ce bon ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 12:21 | |
| Effectivement, avec le test c'est mieux, et il semble bien que ça marche dans tous les cas de figures, puisque les calculs admettent des valeurs d'angles négatives. Allez, n'ayons pas peur des mots, disons que c'est parfait. Merci Marc, j'enregistre. ps, du coup ma séquence au-dessous de ton nouveau test: - Code:
-
IF d% > f% FOR t% = d% TO 360 STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% d% = 0 END_IF ne sert plus à rien, je la supprime. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 12:39 | |
| - JL35 a écrit:
- Allez, n'ayons pas peur des mots, disons que c'est parfait.
Hé ! Jeune homme, ne crie pas VICTOIRE assez tôt ! Et si le petit malin ( qui sommeille dans la tête de Papydall ) essaie le code avec une valeur de 570 pour f% , on obtient - Spoiler:
Pour contrer ce petit méchant, il faut ajourer la ligne suivante - Code:
-
f% = wrap_value(f%)
Avant la condition - Code:
-
IF f% = d% THEN d% = 0: f% = 360: ff% = 1: ' ellipse complète
- Spoiler:
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 12:50 | |
| Salut Papydall !
Idem pour d% !
Si on dépasse les 360°, on fait le tour du cadran ! De quoi avoir la tête qui tourne ! Il suffit d'essayer avec d%=600 par exemple.
Donc, même punition pour d%. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 13:06 | |
| Avant de crier victoire, voici le code modifié. Il devrait se comporter gentiment à tous les coups, mais sait-on jamais ? - Code:
-
DIM xc%,yc%,w%,h%,d%,f%,rgb%,ff% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 10: 2D_PEN_COLOR 255,0,0 xc% = WIDTH(1)/2: yc% = HEIGHT(1)/2 w% = WIDTH(1)-25: h% = HEIGHT(1)-50 d% = 1010: f% = 570: ' degrés ff% = 1 Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) END
SUB Ellipse_arc(xc%,yc%,w%,h%,d%,f%,rgb%,ff%) ' Tracé d'un arc d'une ellipse vide centrée en xc%,yc% de la cible 2d ' w%, h%: enveloppe de l'ellipse complète. ' Début d% degrés, fin f% degrés (de 0 à 360 degrés dans le sens trigonométrique) ' Ellipse complète si f% = d% ' Si rgb% <> -1, couleur de remplissage = rgb% (r*256*256+g*256+b) ' Si ff% = 1: figure fermée (fin de tracé reliée au début par un trait: arc d'ellipse) ' Tracé de la couleur courante et de l'épaisseur (1 à 20) courante DIM_LOCAL rx%,ry%,xdp%,ydp%,xf%,yf%,p%,t%,r%,g%,b% rx% = w%/2: ry% = h%/2: ' rayons de l'ellipse f% = wrap_value(f%) : d% = wrap_value(d%) IF f% = d% THEN d% = 0: f% = 360: ff% = 1: ' ellipse complète DEGREES IF d%>f% THEN d%=d%-360 p% = 5: ' pas = 5 degrés xdp% = xc%+rx%*COS(d%): ydp% = yc%-ry%*SIN(d%): ' point de départ du tracé 2D_POLY_FROM xdp%,ydp%
FOR t% = d% TO f% STEP p% 2D_POLY_TO xc%+rx%*COS(t%),yc%-ry%*SIN(t%) NEXT t% 2D_POLY_TO xc%+rx%*COS(f%),yc%-ry%*SIN(f%) IF ff% = 1 THEN 2D_POLY_TO xdp%,ydp%: ' fermeture de l'arc IF rgb%<>-1 AND ff% = 1: ' coloriage figure fermée (secteur ou ellipse entière) xf% = (rx%*COS((d%+f%)/2) +(rx%*COS(d%)+rx%*COS(f%))/2)/2 + xc% yf% = (ry%*SIN((d%+f%)/2) +(ry%*SIN(d%)+ry%*SIN(f%))/2)/-2 + yc% r% = INT(rgb%/65536): g% = BIN_AND(rgb%,65280)/256: b% = BIN_AND(rgb%,255) 2D_FLOOD xf%,yf%,r%,g%,b% END_IF END_SUB
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 13:51 | |
| Évidemment papydall, à force de chercher la petite bête tu as fini par la trouver !
Après quelques essais de principe, je considère que ton code résout tous les problèmes, et je l'adopte. Quand même, que de pièges, mis à part le fait que certains testeurs vicieux (je ne nomme personne) infligent au programme des angles supérieurs à 360 ! quelle idée saugrenue !
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) Dim 24 Juin 2018 - 15:16 | |
| Les testeurs vicieux sont les meilleurs testeurs. Bravo aux testeurs vicieux et bravo pour ce bout de code qui résiste à leurs tests | |
| | | Contenu sponsorisé
| Sujet: Re: Dessin 2D: largeur de trait (résolu !) | |
| |
| | | | Dessin 2D: largeur de trait (résolu !) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |