Forum Liberty Basic France

Débutant » Flush, redraw, segment... gestion des graphismes pou essayer d'y voir un peu plus clair
Le 25/04/2020 à 11h56

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
hello les programmeurs fous !

Dans le dessin d'un graphique, j'ai eu besoin de supprimer une courbe.

Pour cela, on peut chercher à retrouver l'état des pixels avant le tracé de la courbe, on peut tout redessiner sauf la courbe en question, et on peut aussi se souvenir que JB/LB propose un mécanisme d'affichage et de dés-affichage de "segments".

Ces "segments" ne sont pas des segments de droite, mais des blocs d'instructions graphiques, qu'on délimite dans le code avec des "flush".

De plus, l'utilisation intelligente de ce mécanisme permet de gérer la mémoire consommée par l'exécution des instructions graphiques, ce qu'on ne peut pas faire en alignant seulement les "line", "ellipse" et autre "fill" qui aboutissent à notre oeuvre d'art.

Nous devrions donc logiquement aborder les graphismes par l'étude de ce mécanisme, et là, je n'ai jamais fait, et j'ai nagé. Outre l'aide et les exemples fournis, j'ai trouvé ces deux pages très utiles chez Alyce : Segments and Flushing et Getting to grips with Segments, qui expliquent plus en détails le comment faire.

Le programme ci-dessous fait le job : afficher ou dés-afficher une courbe sur mon graphique, mais :
  • 1. je n'ai pas forcément tout compris
  • 2. avant d'afficher ou de désafficher les courbes, il faut les mettre dans un "segment", et durant cette opération, les instructions graphiques s'affichent, alors que je désirerais ne rien voir de cette opération.

Voilà le code (le dessin des courbes est complexe, c'est normal car issu d'un programme en cours de réalisation. Pour cet exemple, on aurait pu faire plus simple) :
Code VB :
 
 
nomainwin
checkbox #1.cb1, "courbe 1", [ajouteC1], [retireC1], 10, 10, 80, 20
checkbox #1.cb2, "courbe 2", [ajouteC2], [retireC2], 10, 30, 80, 20
 
graphicbox #1.gb, 100, 20, 660, 520
 
WindowWidth = 800
WindowHeight = 600
open "test" for dialog as #1
    #1, "trapclose [quit]"
    #1.cb1, "reset"
    #1.cb2, "reset"
 
    '** dessin du graphique
    #1.gb, "cls"
 
    'fond
    #1.gb, "down"
    #1.gb, "fill black"
    #1.gb, "place 280 20"
    #1.gb, "backcolor black"
    #1.gb, "color white"
    #1.gb, "\Graphique"
 
    'axes
    x1=50 : x2=610
    y1=60 : y2=470
 
    xmin=-2 : xmax=3 : pasx=(x2-x1)/(xmax-xmin)
    ymin=-3 : ymax=2 : pasy=(y2-y1)/(ymax-ymin)
 
    'horizontal
    xo=x1+abs(xmin)*pasx
    for a=ymin to ymax
        ya=y2-pasy*(a-ymin)
        if a=0 then #1.gb, "color white" else #1.gb, "color darkgray"
        #1.gb, "line ";x1;" ";ya;" ";x2;" ";ya
        if a<>0 then
            #1.gb, "color yellow"
            #1.gb, "place ";xo-16;" ";ya+4
            #1.gb, "\";a
        end if
    next
 
    'vertical
    yo=y2-abs(ymin)*pasy
    for a=xmin to xmax
        xa=x1+pasx*(a-xmin)
        if a=0 then #1.gb, "color white" else #1.gb, "color darkgray"
        #1.gb, "line ";xa;" ";y1;" ";xa;" ";y2
        if a<>0 then
            #1.gb, "color yellow"
            #1.gb, "place ";xa-4;" ";yo-3
            #1.gb, "\";a
        end if
    next
    #1.gb, "flush fond"
 
 
    '** dessin des courbes

    'courbe 1
    #1.gb, "color cyan"
    a=1:b=-2:gosub [dessine_courbe]
    #1.gb, "flush C1"
 
    'courbe 2
    #1.gb, "color red"
    a=-0.5:b=1:gosub [dessine_courbe]
    #1.gb, "flush C2"
    #1.gb, "up"
 
 
    '** ré-affiche le fond
    #1.gb, "redraw fond"
    wait
 
 
[dessine_courbe]
    for d=x1 to x2
        xr=xmin+(d-x1)/pasx
        yr=a*xr+b
        yp=y2-pasy*(yr-ymin)
        if yp>y1 and yp<y2 then #1.gb, "set ";d;" ";yp
    next
    return
 
 
[ajouteC1] laC1=1 : gosub [dessine] : wait
[retireC1] laC1=0 : gosub [dessine] : wait
 
[ajouteC2] laC2=1 : gosub [dessine] : wait
[retireC2] laC2=0 : gosub [dessine] : wait
 
 
[dessine]
    #1.gb, "redraw fond"
    if laC1=1 then #1.gb, "redraw C1"
    if laC2=1 then #1.gb, "redraw C2"
    return
 
 
[quit]
    close #1
    end
 
 

Comment auriez-vous fait pour obtenir le meme résultat ?
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 25/04/2020 à 14h34

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2200
Tu ne te sers pas de "segment" et "delsegment"
Ce truc issu des anglophones via mes archives:
Code VB :
 
 'this is the refreshed graphic example, only one segment
    'is ever retained in memory.
    nomainwin
    WindowWidth  = 600
    WindowHeight = 400
    UpperLeftX   = (DisplayWidth-WindowWidth)/2
    UpperLeftY   = (DisplayHeight-WindowHeight)/2
    button #1.b, "Draw Graphic", [nextdrawing], UL, 250, 340
    textbox #1.tb 350, 340, 100, 25
    graphicbox #1.gb, 50,25,500,300
    open "Refreshed Graphic Example" for window_nf as #1
    #1 "trapclose [quit]"
 
    'put the pen down and set the font
    'note cls has no impact on these settings
    #1.gb "down ; font comic_sans 48"
 
    'good practice to start with a clean sheet
    #1.gb "cls"
 
    drawing=1
    wait
 
    [nextdrawing]
    'first delete the last segment, it does not matter that
    'first time round this loop there isn't a segment to delete
    'Liberty will ignore the command
    #1.gb "delsegment seg"
 
    'now paint over the last graphics on screen
    if drawing=1 then 'draw graphics 1
        #1.gb "fill pink ; backcolor red ; color red"
        #1.gb "place 100 50 ; boxfilled  300 150"
        #1.gb "place 300 150 ; circlefilled 100"
        #1.gb "backcolor pink"
        #1.gb "place 50 100 ;\1"
    end if
    if drawing=2 then 'draw graphics 2
        #1.gb "fill yellow ; backcolor green ; color green"
        #1.gb "place 300 50 ; boxfilled  400 200"
        #1.gb "place 300 200 ; circlefilled 100"
        #1.gb "backcolor yellow"
        #1.gb "place 250 50 ;\2"
    end if
    if drawing=3 then 'draw graphics 3
        #1.gb "fill cyan ; backcolor yellow ; color yellow"
        #1.gb "place 100 200 ; boxfilled  350 250"
        #1.gb "place 100 200 ; circlefilled 50"
        #1.gb "place 350 200 ; circlefilled 50"
        #1.gb "backcolor cyan ; color yellow"
        #1.gb "place 200 170 ;\3"
    end if
 
    drawing=drawing+1
    if drawing=4 then drawing=1
 
    'now flush the graphics and store the segment
    'number in the variable seg
    #1.gb "flush seg"
 
    'The seg variable is catching the segment id and will
    'increase everytime through the loop

    'print the segment id number for info
    'note the name variable "seg" is for internal use.

    'to obtain and use the segment number in a variable
    'of your own, use segment variablename
    'this will provide the current segment number,
    'deduct one to get the true number of the last
    'flushed segment.
    #1.gb "segment currentsegmentnumber"
    lastflushed=currentsegmentnumber-1
    #1.tb "Seg ID:";lastflushed
    wait
    [quit]
    close #1
    end
 


Et en plus complexe-->: http://libertybasic.fr/forum/topic-496+dr-nim.php
____________________
Roro

   
Le 25/04/2020 à 17h02

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
"segment" permet de récupérer le numéro du segment en cours, je n'en ai pas trouvé l'utilité vu que je fournis au programme le nom du segment qu'on vient de terminer avec "flush NomDuSegment". Je n'ai pas essayé avec la version automatique, celle où le programme attribue lui-même les identifiants des segments.

Comme dans mon projet, il n'y a pas de raison de revenir absolument à la courbe d'avant, j'aurais en effet pu utiliser "delsegment" et relancer le calcul d'une courbe à afficher.

Pour la petite histoire, le but est de signaler à l'utilisateur que la colonne qu'il vient de choisir présente une anomalie, et qu'en conséquence on ne peut pas en afficher le graphe. Comme en cet instant le nom de la colonne sélectionnée ne correspond pas au graphe, il fallait faire disparaître, temporairement, le graphe.

Au moins j'ai commencé à apprivoiser flush et redraw...



Edité par Christophe Le 25/04/2020 à 17h03
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 25/04/2020 à 18h52

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2200
J'avoue ne pas être très à l'aise avec "segment" -->: http://libertybasic.fr/forum/topic-495+mikado.php
____________________
Roro

   
Le 26/04/2020 à 16h52

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 601
J'avais oublié ce post, nous avions donc déjà travaillé les segment/delsegment.

Mais au vu des programmes que j'ai pu trouver sur les forums, on dirait que peu de gens maîtrisent le procédé, et que la plupart se disent, dont moi, que ce n'est pas trois cercles et deux ligne qui vont saturer la mémoire, et que ce n'est pas la peine de se compliquer la vie à faire des segments...

Je suis en train de changer d'avis, car le fait de pouvoir afficher et cacher des pans de graphismes entier avec une seule instruction ouvre des perspectives intéressante. Et si en plus ça permet d'être carré dans la gestion de la mémoire, c'est top.

Un point que je ne savais pas, c'est que les variables qui sont utilisées avec segment, delsegment, redraw, flush... sont des variables dédiées : on ne peut pas s'en servir directement ou les modifier dans le programme. On peut juste récupérer leur valeur avec un #x.xx, "segment ";variable. Je n'ai pas fini de faire le tour du système, qui se révèle pas si compliqué que ça à étudier. j'ai eu beaucoup de mal au début, ce n'était pas expliqué de manière très claire ou je suis passé à côté.

a+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 27/04/2020 à 12h19

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2200
Tu es dans le vrai, c'est parce qu'on n'en voit pas bien l'utilité
J'avais fait une tentative sans trop savoir ce que je faisais ici-->: http://libertybasic.fr/forum/topic-116+mastermind-ok.php
____________________
Roro

   
Débutant » Flush, redraw, segment... gestion des graphismes pou essayer d'y voir un peu plus clair  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie