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 |
|
|
| Lignes ondulées | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Lignes ondulées Jeu 5 Juil 2018 - 20:34 | |
| Une petite sub pour tracer des lignes ondulées, horizontales ou verticales, à partir d'un point donné et de longueur donnée. On donne en paramètre le point de départ, la longueur, le sens (horizontal ou vertical), et la hauteur de l'ondulation. - Code:
-
DIM x1%,y1%,ll%,hl%,hv%,e% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 2 x1% = 20: y1% = 30: ' angle supérieur gauche ll% = 500: hl% = 150: ' rectangle e% = 3 Trait_Ondule(x1%,y1%,ll%,0,e%) Trait_Ondule(x1%,y1%,hl%,1,e%) Trait_Ondule(x1%,y1%+hl%,ll%,0,e%) Trait_Ondule(x1%+ll%,y1%,hl%,1,e%) END ' ============================================================================== SUB Trait_Ondule(x1%,y1%,ll%,hv%,e%) ' Tracé d'une ligne ondulée depuis x1%,y1%, longueur ll%, ' e% = profondeur des ondulations (faible, 2 à 6 par exemple) ' hv% = 1: ligne verticale, sinon horizontale. DIM_LOCAL xc%,yc%,rx%,ry%,x2%,y2%,xf%,yf%,w%,h%,d%,f%,t%,i%,n%,pa%,p% IF hv% <> 1 THEN hv% = 0 IF hv% = 0 h% = e%: w% = h%*3: n% = ll%/(2*w%): ' nombre d'ondulations xf% = x1%+ll%: yf% = y1% ELSE w% = e%: h% = w%*3: n% = ll%/(2*h%) xf% = x1%: yf% = y1%+ll% END_IF rx% = w%/2: ry% = h%/2 DEGREES pa% = 10: p% = pa%: ' pas de progression, en degrés FOR i% = 1 TO n% IF hv% = 0 xc% = x1%+rx%: yc% = y1%: d% = 180: f% = 0: ' horizontale p% = -1*pa% ELSE xc% = x1%: yc% = y1%+ry%: d% = 90: f% = 270: ' verticale p% = pa% END_IF 2D_POLY_FROM x1%,y1% FOR t% = d% TO f% STEP p% x2% = xc%+rx%*COS(t%): y2% = yc%-ry%*SIN(t%) IF (hv%=0 AND x2%>xf%) OR (hv%=1 AND y2%>yf%) THEN EXIT_FOR 2D_POLY_TO x2%,y2% NEXT t% IF hv% = 0 x1% = x1%+w%: xc% = x1%+rx%: d% = 180: f% = 360 p% = pa% ELSE y1% = y1%+h%: yc% = y1%+ry%: d% = 450: f% = 270 p% = -1*pa% END_IF 2D_POLY_FROM x1%,y1% FOR t% = d% TO f% STEP p% x2% = xc%+rx%*COS(t%): y2% = yc%-ry%*SIN(t%) IF (hv%=0 AND x2%>xf%) OR (hv%=1 AND y2%>yf%) THEN EXIT_FOR 2D_POLY_TO x2%,y2% NEXT t% IF hv% = 0 x1% = x1%+w%: xc% = x1%+rx% ELSE y1% = y1%+h%: yc% = y1%+ry% END_IF NEXT i% 2D_POLY_TO xf%,yf% END_SUB ' ============================================================================== Les ondulations sont constituées de demi-ellipses, dans un sens puis dans l'autre. On peut varier l'épaisseur (2D_PEN_WIDTH) et la hauteur de l'ondulation. J'ai mis arbitrairement la longueur de l'ellipse à 3 fois sa hauteur (dans la sub: w% = h%*3 et h% = w%*3), mais on peut expérimenter d'autres rapports. Il faut toutefois limiter l'épaisseur, sinon la terminaison de ligne peut devenir inesthétique. A voir. On peut faire un cadre (ondulé, et non dentelé comme le précédent), par exemple: Le cadre est bien fermé, on peut colorer l'intérieur avec un 2D_FLOOD. Je n'ai fait que l'horizontale et la verticale, pour les lignes obliques ça devient trop compliqué (et sans intérêt a priori) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Lignes ondulées Jeu 5 Juil 2018 - 20:58 | |
| Sympa cette petite SUB. On peu faire un rebord de toit de maison (tuiles rondes ou tôle) Une petite variante pour le plaisir: - Code:
-
DIM x1%,y1%,ll%,hl%,hv%,e% PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1 2D_PEN_WIDTH 2 x1% = 20: y1% = 30: ' angle supérieur gauche ll% = 500: hl% = 150: ' rectangle e% = 3 Trait_Ondule(x1%,y1%,ll%,0,e%,255,0,0) Trait_Ondule(x1%,y1%,hl%,1,e%,0,255,0) Trait_Ondule(x1%,y1%+hl%,ll%,0,e%,0,255,255) Trait_Ondule(x1%+ll%,y1%,hl%,1,e%,0,0,255) END ' ============================================================================== SUB Trait_Ondule(x1%,y1%,ll%,hv%,e%,cr%,cg%,cb%) ' Tracé d'une ligne ondulée depuis x1%,y1%, longueur ll%, ' e% = profondeur des ondulations (faible, 2 à 6 par exemple) ' hv% = 1: ligne verticale, sinon horizontale. 2d_pen_color cr%,cg%,cb% DIM_LOCAL xc%,yc%,rx%,ry%,x2%,y2%,xf%,yf%,w%,h%,d%,f%,t%,i%,n%,pa%,p% IF hv% <> 1 THEN hv% = 0 IF hv% = 0 h% = e%: w% = h%*3: n% = ll%/(2*w%): ' nombre d'ondulations xf% = x1%+ll%: yf% = y1% ELSE w% = e%: h% = w%*3: n% = ll%/(2*h%) xf% = x1%: yf% = y1%+ll% END_IF rx% = w%/2: ry% = h%/2 DEGREES pa% = 10: p% = pa%: ' pas de progression, en degrés FOR i% = 1 TO n% IF hv% = 0 xc% = x1%+rx%: yc% = y1%: d% = 180: f% = 0: ' horizontale p% = -1*pa% ELSE xc% = x1%: yc% = y1%+ry%: d% = 90: f% = 270: ' verticale p% = pa% END_IF 2D_POLY_FROM x1%,y1% FOR t% = d% TO f% STEP p% x2% = xc%+rx%*COS(t%): y2% = yc%-ry%*SIN(t%) IF (hv%=0 AND x2%>xf%) OR (hv%=1 AND y2%>yf%) THEN EXIT_FOR 2D_POLY_TO x2%,y2% NEXT t% IF hv% = 0 x1% = x1%+w%: xc% = x1%+rx%: d% = 180: f% = 360 p% = pa% ELSE y1% = y1%+h%: yc% = y1%+ry%: d% = 450: f% = 270 p% = -1*pa% END_IF 2D_POLY_FROM x1%,y1% FOR t% = d% TO f% STEP p% x2% = xc%+rx%*COS(t%): y2% = yc%-ry%*SIN(t%) IF (hv%=0 AND x2%>xf%) OR (hv%=1 AND y2%>yf%) THEN EXIT_FOR 2D_POLY_TO x2%,y2% NEXT t% IF hv% = 0 x1% = x1%+w%: xc% = x1%+rx% ELSE y1% = y1%+h%: yc% = y1%+ry% END_IF NEXT i% 2D_POLY_TO xf%,yf% END_SUB ' ============================================================================== A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Lignes ondulées Jeu 5 Juil 2018 - 21:08 | |
| Salut Jean Claude,
Bien sûr on peut jouer sur la couleur, l'épaisseur du trait, etc, imbriquer des cadres de couleurs différentes les uns dans les autres, les colorier, etc. Et tu peux toujours mettre la photo de ta belle-mère à l'intérieur, ça lui fera plaisir... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Lignes ondulées Jeu 5 Juil 2018 - 23:43 | |
| - JL35 a écrit:
- Je n'ai fait que l'horizontale et la verticale, pour les lignes obliques ça devient trop compliqué (et sans intérêt a priori)
Pas si compliqué que ça ! Pour incliner une figure, il suffit d’appliquer la matrice de rotation à tous les points de la figure. A titre d’application, voici un code pour tracer une ellipse inclinée - Code:
-
rem ============================================================================ rem Inclinaison d’une figure rem ============================================================================ rem Pour incliner une figure, il suffit d’appliquer la matrice de rotation à rem tous les points de la figure. rem ============================================================================ rem rem __________________________________________________ rem | | rem | xp = cx + (x1*cos(IncliDeg) - y1*sin(Inclideg)) | rem | yp = cy - (x1*sin(IncliDeg) + y1*cos(IncliDeg)) | rem |__________________________________________________| rem rem xp,yp : coordonnées du point à tracer rem cx,cy : coordonnées du centre de la figure rem x1,y1 : coordonnées du point avant rotation rem IncliDeg : valeur de l’angle de rotation (en degré) , sens trigonométrique rem ============================================================================ rem Application : rem Tracer une ellipse inclinée rem Appel : Ellipse_Inclinee(cx,cy,rx,ry,IncliDeg)
2d_pen_color 255,0,0 : Ellipse_Inclinee(300,220,200,100,30) 2d_pen_color 0,0,255 : Ellipse_Inclinee(300,220,200,100,150)
end rem ============================================================================
' cx,cy : coordonnées du centre de rotation de l'ellipse ' Rx et Ry sont les longueurs des demi-diagonales ' IncliDeg : inclinaison en degrés de l'ellipse dans le sens trigonométrique
SUB Ellipse_Inclinee(cx,cy,rx,ry,IncliDeg) dim_local a,x1,y1,xp,yp degrees IncliDeg = 0-IncliDeg ' Calcul du point Origine x1 = rx*sin(IncliDeg) : y1 = ry*cos(IncliDeg) xp = cx + (x1*cos(IncliDeg) - y1*sin(IncliDeg)) yp = cy + (x1*sin(IncliDeg) + y1*cos(IncliDeg)) 2d_poly_from xp,yp
for a = 0 to 360 x1 = rx*sin(a + IncliDeg) : y1 = ry*cos(a + IncliDeg) ' Application de la matrice de rotation par rapport au centre cx,cy xp = cx + (x1*cos(IncliDeg) - y1*sin(IncliDeg)) yp = cy + (x1*sin(IncliDeg) + y1*cos(IncliDeg)) 2d_poly_to xp,yp next a END_SUB rem ============================================================================
Quant à l’intérêt, ça se discute. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Lignes ondulées Ven 6 Juil 2018 - 13:01 | |
| Eh papydall, pas si simple que ça non plus !
Bon, c'est une solution, en cas de besoin (à appliquer à la ligne inclinée, ce qui complique encore un peu...), mais a priori ça me semble bien compliqué pour le peu d'usage (ou le non usage) qu'on en a.
Enfin, les outils sont là, y'a plus qu'à, si besoin était. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Lignes ondulées Ven 6 Juil 2018 - 16:05 | |
| Le but principal de mon code est de montrer comment faire une rotation pour un objet quelconque dont on connait les coordonnées des points. Une simple application d’une matrice à tous les points de l’objet pour obtenir les nouvelles coordonnées. Soient x,y les coordonnées d’un point cx,cy les coordonnées du centre de rotation IncliDeg l’angle de rotation en degré Les nouvelles coordonnées du point en question deviennent : xp = cx + (x*cos(IncliDeg) - y*sin(Inclideg)) yp = cy - (x*sin(IncliDeg) + y*cos(IncliDeg)) J’avoue que ce n’est trop compliqué pour incliner l’inclinable. Les maths sont là pour nous faciliter les tâches, alors autant en profiter, abstraction faite de l'utilité ou de l'inutilité de la chose. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Lignes ondulées Ven 6 Juil 2018 - 17:39 | |
| Je suis évidemment d'accord avec toi papydall, je pense qu'ici on programme avant tout pour le plaisir ! | |
| | | Contenu sponsorisé
| Sujet: Re: Lignes ondulées | |
| |
| | | | Lignes ondulées | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |