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 |
|
|
| Rectangles à coins arrondis. Encore !? | |
| | 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: Rectangles à coins arrondis. Encore !? Lun 24 Oct 2022 - 5:56 | |
| - Code:
-
rem ============================================================================ rem Tracé des rectangles à coins arrondis rem ============================================================================ picture 10 : full_space 10 : 2d_target_is 10 ' Exemples d'appel Rounded_Rectangle(20,20,500,400,100,150,20) Rounded_Rectangle(50,40,400,300,10,150,200) Rounded_Rectangle(80,50,100,40,200,150,0) Rounded_Rectangle(300,50,50,250,10,10,200) Rounded_Rectangle(80,200,150,120,255,10,20) Rounded_Rectangle(60,350,400,40,0,0,0) end rem ============================================================================ ' Paramètres : ' cx,cy : coordonnées du coin haut gauche du rectangle ' w , h : respectivement largeur et hauteur du rectangle ' r,g,b : composantes RGB de la couleur du rectangle SUB Rounded_Rectangle(cx,cy,w,h,r,g,b) dim_local cz cz = min(w,h)/6 : ' Valeur empirique pour arrondir les coins en fonction : ' de w,et h à ajuster selon le goût degrees : 2d_pen_width 2 : 2d_pen_color r,g,b ' tracé des côtés du rectangle dépourvu de ses coins 2d_line cx+cz/2,cy,cx+w-cz/2,cy 2d_line cx+cz/2,cy+h,cx+w-cz/2,cy+h 2d_line cx,cy+cz/2,cx,cy+h-cz/2 2d_line cx+w,cy+cz/2,cx+w,cy+h-cz/2 ' Tracé des arcs pour les coins 2d_arc cx+cz/2,cy+cz/2,cz/2,180,90 2d_arc cx+w-cz/2,cy+cz/2,cz/2,90,0 2d_arc cx+cz/2,cy+h-cz/2,cz/2,270,180 2d_arc cx+w-cz/2,cy+h-cz/2,cz/2,0,270 END_SUB rem ============================================================================
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Rectangles à coins arrondis. Encore !? Lun 24 Oct 2022 - 19:25 | |
| Oh oui, encore papydall ! Tiens, par exemple: - Code:
-
DIM x,y,w,h,r,ty PICTURE 1: FULL_SPACE 1: 2D_TARGET_IS 1: 2D_PEN_WIDTH 5: 2D_PEN_COLOR 255,0,0 x = 20: y = 20: w = 240: h = 180 r = 30 ty = 1: x = 20: y = 20: Rectar(x,y,w,h,r,ty) ty = 2: x = 300: Rectar(x,y,w,h,r,ty) ty = 3: x = 20: y = 230: Rectar(x,y,w,h,r,ty) ty = 4: x = 300: Rectar(x,y,w,h,r,ty) END
SUB Rectar(x,y,w,h,r,ty) ' Cadre en x,y, dimensions w,h, à coins arrondis de rayon r ' ty =0 rectangle normal, =1 arrondi vers l'extérieur, =2 vers l'intérieur ' =3 cercles complets, =4 angles droits ' Paramètres courants: épaisseur trait, couleur DIM_LOCAL x1,x2,y1,y2 x1 = x+r: x2 = x+w-r: y1 = y+r: y2 = y+h-r DEGREES SELECT ty CASE 0: ' rectangle ordinaire (r ignoré) 2D_RECTANGLE x,y,x+w,y+h CASE 1: ' angles arrondis vers l'extérieur 2D_LINE x,y1,x,y2: 2D_ARC x1,y2,r,270,180 2D_LINE x1,y+h,x2,y+h: 2D_ARC x2,y2,r,0,270 2D_LINE x+w,y2,x+w,y+r: 2D_ARC x2,y+r,r,90,0 2D_LINE x2,y,x+r,y: 2D_ARC x+r,y+r,r,180,90 CASE 2: ' angles arrondis vers l'intérieur 2D_LINE x,y+r,x,y2: 2D_ARC x,y+h,r,90,0 2D_LINE x1,y+h,x2,y+h: 2D_ARC x+w,y+h,r,180,90 2D_LINE x+w,y2,x+w,y1: 2D_ARC x+w,y,r,270,180 2D_LINE x2,y,x1,y: 2D_ARC x,y,r,0,270 CASE 3: ' angles = cercles complets 2D_LINE x,y1,x,y2: 2D_CIRCLE x1,y2,r 2D_LINE x1,y+h,x2,y+h: 2D_CIRCLE x2,y2,r 2D_LINE x+w,y2,x+w,y1: 2D_CIRCLE x2,y1,r 2D_LINE x2,y,x1,y: 2D_CIRCLE x1,y1,r CASE 4: ' angles décrochage angle droit 2D_LINE x,y1,x,y2: 2D_POLY_TO x1,y2: 2D_POLY_TO x1,y+h 2D_POLY_TO x2,y+h: 2D_POLY_TO x2,y2: 2D_POLY_TO x+w,y2 2D_POLY_TO x+w,y1: 2D_POLY_TO x2,y1: 2D_POLY_TO x2,y 2D_POLY_TO x1,y: 2D_POLY_TO x1,y1: 2D_POLY_TO x,y1 END_SELECT END_SUB | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Rectangles à coins arrondis. Encore !? Lun 24 Oct 2022 - 21:53 | |
| - Papydall a écrit:
- Rectangles à coins arrondis. Encore !?
Oui, pourquoi pas ! Je vous propose une version "de précision". Elle fonctionne avec un pinceau d’une largeur d’un pixel (instruction 2D_PEN_WIDTH 1), il n’y aura pas de trou dans le tracé. Les quatre angles arrondis sont rigoureusement identiques. Pas de distorsion. La syntaxe : rectangle_arrondi(X1,Y1,X2,Y2,R). Dessine un rectangle entre deux coordonnées X1,Y1 et X2,Y2. Les coordonnées de départ et d'arrivée sont incluses dans le tracé. R est le rayon en pixels des angles arrondis. Les coordonnées des points de départ et d’arrivée peuvent être données dans n’importe quel sens. Par exemple, pour le point de départ, on peut renseigner le coin en bas à droite et pour le point d’arrivée, celui en haut à gauche. Comme d’habitude, la couleur du tracé se fait par un 2D_PEN_COLOR, et le remplissage par un 2D_FLOOD. - Code:
-
' Tracé de rectangles à coins arrondis ' Marc - Octobre 2022 ' Ecrit en langage Panoramic 0.9.29.i9 ' ------------------------------------------------------------------------------
' La syntaxe : rectangle_arrondi(X1,Y1,X2,Y2,R). ' Dessine un rectangle entre deux coordonnées X1,Y1 et X2,Y2. ' Les coordonnées de départ et d'arrivées sont incluses dans le tracé. ' R est le rayon en pixels des angles arrondis.
rectangle_arrondi(5,7,45,80,9) end ' ------------------------------------------------------------------------------ sub rectangle_arrondi(xr1%,yr1%,xr2%,yr2%,rayon%) dim_local x%, y%, m%, cx%, cy%, x1%, y1%, x2%, y2%
' traitement des coordonnées si elles sont inversées if xr1% < xr2% x1% = xr1% : x2% = xr2% else x1% = xr2% : x2% = xr1% end_if if yr1% < yr2% y1% = yr1% : y2% = yr2% else y1% = yr2% : y2% = yr1% end_if ' tracer le trait du haut 2d_line x1%+rayon%, y1%, x2%-rayon%, y1% ' tracer le trait du bas 2d_line x1%+rayon%, y2%, x2%-rayon%, y2% ' tracer le trait de gauche 2d_line x1%, y1%+rayon%, x1%, y2%-rayon% ' traver le trait de droite 2d_line x2%, y1%+rayon%, x2%, y2%-rayon% ' dessiner l'angle supérieur gauche cx% = x1%+rayon% : cy% = y1%+rayon% x% = 0 : y% = rayon% : m% = 5 - 4*rayon% while x% <= y% 2d_point x%*(-1)+cx%,y%*(-1)+cy% : 2d_point y%*(-1)+cx%,x%*(-1)+cy% if m% > 0 then y% = y% - 1 : m% = m% - 8*y% x% = x% + 1 : m% = m% + 8*x% + 4 end_while
' dessiner l'angle supérieur droit cx% = x2%-rayon% : cy% = y1%+rayon% x% = 0 : y% = rayon% : m% = 5 - 4*rayon% while x% <= y% 2d_point x%+cx%,y%*(-1)+cy% : 2d_point y%+cx%,x%*(-1)+cy% if m% > 0 then y% = y% - 1 : m% = m% - 8*y% x% = x% + 1 : m% = m% + 8*x% + 4 end_while
' dessiner l'angle inférieur droit cx% = x2%-rayon% : cy% = y2%-rayon% x% = 0 : y% = rayon% : m% = 5 - 4*rayon% while x% <= y% 2d_point x%+cx%,y%+cy% : 2d_point y%+cx%,x%+cy% if m% > 0 then y% = y% - 1 : m% = m% - 8*y% x% = x% + 1 : m% = m% + 8*x% + 4 end_while
' dessiner l'angle inférieur gauche cx% = x1%+rayon% : cy% = y2%-rayon% x% = 0 : y% = rayon% : m% = 5 - 4*rayon% while x% <= y% 2d_point x%*(-1)+cx%,y%+cy% 2d_point y%*(-1)+cx%,x%+cy% if m% > 0 then y% = y% - 1 : m% = m% - 8*y% x% = x% + 1 : m% = m% + 8*x% + 4 end_while end_sub
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rectangles à coins arrondis. Encore !? Mar 25 Oct 2022 - 1:38 | |
| Merci JL35 Merci Marc Tous ces codes sont bons. J'ai posté, il y a environ 7 années un code de tracé d'arc de cercle par l'algorithme de Bresenham. Et un autre code dans le même post montrant une demo de ce l'on peut faire avec un simple octant. ça se trouve iciCi-après un code de tracé d'arc de cercle par l'algorithme de Bresenham. - Code:
-
rem ============================================================================ rem Tracé d’arc de cercle par l’alorithme de Bresenham rem Le tracé se fait par octant (c-à-d 1/8 de cercle) rem Les numéros des octants suivent le sens trigonométrique rem ============================================================================ dim i ' tracé des axes 2d_pen_color 255,0,0 : 2d_line 20,200,500,200 : 2d_line 250,20,250,400 2d_pen_color 0,0,255 for i = 1 to 8 caption 0,"Octant : " + str$(i) Tracer_Octant(250,200,100,i) : pause 1000 : ' La pause pour observer le tracé next i caption 0,"Et maintenant les 8 octants d'un trait formant un cercle complet" 2d_pen_color 255,0,255 : 2d_fill_off for i = 1 to 8 Tracer_Octant(250,200,90,i) next i end
rem ============================================================================ ' Tracer un arc de cercle : un huitième de cercle ' x_centre,y_centre : coordonnées du centre du cercle ' rayon : rayon du cercle ' octant : numéro de l'octant de 1 à 8 dans le sens trigonométrique ' octant = 1 : angle compris entre 0 et pi/4 rad soit entre 0° et 45° ' octant = 2 : angle compris entre pi/4 et pi/2 rad soit entre 45° et 90° ' octant = 3 : angle compris entre pi/2 et 3*pi/4 rad soit entre 90° et 135° ' octant = 4 : angle compris entre 3*pi/4 et pi rad soit entre 135° et 180° ' octant = 5 : angle compris entre pi et 5*pi/4 rad soit entre 180° et 225° ' octant = 6 : angle compris entre 5*pi/4 et 3*pi/2 rad soit entre 225° et 270° ' octant = 7 : angle compris entre 3*pi/2 et 7*pi/4 rad soit entre 270° et 315° ' octant = 8 : angle compris entre 7*pi/4 et 2*pi rad soit entre 315° et 360°
SUB Tracer_Octant(x_centre,y_centre,rayon,octant) dim_local x, y, m, xp, yp x = 0 : y = rayon : m = 5 - 4*rayon while x <= y select octant case 1 : xp = x_centre + y : yp = y_centre - x case 2 : xp = x_centre + x : yp = y_centre - y case 3 : xp = x_centre - x : yp = y_centre - y case 4 : xp = x_centre - y : yp = y_centre - x case 5 : xp = x_centre - y : yp = y_centre + x case 6 : xp = x_centre - x : yp = y_centre + y case 7 : xp = x_centre + x : yp = y_centre + y case 8 : xp = x_centre + y : yp = y_centre + x end_select 2d_point xp,yp if m > 0 then y = y - 1 : m = m - 8 * y x = x + 1 : m = m + 8 * x + 4 end_while END_SUB rem ============================================================================
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Rectangles à coins arrondis. Encore !? Mar 25 Oct 2022 - 3:25 | |
| Algorithme d'Andres de tracé de cercle. - Code:
-
rem ============================================================================ rem Algorithme de tracé de cercle d’Andres rem Ref : rem https://fr.wikipedia.org/wiki/Algorithme_de_trac%C3%A9_de_cercle_d%27Andres rem ============================================================================ dim xc,yc,r xc = 250 : yc = 200 : r = 100 ' Tracé des axes 2d_pen_color 255,0,0 : 2d_line 20,yc,500,yc : 2d_line xc,20,xc,400 ' Tracé de l'octant N° 7 (r = 100) 2d_pen_color 0,0,255 : Octant(xc,yc,r) : pause 1000 ' Tracé du cercle complet 2d_pen_color 0,0,0 : Cercle(xc,yc,r+50) : ' r = 150 end rem ============================================================================ ' Tracé de l'octant N° 7 SUB Octant(xc,yc,r) dim_local x,y,d x = 0 : y = r : d = r-1 while y >= x 2d_point xc+x,yc+y if d >= 2*x d = d-2*x-1 : x = x+1 else if d < 2*(r-y) d = d+2*y-1 : y = y-1 else d = d+2*(y-x-1) : y = y-1 : x = x+1 end_if end_if end_while END_SUB rem ============================================================================ ' Tracé du cercle complet par octants SUB Cercle(xc,yc,r) dim_local x,y,d x = 0 : y = r : d = r-1 while y >= x 2d_point xc + y , yc - x : ' Octant N° 1 2d_point xc + x , yc - y : ' Octant N° 2 2d_point xc - x , yc - y : ' Octant N° 3 2d_point xc - y , yc - x : ' Octant N° 4 2d_point xc - y , yc + x : ' Octant N° 5 2d_point xc - x , yc + y : ' Octant N° 6 2d_point xc + x , yc + y : ' Octant N° 7 2d_point xc + y , yc + x : ' Octant N° 8 if d >= 2*x d = d-2*x-1 : x = x+1 else if d < 2*(r-y) d = d+2*y-1 : y = y-1 else d = d+2*(y-x-1) : y = y-1 : x = x+1 end_if end_if end_while END_SUB rem ============================================================================
| |
| | | Contenu sponsorisé
| Sujet: Re: Rectangles à coins arrondis. Encore !? | |
| |
| | | | Rectangles à coins arrondis. Encore !? | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |