FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» ajouter des blancs dans un TXT
par lepetitmarocain Hier à 13:00

» Planétarium virtuel.
par Oscaribout Mar 14 Aoû 2018 - 19:45

» 11 (en analyse): commandes sur TAB et SUB_MENU.
par Jack Mar 14 Aoû 2018 - 14:10

» 10 (en analyse): Erreur sur variable locale.
par Jack Mar 14 Aoû 2018 - 14:05

» Métamatière, éternité et renouvellement
par Oscaribout Mar 14 Aoû 2018 - 12:40

» De retour...
par Yannick Lun 13 Aoû 2018 - 15:11

» bug SEVERE fnc+sub : (35)name already defined
par Oscaribout Dim 12 Aoû 2018 - 23:55

» Encadrement
par Jean Claude Dim 12 Aoû 2018 - 11:53

» Des rectangles...
par JL35 Dim 12 Aoû 2018 - 10:53

» TRIGGER_KEY_COMBINED_TOUCH
par Jean Claude Mar 7 Aoû 2018 - 20:58

» ITEM_SELECT N,L pour synedit
par Jean Claude Mar 7 Aoû 2018 - 19:11

» amélioration panoramic
par silverman Dim 5 Aoû 2018 - 18:34

» Commande file_readln.
par Pedro Alvarez Dim 5 Aoû 2018 - 17:08

» Klaus ?
par Jack Sam 4 Aoû 2018 - 22:48

» Défragmentation du disque dur
par JL35 Sam 4 Aoû 2018 - 21:06

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2018
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier

Partagez | 
 

 Tracé d'ellipse / tracé d'arcs de cercle

Aller en bas 
AuteurMessage
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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

http://panoramic.1fr1.net/t4528-trace-darc-de-cercle-par-l-algorithme-de-bresenham?highlight=bresenham

A 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 ============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Marc

avatar

Nombre de messages : 809
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: 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 ! cheers
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Sam 2 Juin 2018 - 15:18

Merci Marc.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
JL35



Nombre de messages : 6311
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: 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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5574
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: 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.

cheers
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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 ! Crying or Very sad

@Jean Claude
Que serait la vie sans les maths ?  Sad


@Tous
Voici de la bonne lecture ici
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

Nombre de messages : 5574
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: 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"  Very Happy

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 Question


A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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. Embarassed
C’est sans doute parce que nous n’avons pas les mêmes valeurs pour les width_client / height_client
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

Nombre de messages : 5574
Age : 64
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: 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é... Very Happy

J'aime bien sa tête à ce brave chat. Celui-là j'essaierai de ne pas le "fouetter". Razz

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5983
Age : 68
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: 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. alien
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Contenu sponsorisé




MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    

Revenir en haut Aller en bas
 
Tracé d'ellipse / tracé d'arcs de cercle
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Comment récuperer les tracés, suite à un changement de PC.
» Trac(k)back sur Colorado
» Modification de tracé en route
» Importation tracés
» Création Itinéraire à partir de Tracé sur version 3.3.2

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: