IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[Lablgtk2 + Ocaml] Tracé de points


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 31
    Points
    31
    Par défaut [Lablgtk2 + Ocaml] Tracé de points
    Bonjour,


    j'utilise Ocaml depuis quelques temps pour représenter un nuage de points avec son maillage par triangulation de Delaunay.

    Pour cela, j'utilise les classiques lineto, moveto, plot, etc.

    J'utilise depuis peu Lablgtk2 et malgré les tutoriaux, je n'ai pas bien compris comment je pourrais faire la même chose avec lablgtk2, à savoir placer des points, tracer des traits, effacer une partie de l'écran, etc.

    J'aurais pensé utiliser GMisc.drawing_area, mais si c'est le cas, comment ensuite placer des points et segments dessus?

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    regarde dans les exemples de code fournis avec LablGtk.

    voir aussi introduction_to_gtk

    à l'aide de ce code
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let da = GMisc.drawing_area ~packing:vbox#add () in
    let drawable = new GDraw.drawable da#misc#window in
    ...
    tu obtiens un objet GDraw.drawable, tu trace points et lignes à l'aide des méthodes drawable#point et drawable#line.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Encore désolé, mais après avoir lu les tutoriaux en question, je n'ai toujours pas bien compris.

    Je dois d'abord créer un GDraw.drawing_area, qui contiendra un GDraw.drawable, et c'est dans le drawable que je finirai par tracer?

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour !

    Le widget GMisc.drawing_area n'est qu'une zone de dessin (comparable à la fenêtre qui s'affiche avec Graphics.open_graph). En général on effectue tous les tracés en arrière-plan dans un widget GDraw.pixmap (double buffering) grâce à GDraw.drawable qui est la boîte à outils pour les dessins. Il faut ensuite ajouter les événements adéquats pour maintenir l'affichage propre en cas de superposition de fenêtres. Voici deux liens qui devraient t'aider :


    N'hésite pas à demander si tu as des questions précises.

    Cordialement,
    Cacophrène

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Je suis vraiment désolé hein c'est nouveau pour moi...

    Donc si je récapitule, en tentant de comparer par rapport à Ocaml

    On a le GMisc.drawing_area qui est à peu près comme la fenêtre d'open_graph.

    On a ensuite GDraw.pixmap qui permet de tracer comme dans ocaml avant de faire syncronize ();

    La commande plot est remplacée par la méthode point et lineto est remplacée par la méthode line et il faut les utiliser avec un GDraw.drawable?

    Si oui, j'aimerais tracer un point rouge, et tracer une ligne rouge aussi.

    Voici ce que j'ai mis dans mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      let graphique = GMisc.drawing_area ~packing: content#add () ~width:700 ~height:700 in
    	let fenetre = new GDraw.drawable graphique#misc#window in
    	let buffer = ref (GDraw.pixmap ~width:700 ~height:700 ()) in
    	!buffer#set_foreground (`NAME "red");
    	!buffer#line ~x:300 ~y:300 ~x:600 ~y:600;
    	!buffer#point ~x:400 ~y:400;
    J'ai pas encore compris comment faire l'équivalent d'un syncronize, mais si j'ai pigé le reste, là j'ai placé un point et une ligne dans mon écran en attente d'être tracé?

    Seul bémol, quand je lance mon programme après l'avoir compilé, j'ai une FATAL ERROR:
    exception Gpointer.Null

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je te conseille de te renseigner sur le projet plplot.

  7. #7
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour !

    Je ne comprends pas ce qui n'est pas clair dans le tutoriel LablGTK :

    Citation Envoyé par Tutoriel LablGTK - GMisc.drawing_area
    The widget we use for this is the DrawingArea widget. A drawing area widget is essentially an X window and nothing more. It is a blank canvas in which we can draw whatever we like
    Citation Envoyé par Tutoriel LablGTK - GDraw.pixemap
    It should be noted that when we create a DrawingArea widget, we are completely responsible for drawing the contents. If our window is obscured then uncovered, we get an exposure event and must redraw what was previously hidden.
    Having to remember everything that was drawn on the screen so we can properly redraw it can, to say the least, be a nuisance. In addition, it can be visually distracting if portions of the window are cleared, then redrawn step by step. The solution to this problem is to use an offscreen backing pixmap. Instead of drawing directly to the screen, we draw to an image stored in server memory but not displayed, then when the image changes or new portions of the image are displayed, we copy the relevant portions onto the screen.
    Un exemple de code vite fait mal fait (je n'ai pas le temps de détailler plus ici; regarde la documentation pour la gestion des événements) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    (* drawing.ml 
     * ocamlopt -w s -I +lablgtk2 lablgtk.cmxa drawing.ml -o drawing && ./drawing
     *)
    
    let _ = GMain.init ()
    
    let width = 200
    let height = 200
    
    let window =
      let wnd = GWindow.window
        ~title:"Drawing demo"
        ~width ~height
        ~position:`CENTER 
        ~resizable:false () in
      wnd#connect#destroy GMain.quit;
      wnd
    
    let vbox = GPack.vbox ~spacing:5 ~packing:window#add ()
    
    (* Zone de dessin visible à l'écran. *)
    let area = GMisc.drawing_area ~packing:vbox#add ()
    
    (* Tracé en arrière-plan. *)
    let back = GDraw.pixmap ~width ~height ()
    
    (* Boîte à outils pour le dessin. *)
    let drawing = 
      area#misc#realize (); (* Sans cette ligne -> exception Gpointer.Null *)
      new GDraw.drawable area#misc#window
    
    let set_red () =
      back#set_foreground (`NAME "#ff0000");
      back#rectangle ~x:0 ~y:0 ~width ~height ~filled:true ();
      drawing#put_pixmap ~x:0 ~y:0 back#pixmap
    
    let draw = 
      let btn = GButton.button 
        ~label:"Rouge !" 
        ~packing:(vbox#pack ~expand:false) () in
      btn#connect#clicked set_red;
      btn
    
    let _ =
      window#show ();
      GMain.main ()
    Cordialement,
    Cacophrène

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Merci pour ton code, les commentaires m'ont permis de mieux comprendre le principe!

    Merci pour votre aide en tout cas!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tracé de points
    Par sinchi sinchi dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 16/04/2014, 21h16
  2. Tracé de points dans l'espace
    Par bendesarts dans le forum MATLAB
    Réponses: 3
    Dernier message: 25/03/2013, 09h25
  3. [Débutant] tracé de points et couleur
    Par tenderstoune dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/07/2010, 21h45
  4. Tracé de points
    Par sebmord dans le forum Débuter
    Réponses: 3
    Dernier message: 05/03/2009, 10h27
  5. [OCaml] Points sur une colonne
    Par desert_fenec dans le forum Caml
    Réponses: 4
    Dernier message: 05/02/2007, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo