FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» bouton dans autre form que 0
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar leclode Aujourd'hui à 13:59

» KGF_dll - nouvelles versions
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar Klaus Aujourd'hui à 11:41

» Gestion d'un système client-serveur.
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar Klaus Aujourd'hui à 10:23

» PANORAMIC V 1
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar papydall Sam 4 Mai 2024 - 3:43

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Dessine-moi une galaxie
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Tracé d'ellipse / tracé d'arcs de cercle  Emptypar papydall Dim 21 Avr 2024 - 23:30

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-39%
Le deal à ne pas rater :
Ordinateur portable ASUS Chromebook Vibe CX34 Flip
399 € 649 €
Voir le deal

 

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

Aller en bas 
4 participants
AuteurMessage
papydall

papydall


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptySam 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=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
http://papydall-panoramic.forumarabia.com/
Marc

Marc


Nombre de messages : 2389
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptySam 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
papydall

papydall


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

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

Merci Marc.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptySam 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
Jean Claude

Jean Claude


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptySam 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
papydall

papydall


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptySam 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
http://papydall-panoramic.forumarabia.com/
papydall

papydall


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptyLun 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
http://papydall-panoramic.forumarabia.com/
Jean Claude

Jean Claude


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptyLun 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
Tracé d'ellipse / tracé d'arcs de cercle  Image_33

A+
Revenir en haut Aller en bas
papydall

papydall


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptyLun 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
http://papydall-panoramic.forumarabia.com/
Jean Claude

Jean Claude


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptyLun 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
papydall

papydall


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

Tracé d'ellipse / tracé d'arcs de cercle  Empty
MessageSujet: Re: Tracé d'ellipse / tracé d'arcs de cercle    Tracé d'ellipse / tracé d'arcs de cercle  EmptyLun 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
http://papydall-panoramic.forumarabia.com/
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
Tracé d'ellipse / tracé d'arcs de cercle
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Tracé d’arc de cercle par l'algorithme de Bresenham
» Tracé d'un ellipsoïde
» Une trace paramétrable en 100 % Panoramic
» Mode TRACE pour Panoramic
» Traceur : suivez vos sources à la trace.

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: