Vb.net 2008 graphique et courbe

Signaler
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
-
 katinka.89 -
Bonjour à tous,

j'ai conscience que ma question a déjà fait le sujet de plusieurs messages, et je m'en excuse.
J'utilise VB.NET 2008 depuis peu et je souhaiterais tracer une courbe à partir de valeurs que j'ai dans deux variables tableaux.
Par exemple:
                    Dim tabX( ) As Double   ' mon tableau de valeurs pour les abscisses
                    Dim tabY( ) As Double   ' tableau de valeurs pour les ordonnées
Ces tableaux sont déjà remplis.

J'aurais aussi voulu savoir quelles sont les options pour tracer plusieurs courbes sur le même graphique, de couleurs différentes, et surtout comment faire pour avoir une échelle logarithmique sur l'axe des abscisses.

Je vous remercie par avance, Ô grands Dieux du vb.net 2008

39 réponses

Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Bonjour,

Tu trouveras ton bonheur dans l'espace de nom System.Drawing.Drawing2D du framework, en passant par la classe Graphics, celle-ci dispose de méthode permettant de dessiner des lignes, des courbes et diverses formes géométriques..

C'est assez complexe pour le code, cela nécéssite que tu te documente... Je ne peux que te conseiller de rechercher sur google des informations sur les classes et méthodes suivantes :

La classe System.Drawing.Graphics avec les méthodes suivantes :

System.Drawing.Graphics.DrawArc
System.Drawing.Graphics.DrawCurve
System.Drawing.Graphics.DrawLine et System.Drawing.Graphics.DrawLines
System.Drawing.Graphics.DrawPath

La classe System.Drawing.Pen

Il me semble avoir vu des exemples de sources sur le site... fais une recherche à tout hazard.

Pour réaliser ton projet, tracer tes courbes et les échelles, passe par ces fonctions, elle te permetterons de déssiner sur une  form, un controle, ou dans une image...

Cordialement, Mayzz.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Merci Mayzz d'avoir répondu si rapidement

je m'étais déjà un peu orientée vers ces méthodes, mais j'avoue que ne sachant pas comment les utiliser, c'était un peu dur à comprendre.
Par exemple, pour System.Drawing.Graphics.DrawLines , cela demande un argument spécial (un truc qui ressemble à System.blabla.pointF mais je ne sais pas du tout ce que c'est.

Je continue mes recherches, je vous tiens au courant si j'ai trouvé, et/ou recontacte les membres du forum pour des questions
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Un PointF est tout simplement une instance de la Classe PointF qui représente un Point de localisation Flottant (Point Float)

Dim
X AsSingle 10.5, Y AsSingle 105.3

Dim PF
As
New PointF(X, Y)

En appelant la méthode DrawLines, tu peux donc dessiner une ligne en passant en paramètre à celle-ci un tableau de points (coordonnées). C'est aussi simple que cela.

Quant à l'argument "Pen" celui ci est une instance de la classe System.Drawing.Pen, via laquel tu décide, la couleur, l'épaisseur et la forme de ton trait (et bien d'autres paramètres).

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Du coup, je peux faire une boucle pour créer les pointF (pour chaque couple de case de mes tableaux , (500 valeurs dans chaque))
Et peut-être même y utiliser la methode DrawLines (dans la boucle) ?
je vais essayer , on va voir ce que ça donne ^^

ps: dois je faire un "imports" (du style, imports System.Drawing, etc...)
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
L'imports est une sorte de raccourcis pour n'avoir qu'a taper PointF au lieu de System.Drawing.PointF, tu peux faire l'import au niveau de ton formulaire ou du projet en lui même (dans ses proprétés), c'est facultatif (mais préférable), ce qui compte c'est d'avoir l'assemby System.Drawing chargé dans les références du projet.

Pour ta boucle oui, pour le taçage dans la boucle se sera Drawline et non DrawLines, ce dernier étant destiné au tracages d'une ligne de plusieurs points, ta boucle étant en cours, tu ne connais donc pas tous les points de destination (Tableau de points incomplet).

@+ Mayzz.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Bonjour Mayzz, et bonjour à tous les membres du forum :)
(Je préviens, le message qui suit est un peu long, car j'ai mis un bout de code.)
------------------------------------------------------------------------------

J’ai créé une Form que j’ai nommée Graphe.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??> 

tabX ( )  et  tabY( )  sont des tableaux de Double de taille 500 dans lesquels sont stockées mes valeurs.  Ces tableaux sont déjà remplis.

 

Dans ma Form « Graphe », j’ai mis une PictureBox pour avoir mon graphique à l’intérieur.

 

J’ai testé deux versions de code (une avec DraxLines, l’autre avec DrawLine), j’obtiens la même chose : un petit dessin bleu de 2cm maxi.

Soit le graphique est tout petit, dans ce cas il faut changer quelque chose dans les options, mais je ne sais pas comment faire.

Soit le graphique ne m’affiche que les premières valeurs (sur un total de 500), et je ne vois pas pourquoi.

 

Vos conseils et idées sont les bienvenus 
 

Code1 :

 

PublicClass Graphe

 

 

    PrivateSub Graphe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

 

        Dim newBitmap As Bitmap = New Bitmap(150, 150)

        Dim g As Graphics = Graphics.FromImage(newBitmap)

 

        Dim PF(499) As PointF

       ‘ je remplis mon tableau de pointF avec les valeurs de mes tableaux

        For i = 0 To 499
            Dim point AsNew PointF(CSng(tabX(i)), CSng(<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??><st1:city><st1:place>tabY</st1:place></st1:city>(i)))

            PF(i) = point

        Next

 

        g.DrawLines(Pens.Blue, PF)

        PictureBox1.Image = newBitmap

 

    EndSub

 

EndClass

 

 

<gras> Code2:  

 

PublicClass Graphe

 

    PrivateSub Graphe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

 

        Dim newBitmap As Bitmap = New Bitmap(150, 150)

        Dim g As Graphics = Graphics.FromImage(newBitmap)

 

        For i = 0 To 498

            g.DrawLine(Pens.Blue, CSng(tabX(i)), CSng(<st1:city><st1:place>tabY</st1:place></st1:city>(i)), _

                         CSng(tabX(i + 1)), CSng(<st1:city><st1:place>tabY</st1:place></st1:city>(i + 1)))

        Next

        PictureBox1.Image = newBitmap

 

    EndSub

 

EndClass
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Salut,

Ton code est bon (le premier est plus approprié), quelle sont les valeurs de tes tableaux ? Je te rappelle que ce doit être des coordonnées de point basé sur des axis de 0 à 150 (En rapport avec la taille de ta bitmap).

++ Mayzz.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
salut ,

Effectivement mon probleme d'affichage venait des valeurs de mes tableaux
   -  tabX contient des valeurs entre 0.1 et 50, par pas de 0.1 (d'où 500 valeurs)
   -  tabY contient des valeurs entre 0 et 10 (très souvent des décimales) 
Hier j'ai multiplié par 10 mes valeurs , et mon graphique est apparu avec une taille raisonnable (mais pas encore parfaite lol)
Je dois changer la taille de la bitmap?
De plus j'aimerais avoir une échelle logarithmique pour l'axe des abscisses , mais je n'ai pas trouvé l'option.

Cependant j'ai un nouveau problème dans l'affichage:
    -  la courbe commence en haut à gauche de ma PictureBox (alors que j'aurais préféré en bas à gauche, normal quoi! lol)
    -  je ne sais pas si c'est lié, mais ma courbe apparaît dans le sens inverse.
       Je m'explique:  normalement la variation de ma courbe devrait être   croissante // pic (en haut) // décroissante // stabilisation constante
       alors que là j'ai l'inverse, c'est-à-dire:       décroissante // pic(en bas) // croissante // stabilisation constante
      ( j'espere que j'ai été claire   )

J'ai tenté de voir dans les options de la PictureBox (en tapant le nom de la ma picturebox suivi d'un point, y'a une liste qui s'affiche) mais en vain

En tout cas tes conseils m'aident beaucoup, car lorsque je fais mes recherches en parallèle, je vois que je suis sur la bonne voie (et puis c'est mieux quand quelqu'un vous explique en direct, surtout quand on a des questions précises et chiantes comme les miennes! lol)
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Bonjour,

La picturebox n'a rien a voir avec cela, c'est un simple conteneur dans lequel tu y a placé une image sur laquel tu as préalablement déssiné ton graphique comme tu l'aurais fais manuellement avec paint. Il faut bien retenir que le carré de ta bitmap se présente comme ceci :

         0              150            
     0_|_________|_ 0
         |                  |
         |                  |
150 _|_________|_150
         |                  |
        0               150

Ainsi les valeurs de ton tableau ne doivents pas être dirrectement les valeurs de ton graphique, une petit inversion sera nécéssaire.

Pour ce qui est des axes, il faut les dessiner à la main, comme tu l'as fais pour le graphique, il n'y as aucune option pour cela.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
pwa ! la mise en forme...

       0        150            
     0_|_________|_ 0
       |         | 
       |         |
  150 _|_________|_150
       |         |
       0        150

Ca devrait peut être aller mieux la... ?

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
salut Mayzz,

je n'ai pas très bien compris la présentation de mon carré bitmap, 
je vois que tu as pris deux couleurs différentes pour ton dessin explicatif , à quoi cela correspond-il


pourrais-tu me donner, s'il te plait,  + de précisions


Pour dessiner les axes, faut-il passer par la DrawLine? Par exemple, soit g mon graphic, faire g.DrawLine... ou maPicturebox.Line ...
D'avance Merci
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
c'est encore moi!
je crois que je viens de comprendre :    l'axe "virtuel" des ordonnées se dirige vers le bas !
c'est ça ?
bon je vais tester et je te tiens au courant.
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Oui, exactement, les coordonnées des graphiques sont dans le sens de la lecture, soit de gauche à droite et de haut vers le bas...

Picturebox.Line n'existe plus en vb.Net, il faut passer par un objet graphics, soit tu dessine dans une bitmap, ce qui te donne une image dessiné, comme une bitmap avec paint, et de celle-ci tu fais ce que tu désire comme la placé dans un PictureBox, ou en background dans un contrôle, soit tu déssine directement dans un contrôle, mais tu devra redessiner à chaque fois que le contrôle sera rafraichi, pour cela tous les contrôles ont un événement Paint, passant en paramètre un objet graphics.

Si tu cherche à faire un graphique, le plus approprié serait de créer un contrôle personnalisé dans lequel tu va déssiner ton graphique, par rapport à sa taille,
Ton tableau de points devrat être convertis par rapport à la largeur et à la hauteur (au lieu d'une bitmap de 150 x 150) de ce contrôle puis inversé, de cette façon tu auras un contrôle te permettant de dessiner un graphic, peu importe sa taille.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Encore moi !!!

j'ai beau testé , et je suis sûre que la solution est là devant mon nez, mais je n'arrive pas à effectuer la "petite inversion" dont tu as parlé tout à l'heure.
j'ai tenté d'inverser la place entre les X et Y, ou encore de multiplier les valeurs de mon tabY par -1 pour aller dans l'autre sens,.... mais en vain!!
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
c'est simple,

Exemple : Soit le Point z = (100; 10)

z.Y = Img.Height - Y Soit z.Y 150 -10 = 140

Après inversion on obtient le poin z (100; 140)

Ce qui inverse les coordonnées de bas en haut.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
t'es trop fort! merci !
je vais faire cela de ce pas  !
j'aurais sûrement d'autres question plus tard
de toutes façons ,je te tiens au courant quand mon projet de graphique sera fini (là ce n'est que le début, chaque chose en son temps)
je posterais un imprime-écran !!! lol
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Encore moi !!! lol

J'ai fait comme tu m'as dit, et maintenant j'ai mon graphique dans le bon sens , je suis contente :)

Une autre question: j'ai donc utilisé DrawLines (cf. code1 dans un précédent post) et il me relie les deux extrêmités (par exemple le point0 avec le point499, vu que j'ai 500 valeurs)
Y'a-t-il un moyen d'éviter cela , ou bien dois-je me résigner à utiliser DrawLine (comme dans code2 d'un précédent post)
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
As-tu bien vérifié tes points ? DrawLines ne relie pas le 1er et le dernier point, car c'est le rôle de la fonction DrawPolygon, tu as du faire une erreur lors du remplissage de tes tableaux de coordonnées.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
45
Date d'inscription
mardi 14 avril 2009
Statut
Membre
Dernière intervention
29 mars 2012
1
Salut,

Pour tracer l'axe des ordonnées, j'ai fait:
         g.DrawLine(Pens.Black, 0, 0, 0, momBitmap.Height)      no problem!
Pour l'axe des abscisses, j'ai fait :
       g.DrawLine(Pens.Black,  0, momBitmap.Height, monBitmap.Width, monBitmap.Height)
et ce dernier n'apparaît pas.

Sachant que le bitmap (appelé monBitmap), dans lequel s'affiche mon graphique g, est plus petit que la picturebox (appelée maPicturebox)
Je ne devrais pas avoir de soucis puisque monBitmap.Width <maPicturebox.Width et que monBitmap.Height < maPicturebox.Height

Enfin ,je crois...

Je me demandais aussi comment afficher du texte pour donner la définition de l'axe des ordonnées (texte écrit dans le sens de l'axe des Y) ?
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
En théorie c'est :

g.DrawLine(Pens.Black, 0, 0, 0, momBitmap.Height - 1)

g.DrawLine(Pens.Black,  0, momBitmap.Height - 1, monBitmap.Width - 1, monBitmap.Height - 1)

Voila ;O) comme ca je pense que ca ira mieu ! 

@+
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <