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é d'ellipse / tracé d'arcs de cercle | |
| | 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: Tracé d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 13:30 | |
| Si ça peut être utile pour quelqu'un : Tracé d’une ellipse calculée point par point Tracé d’une ellipse par la fonction Ellipse de la GDI32.DLL Remarquer la rapidité du tracé par l'utilisation de GDI32.DLL ! - Code:
-
rem ============================================================================ rem Tracé d’une ellipse calculée point par point rem Tracé d’une ellipse par la fonction Ellipse de la GDI32.DLL rem Le tracé par DLL est beaucoup plus rapide : dans un rapport de 1:40 ou mieux rem ============================================================================ dim n,t1,t2,hdc%,xc,yc,r1,r2 full_space 0 xc = width_client(0)/2 : yc = height_client(0)/2 dll_on "gdi32" hdc% = handle_canvas(0) t1 = number_ticks for n = 100 to 1 step -1 r1 = 5*n : r2 = 3*n ' Appeller successivement Ellipse_Calculee() puis Ellipse_Par_DLL() et comparer le temps mis pour le tracé Ellipse_Calculee(xc,yc,r1,r2) ' Ellipse_Par_DLL(xc-r1,yc-r2,xc+r1,yc+r2) next n t2 = number_ticks caption 0, "Durée de tracé pour 100 ellipses: " + str$(t2-t1) + " ms" end rem ============================================================================ ' Paramètres : ' xc,yc : coordonnées du centre de l'ellipse ' r1,r2 : demi-axe (rayon) horizontal et demi-axe (rayon) vertical SUB Ellipse_Calculee(xc,yc,r1,r2) dim_local a degrees 2d_poly_from xc + r1 , yc for a = 0 to 360 2d_poly_to xc + r1 * cos(a) , yc + r2 * sin(a) next a END_SUB rem ============================================================================ ' Paramètres: ' LeftRect% , TopRect% : coordonnées du point haut-gauche du rectangle contenant l'ellipse ' RightRect%, BottomRect% : coordonnées du point bas-droite du rectangle contenant l'ellipse SUB Ellipse_Par_DLL(LeftRect%,TopRect%,RightRect%,Bottomrect%) dim_local ret% ret% = dll_call5("Ellipse",hdc%,LeftRect%,TopRect%,RightRect%,Bottomrect%) END_SUB rem ============================================================================
Je vous remet ici un lien pour un code de tracé d'arcs de cercle par l'algorithme de Bresenham https://panoramic.1fr1.net/t4528-trace-darc-de-cercle-par-l-algorithme-de-bresenham?highlight=bresenhamA l'époque ça n'a pas suscité beaucoup d'intérêt. Je vous remet une démonstration de ce que le programme est capable de faire. - Code:
-
rem ============================================================================ rem Tracé d’arc de cercle par l’algorithme de Bresenham rem Par Papydall rem ============================================================================
Init() Demo() end rem ============================================================================ SUB Init() dim xc,yc,where_x,where_y,p width 0,800 : height 0, 600 top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 color 0,0,0,255 : 2d_pen_color 255,0,0 : font_color 0,255,255,255 : font_bold 0 xc = width(0)/2 : yc = height(0)/2 : p = 3000 END_SUB rem ============================================================================ SUB Demo() Les_8_Octants() : pause p : cls Demo_1() : pause p : cls Demo_2() : pause p : cls Demo_3() : pause p : cls Demo_4() : pause p : cls Demo_5() : pause p : cls Demo_6() : pause p : cls Demo_7() : pause p : cls Alphabet() : pause p : cls Bonhommes() : pause p : cls Texte(50,50,20) Bonhomme(100,400,10) : Bonhomme(250,400,8) : Bonhomme(350,400,5) Bonhomme(400,400,3) : Bonhomme(430,400,2) : Bonhomme(450,400,1) END_SUB 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 where_x = xp : where_y = yp END_SUB rem ============================================================================ SUB Les_8_Octants() caption 0,"Les 8 octants d'un cercle" dim_local i,j print_locate xc-100,50 : print "Les 8 octants d'un cercle" Cercle(xc,yc,100) : j = 9 for i = 0 to 2*pi step pi/4 : 2d_line xc,yc,xc+100*cos(i),yc+100*sin(i) : next i for i = pi/8 to 2*pi step pi/4 j = j-1 : print_locate xc+120*cos(i),yc+120*sin(i) : print j next i END_SUB rem ============================================================================ SUB Demo_1() dim_local i,j caption 0,"Tracé d'un carreau par les octants" for j = 1 to height(0) step 150 for i = 1 to width(0) step 100 : carreau(50+i,50+j,50,1,255,255,0) : next i next j END_SUB rem ---------------------------------------------------------------------------- SUB Demo_2() Carreau(xc,yc,yc-100,1,255,0,0) Carreau(100,100,100,1,255,255,0) Carreau(500,100,50,1,255,255,0) Carreau(200,300,20,1,255,255,0) END_SUB rem ---------------------------------------------------------------------------- SUB Demo_3() dim_local i,j for i = 10 to 150 step 4 : Carreau(xc,yc,i,1,255,255,0) : next i Cercle(xc,yc-150,25) : cercle(xc,yc+150,25) : ' tracer cercle par 8 octants 2d_circle xc-200,yc,50 : 2d_circle xc+200,yc,50 : ' tracer cercle par 2d_circle END_SUB rem ---------------------------------------------------------------------------- SUB Demo_4() dim_local r r = 30 caption 0,"Tracé de carreau / Trèfle / Coeur / Pique Carreau(4*r,yc,3*r,1,255,255,0) Trefle(10*r,yc,r,1,255,255,0) Coeur(15*r,yc,r,1,255,255,0) Pique(20*r,yc,r,1,255,255,0) END_SUB rem ---------------------------------------------------------------------------- SUB Demo_5() dim_local x,y,r r = 25 caption 0,"Tracé d'une frise par les octants" for x = 100 to 2*xc-4*r step 4*r for y = 2*r to 2*yc step 4*r+10 : Frise_1(x,y,r,1,255,0,0) : next y next x for x = 100 to 2*xc-8*r step 4*r for y = 2*r to 2*yc step 4*r+10 : 2d_flood x+2*r,y,255,255,0 : next y next x END_SUB rem ============================================================================ SUB Demo_6() dim_local x,y,r r = 20 for x = 0 to 2*xc step 2*r for y = 0 to 2*yc step 2*r : Frise_2(x,y,r) : next y next x END_SUB rem ============================================================================ SUB Demo_7() dim_local x,y,r,r1 r = 30 caption 0,"Tracé d'une balle par les octants" for x = r to 2*xc step 2*r r1 = 1-r1 for y = r to 2*yc step 2*r : Balle(x,y,r+r1) : next y next x pause p : cls for r = 20 to yc/2 step 5 : cls : Balle(xc,yc,r) : pause 500 : next r
END_SUB rem ============================================================================ ' Tracé d'un cercle par octant ' Pour obtenir un cercle complet, on trace les 8 octants SUB Cercle(x,y,r) dim_local i for i = 1 to 8 : Tracer_Octant(x,y,r,i) : next i END_SUB rem ============================================================================ ' Tracé d'un carreau par combinaison d'octants ' Chaque branche est constituée par 2 octants (soit un quart de cercle) ' x,y : coordonnées du centre du carreau ' r : rayon ' p : si p > 0 , le carreau est rempli de la couleur cr,cg,cb SUB Carreau(x,y,r,p,cr,cg,cb) dim_local i for i = 7 to 8 : Tracer_Octant(x-r,y-r,r,i) : next i for i = 5 to 6 : Tracer_Octant(x+r,y-r,r,i) : next i for i = 1 to 2 : Tracer_Octant(x-r,y+r,r,i) : next i for i = 3 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i if p > 0 then 2d_flood x,y,cr,cg,cb END_SUB rem ============================================================================ SUB Trefle(x,y,r,p,cr,cg,cb) dim_local i,r1,x1,y1 : r1 = sqr(2) for i = 1 to 5 : Tracer_Octant(x,y-r1*r,r,i) : next i for i = 2 to 7 : Tracer_Octant(x-r1*r,y,r,i) : next i for i = 1 to 3 : Tracer_Octant(x+r1*r,y,r,i) : next i for i = 6 to 8 : Tracer_Octant(x+r1*r,y,r,i) : next i Tracer_Octant(x,y-r1*r,r,8) Tracer_Octant(x-r1*r,y+r1*r,r,1) Tracer_Octant(x+r1*r,y+r1*r,r,4) Tracer_Octant(x-r1*r,y+r1*r,r,8) : x1 = where_x : y1 = where_y Tracer_Octant(x+r1*r,y+r1*r,r,5) : 2d_line where_x,where_y,x1,y1 if p > 0 then 2d_flood x,y,cr,cg,cb END_SUB rem ============================================================================ SUB Coeur(x,y,r,p,cr,cg,cb) dim_local i for i = 1 to 6 : Tracer_Octant(x-r,y,r,i) : next i for i = 1 to 4 : Tracer_Octant(x+r,y,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y,r,i) : next i for i = 3 to 4 : Tracer_Octant(x+r,y+2*r,r,i) : next i for i = 1 to 2 : Tracer_Octant(x-r,y+2*r,r,i) : next i if p > 0 then 2d_flood x,y+2,cr,cg,cb END_SUB rem ============================================================================ SUB Pique(x,y,r,p,cr,cg,cb) dim_local i for i = 3 to 6 : Tracer_Octant(x-r,y,r,i) : next i for i = 1 to 2 : Tracer_Octant(x+r,y,r,i) : next i for i = 7 to 8 Tracer_Octant(x+r,y,r,i) : Tracer_Octant(x-r,y+r,r,i) Tracer_Octant(x-r,y-2*r,r,i) next i for i = 5 to 6 Tracer_Octant(x+r,y-2*r,r,i) : Tracer_Octant(x+r,y+r,r,i) next i
2d_line x-r,y+r,x+r,y+r : 2d_line x-r,y+2*r,x+r,y+2*r if p > 0 then 2d_flood x,y,cr,cg,cb: 2d_flood x,y+2*r-2,cr,cg,cb END_SUB rem ============================================================================ SUB Frise_1(x,y,r,p,cr,cg,cb) dim_local i 2d_pen_color 0,0,254 for i = 1 to 4 : Tracer_Octant(x,y,r,i) : next i for i = 7 to 8 : Tracer_Octant(x,y,r,i) : next i for i = 3 to 8 : Tracer_Octant(x,y+2*r,r,i) : next i for i = 1 to 6 : Tracer_Octant(x+2*r,y,r,i) : next i for i = 1 to 2 : Tracer_Octant(x+2*r,y+2*r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+2*r,y+2*r,r,i) : next i if p > 0 then 2d_flood x,y+2*r,cr,cg,cb END_SUB rem ============================================================================ SUB Frise_2(x,y,r) dim_local i 2d_pen_color 255,0,0 for i = 3 to 4 : Tracer_Octant(x,y,r,i) : next i for i = 1 to 2 : Tracer_Octant(x+r,y,r,i) : next i 2d_line x,y-r,x+r,y-r for i = 5 to 6 : Tracer_Octant(x,y+r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y+r,r,i) : next i 2d_line x,y+2*r,x+r,y+2*r : 2d_line x-r,y,x-r,y+r : 2d_line x+2*r,y,x+2*r,y+r END_SUB rem ============================================================================ SUB Balle(x,y,r) dim_local i,r1 r1 = int(r/2) for i = 1 to 8 : Tracer_Octant(x,y,r,i) : next i for i = 1 to 2 : Tracer_Octant(x,y-r1,r1,i) : next i for i = 7 to 8 : Tracer_Octant(x,y-r1,r1,i) : next i for i = 3 to 6 : Tracer_Octant(x,y+r1,r1,i) : next i for i = 1 to 4 : Tracer_Octant(x-r1,y,r1,i) : next i for i = 5 to 8 : Tracer_Octant(x+r1,y,r1,i) : next i if odd(r) = 1 2d_flood x,y-r1,255,255,000 : 2d_flood x,y+r1,255,255,000 2d_flood x-r1,y,255,000,000 : 2d_flood x+r1,y,255,000,000 else 2d_flood x,y-r1,255,000,000 : 2d_flood x,y+r1,255,000,000 2d_flood x-r1,y,255,255,000 : 2d_flood x+r1,y,255,255,000 end_if END_SUB rem ============================================================================ SUB Alphabet() caption 0,"Création des lettres de l'alphabet par les octants" A(050,100,20) : B(100,100,20) : C(150,100,20) : D(200,100,20) : E(250,100,20) F(300,100,20) : G(350,100,20) : H(400,100,20) : I(450,100,20) : J(500,100,20) K(550,100,20) : L(600,100,20) : M(650,100,20) : N(050,200,20) : O(100,200,20) P(150,200,20) : Q(200,200,20) : R(250,200,20) : S(300,200,20) : T(350,200,20) U(400,200,20) : V(450,200,20) : W(500,200,20) : X(550,200,20) : Y(600,200,20) Z(650,200,20) END_SUB rem ============================================================================ SUB A(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i 2d_line x,y+r,x,y+4*r : 2d_line x+2*r,y+r,x+2*r,y+4*r : 2d_line x,y+2*r,x+2*r,y+2*r END_SUB rem ============================================================================ SUB B(x,y,r) dim_local i 2d_poly_from x+r,y : 2d_poly_to x,y : 2d_poly_to x,y+4*r 2d_poly_to x+r,y+4*r : 2d_line x,y+2*r,x+r,y+2*r for i = 1 to 2 : Tracer_Octant(x+r,y+r,r,i) : Tracer_Octant(x+r,y+3*r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y+r,r,i) : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB C(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x,y+r,x,y+3*r END_SUB rem ============================================================================ SUB D(x,y,r) dim_local i 2d_poly_from x+r,y : 2d_poly_to x,y : 2d_poly_to x,y+4*r :2d_poly_to x+r,y+4*r for i = 1 to 2 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x+2*r,y+r,x+2*r,y+3*r END_SUB rem ============================================================================ SUB E(x,y,r) dim_local i 2d_poly_from x+2*r,y : 2d_poly_to x,y : 2d_poly_to x,y+4*r 2d_poly_to x+2*r,y+4*r : 2d_line x,y+2*r,x+r,y+2*r END_SUB rem ============================================================================ SUB F(x,y,r) dim_local i 2d_poly_from x+2*r,y : 2d_poly_to x,y : 2d_poly_to x,y+4*r 2d_line x,y+2*r,x+r,y+2*r END_SUB rem ============================================================================ SUB G(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x,y+r,x,y+3*r : 2d_line x+r,y+2*r,x+2*r,y+2*r : 2d_poly_to x+2*r,y+3*r END_SUB rem ============================================================================ SUB H(x,y,r) 2d_line x,y,x,y+4*r : 2d_line x+2*r,y,x+2*r,y+4*r : 2d_line x,y+2*r,x+2*r,y+2*r END_SUB rem ============================================================================ SUB I(x,y,r) 2d_line x,y,x+2*r,y : 2d_line x,y+4*r,x+2*r,y+4*r: 2d_line x+r,y,x+r,y+4*r END_SUB rem ============================================================================ SUB J(x,y,r) dim_local i 2d_line x,y,x+2*r,y :2d_poly_to x+2*r,y+3*r for i= 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB K(x,y,r) dim_local i 2d_line x,y,x,y+4*r for i = 3 to 4 : Tracer_Octant(x+2*r,y+r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x,y+r,r,i) : next i for i = 1 to 2 : Tracer_Octant(x,y+3*r,r,i) : next i for i = 5 to 6 : Tracer_Octant(x+2*r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB L(x,y,r) 2d_poly_from x,y : 2d_poly_to x,y+4*r : 2d_poly_to x+2*r,y+4*r END_SUB rem ============================================================================ SUB M(x,y,r) dim_local i for i = 5 to 8 : Tracer_Octant(x+r,y,r,i) : next i 2d_line x,y,x,y+4*r : 2d_line x+2*r,y,x+2*r,y+4*r END_SUB rem ============================================================================ SUB N(x,y,r) dim_local i 2d_line x,y,x,y+4*r : 2d_line x+2*r,y,x+2*r,y+4*r for i = 1 to 2 : Tracer_Octant(x,y+r,r,i) : next i for i = 5 to 6 : Tracer_Octant(x+2*r,y+r,r,i) : next i END_SUB rem ============================================================================ SUB O(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x,y+r,x,y+3*r : 2d_line x+2*r,y+r,x+2*r,y+3*r END_SUB rem ============================================================================ SUB P(x,y,r) dim_local i for i = 1 to 2 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y+r,r,i) : next i 2d_poly_from x+r,y : 2d_poly_to x,y 2d_poly_to x,y+4*r : 2d_line x,y+2*r,x+r,y+2*r END_SUB rem ============================================================================ SUB Q(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x,y+r,x,y+3*r : 2d_line x+2*r,y+r,x+2*r,y+3*r for i = 5 to 6 : Tracer_Octant(x+2*r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB R(x,y,r) dim_local i 2d_poly_from x+r,y : 2d_poly_to x,y : 2d_poly_to x,y+4*r : 2d_line x,y+2*r,x+r,y+2*r for i = 1 to 2 : Tracer_Octant(x+r,y+r,r,i) : Tracer_Octant(x+r,y+3*r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+r,y+r,r,i) : next i 2d_line x+2*r,y+3*r,x+2*r,y+4*r END_SUB rem ============================================================================ SUB S(x,y,r) dim_local i for i = 1 to 6 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 1 to 2 : Tracer_Octant(x+r,y+3*r,r,i) : next i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB T(x,y,r) 2d_line x,y,x+2*r,y : 2d_line x+r,y,x+r,y+4*r END_SUB rem ============================================================================ SUB U(x,y,r) dim_local i for i = 5 to 8 : Tracer_Octant(x+r,y+3*r,r,i) : next i 2d_line x,y,x,y+3*r : 2d_line x+2*r,y,x+2*r,y+3*r END_SUB rem ============================================================================ SUB V(x,y,r) dim_local i 2d_line x,y,x,y+3*r : 2d_line x+2*r,y,x+2*r,y+3*r for i = 1 to 2 : Tracer_Octant(x,y+4*r,r,i) : next i for i = 3 to 4 : Tracer_Octant(x+2*r,y+4*r,r,i) : next i END_SUB rem ============================================================================ SUB W(x,y,r) dim_local i 2d_line x,y,x,y+4*r : 2d_line x+2*r,y,x+2*r,y+4*r for i = 7 to 8 : Tracer_Octant(x,y+3*r,r,i) : next i for i = 5 to 6 : Tracer_Octant(x+2*r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB X(x,y,r) dim_local i 2d_line x,y,x,y+r : 2d_line x+2*r,y,x+2*r,y+r 2d_line x,y+3*r,x,y+4*r : 2d_line x+2*r,y+3*r,x+2*r,y+4*r for i = 5 to 8 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 1 to 4 : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB Y(x,y,r) dim_local i 2d_line x,y,x,y+r : 2d_line x+2*r,y,x+2*r,y+3*r for i = 5 to 8 : Tracer_Octant(x+r,y+r,r,i) : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB Z(x,y,r) dim_local i 2d_line x,y,x+2*r,y : 2d_poly_to x+2*r,y+r 2d_line x,y+3*r,x,y+4*r : 2d_poly_to x+2*r,y+4*r for i = 7 to 8 : Tracer_Octant(x+r,y+r,r,i) : next i for i = 3 to 4 : Tracer_Octant(x+r,y+3*r,r,i) : next i END_SUB rem ============================================================================ SUB Bonhommes() caption 0,"Création de bonhommes par les octants" Bonhomme(100,50,30) : Bonhomme(300,50,20) : Bonhomme(450,50,15) Bonhomme(550,50,10) : Bonhomme(620,50,05) : Bonhomme(660,50,02) Bonhomme(680,50,01) END_SUB rem ============================================================================ SUB Bonhomme(x,y,r) dim_local i for i = 1 to 4 : Tracer_Octant(x,y,r,i) : next i for i = 7 to 8 : Tracer_Octant(x-2*r,y,r,i) : next i for i = 5 to 6 : Tracer_Octant(x+2*r,y,r,i) : next i 2d_line x-2*r,y+r,x+2*r,y+r 2d_line x-r,y+r,x-r,y+2*r : 2d_line x+r,y+r,x+r,y+2*r for i = 5 to 8 : Tracer_Octant(x,y+2*r,r,i) : next i 2d_line x-2*r,y+3*r,x+2*r,y+3*r for i = 3 to 4 : Tracer_Octant(x-2*r,y+4*r,r,i) : next i for i = 1 to 2 : Tracer_Octant(x+2*r,y+4*r,r,i) : next i 2d_line x-3*r,y+4*r,x-3*r,y+10*r : 2d_poly_to x-2*r,y+10*r 2d_line x+3*r,y+4*r,x+3*r,y+10*r : 2d_poly_to x+2*r,y+10*r for i = 5 to 6 : Tracer_Octant(x-2*r,y+10*r,r,i) : next i for i = 7 to 8 : Tracer_Octant(x+2*r,y+10*r,r,i) : next i 2d_line x-2*r,y+6*r,x-2*r,y+15*r : 2d_line x+2*r,y+6*r,x+2*r,y+15*r 2d_line x-2*r,y+9*r,x+2*r,y+9*r 2d_line x,y+9*r,x,y+15*r 2d_line x-2*r,y+15*r,x+2*r,y+15*r for i = 5 to 8 : Tracer_Octant(x-r,y+15*r,r,i) : Tracer_Octant(x+r,y+15*r,r,i) : next i END_SUB rem ============================================================================ SUB Texte(x,y,r) dim_local s,x1, y1 ,y2 caption 0,"Un texte écrit par un alphabet crée par les octants" s = 3*r : y1 = y + 4*r+10 : y2 = y+10*r : x1 = x+6*r P(x,y,r) : A(x+s,y,r) : N(x+2*s,y,r) : O(x+3*s,y,r) : R(x+4*s,y,r) A(x+5*s,y,r) : M(x+6*s,y,r) : I(x+7*s,y,r) : C(x+8*s,y,r) E(x1,y1,r) : C(x1+s,y1,r) : R(x1+2*s,y1,r) : I(x1+3*s,y1,r) : T(x1+4*s,y1,r) P(x,y2,r) : A(x+s,y2,r) : R(x+2*s,y2,r) O(x+4*s,y2,r) : C(x+5*s,y2,r) : T(x+6*s,y2,r) : A(x+7*s,y2,r) N(x+8*s,y2,r) : T(x+9*s,y2,r) : S(x+10*s,y2,r) END_SUB rem ============================================================================
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 14:55 | |
| Merci Papydall ! C'est utile, c'est beau, c'est bien présenté, c'est du Papydall ! | |
| | | 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é d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 15:18 | |
| | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 16:17 | |
| Oui papydall, c'est beaucoup plus rapide avec gdi32.dll. Deux petites contraintes toutefois, sauf erreur de ma part: - l'ellipse est obligatoirement remplie de la couleur courante (donc masque ce qui est dessous) - on ne peut que tracer l'ellipse entière (pas d'arc) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 16:55 | |
| Bravo ! Papydall. Le deuxième code est particulièrement intéressant. C'est impressionnant ce qu'on peut faire avec les maths. | |
| | | 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é d'ellipse / tracé d'arcs de cercle Sam 2 Juin 2018 - 19:31 | |
| @JL35 Il existe deux fonctions Arc et ArcTo dans GDI32.DLL qui permettent de tracer un arc d’ellipse / cercle. Malheureusement, elles nécessitent 9 paramètres, chose impossible en Panoramic ! @Jean Claude Que serait la vie sans les maths ? @Tous Voici de la bonne lecture ici | |
| | | 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é d'ellipse / tracé d'arcs de cercle Lun 4 Juin 2018 - 12:16 | |
| Voici comment créer un stylo, une couleur et une épaisseur pour le tracé. Le code est suffisamment commenté pour suivre son déroulement. - Code:
-
rem ============================================================================ rem Tracé d’ellipse par la fonction Ellipse de la GDI32.DLL rem ============================================================================ dim hdc%,hPen%,ret%,xc,yc,r1,r2
xc = width_client(0)/2 : yc = height_client(0)/2 : r1 = 200 : r2 = 150 hdc% = handle_canvas(0) dll_on "gdi32" rem ============================================================================ ' Choix du style du tracé, de la largeur et de la couleur du stylo rem hPen% = dll_call3("CreatePen",PenStyle%,PenWidth%,CouleurRGB%) rem PenStyle% = 0 <--- Solid rem PenStyle% = 1 <--- Dash rem PenStyle% = 2 <--- Dot rem PenStyle% = 3 <--- DashDot rem PenStyle% = 4 <--- DashdotDot rem PenStyle% = 5 <--- Null rem PenStyle% = 6 <--- InsideFrame rem PenWidth% : épaisseur du tracé, si PenWidth% = 0 <--- 1 pixel rem CouleurRGB% : couleur du tracé donnée par la fonction RGB(R,G,B) rem ============================================================================
' Exemples hPen% = dll_call3("CreatePen",0,5,RGB%(255,0,0)) : ' Créer un stylo rouge pour dessiner le bord avec une épaisseur de 5 pixels ret% = dll_call2("SelectObject",hdc%,hPen%) : ' Sélectionner le stylo qui vient d'être crée ret% = dll_call5("Ellipse",hdc%,140,30,200,275) : ' Tracer l'ellipse sur le canvas ret% = dll_call5("Ellipse",hdc%,380,30,440,275) : ' Une autre ellipse ret% = dll_call5("Ellipse",hdc%,int(xc-r1),int(yc-r2),int(xc+r1),int(yc+r2)) : ' et une autre hPen% = dll_call3("CreatePen",0,1,RGB%(0,0,0)) : ' Créer un nouveau stylo noir qui remplace le précédant ret% = dll_call2("SelectObject",hdc%,hPen%) : ' Sélection du stylo ret% = dll_call5("Ellipse",hdc%,200,100,300,150): ' tracé de l'ellipse ret% = dll_call5("Ellipse",hdc%,300,100,400,150): ' tracé d'une autre ellipse hPen% = dll_call3("CreatePen",0,0,RGB%(0,0,255)) : ' Créer un autre stylo bleu ret% = dll_call2("SelectObject",hdc%,hPen%) : ' sélection stylo ret% = dll_call5("Ellipse",hdc%,200,200,400,300): ' tracé
' Libérer les objets ret% = dll_call1("DeleteObject",hPen%) : ' destruction / libération du stylo dll_off end rem ============================================================================ ' Fonction calculant la couleur RGB FNC RGB%(r%,g%,b%) result 65536 * B% + 256 * G% + R% END_FNC rem ============================================================================
Dernière édition par papydall le Lun 4 Juin 2018 - 15:37, édité 1 fois (Raison : Edité pour tenir compte de la remarque de Jean Claude) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle Lun 4 Juin 2018 - 12:59 | |
| Il y a un petit bug dans ton code "Felix le chat" J'ai dû remplacer la ligne 28 par - Code:
-
ret% = dll_call5("Ellipse",hdc%,xc-r1,int(yc-r2),int(xc+r1),int(yc+r2)) : ' et une autre
Sinon j'ai message d'erreur A+ | |
| | | 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é d'ellipse / tracé d'arcs de cercle Lun 4 Juin 2018 - 14:25 | |
| @Jean Claude Tu as bien fait : tous les paramètres sont obligatoirement des entiers. Chez moi, je n’ai pas eu l’honneur d’avoir une erreur comme toi. C’est sans doute parce que nous n’avons pas les mêmes valeurs pour les width_client / height_client | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle Lun 4 Juin 2018 - 15:11 | |
| Ah ! voilà pourquoi. Je me disais que ce n'était pas dans les habitudes que Papydall publie un code buggé... J'aime bien sa tête à ce brave chat. Celui-là j'essaierai de ne pas le "fouetter". A+ | |
| | | 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é d'ellipse / tracé d'arcs de cercle Lun 4 Juin 2018 - 15:39 | |
| Essaie de jouer avec le code pour afficher d’autres créatures : chats, ours, etc. et pourquoi pas Pinocchio ou une autre créatures plus sexy comme un Martien. | |
| | | Contenu sponsorisé
| Sujet: Re: Tracé d'ellipse / tracé d'arcs de cercle | |
| |
| | | | Tracé d'ellipse / tracé d'arcs de cercle | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |