Représentation graphique en vb

Signaler
Messages postés
37
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
18 avril 2005
-
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
Bonjour tout le monde,

Apparement on peut représenter des points avec putp et des droites dans vb. Mais je n'ai pas très bien compris comment cela fonctionne.

J'aimerai faire la réprésentation d'une courbe avec abscisses et ordonnées graduées mais comment on fait pour se répérer car l'origine (0,0) des mes axes n'est pas le point 0 sur ma form.

Merci d'avance pour votre aide. :)

SEB

9 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
    Dim x  As Single
    Dim y  As Single
    Dim x0 As Integer
    Dim y0 As Integer
    
    x0 = 0
    y0 = (Sin(x0 / 30)) * 100
    Picture1.ScaleMode = 3
    For x = 1 To Picture1.ScaleWidth
        y = Picture1.ScaleHeight / 2 - (Sin(x / 30)) * 100
        Picture1.Line (x0, y0)-(x, y), vbBlack        x0 x: y0 y
        Next


Daniel
Messages postés
37
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
18 avril 2005

Merci pour ta réponse je comprends tout sauf ces deux lignes du code, tu pourrai me les commenter stp:

y = Picture1.ScaleHeight / 2 - (Sin(x / 30)) * 100
Picture1.Line (x0, y0)-(x, y), vbBlack

Merci beaucoup

SEB
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
comme le zéro se trouve en haut il faut faire une correction pour calculer l'ordonnée:

'ici l'axe des x est au milieu:
y = Picture1.ScaleHeight / 2 - ordonnée

'pour un axe des x en bas:
y = Picture1.ScaleHeight - ordonnée

ordonnée = (Sin(x / 30)) * 100
ça c'est la fonction que j'ai choisi pour exemple, pour que la courbe soit visible et occupe tout l'espace disponble, il faut prendre des unités adéquates, sin(x) était beaucoup trop petit.

Picture1.Line (x0, y0)-(x, y), vbBlack
j'ai fait une Ligne pour rejoindre le point calculé au point précédent, c'est pas très correcte, il faudrait lisser la courbe (il existe une Source qui fait cà dans Codes Sources) mais c'est déjà un peu plus joli qu'un simple Pset:
Picture1.Pset (x,y),vbBlack

Daniel
Messages postés
37
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
18 avril 2005

Merci beaucoup pour les commentaires. :)

Par contre Picture1.ScaleMode = 3 ça sert à quoi exactement ?

Sinon si je veux graduer mes axes x et y, quelle est la manière la plus simple à utiliser ?

SEB
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
ça met l'unité en Pixels (vbPixels) et non pas en Twips (vbTwips) qui est l'unité d'origine.
par exemple si 1 Twips vaut 15 Pixels j'aurais bouclé 15 fois sur le même Pixel ce qui aurait été une perte de temps inutile.
l'unité Pixel est celle qui convient pour l'écran, 1 Pixel = 1 point de l'écran.

    Dim Lx    As Integer
    Dim Ly    As Integer
    Dim i     As Integer
    Dim axe_X As Integer
    Dim axe_Y As Integer
    
    Picture1.ScaleMode = 3
    Lx = Picture1.ScaleWidth - 1
    Ly = Picture1.ScaleHeight - 1
    
'   axe des X  (y = 50)
    axe_X = Ly - 100
    Picture1.Line (0, axe_X)-(Lx, axe_X), vbRed
'   axe des Y  (x = 50)
    axe_Y = 50
    Picture1.Line (axe_Y, 0)-(axe_Y, Ly), vbRed
   
'graduations axe des X (1 unité = 30 pixels)
    For i = axe_Y To 0 Step -30
        Picture1.Line (i, axe_X - 2)-(i, axe_X + 2), vbRed
        Next
    For i = axe_Y To Lx Step 30
        Picture1.Line (i, axe_X - 2)-(i, axe_X + 2), vbRed
        Next

'graduations axe des Y (1 unité = 50 pixels)
    For i = axe_X To 0 Step -50
        Picture1.Line (axe_Y - 2, i)-(axe_Y + 2, i), vbRed
        Next
    For i = axe_X To Ly Step 50
        Picture1.Line (axe_Y - 2, i)-(axe_Y + 2, i), vbRed
        Next


Daniel
Messages postés
37
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
18 avril 2005

Encore merci à toi, j'ai une dernière question plutot simple, comment ça fonctionne et quelle est l'utilité de:

Picture1.ScaleMode = 3
Picture1.ScaleWidth ( ===> c pas comme: Picture1.Width)

Merci d'avance.

SEB
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
l'unité par défaut est le Twips.
la propriété ScaleMode n'existe que pour les containers (Forme, PictureBox, Frame, etc..) et modifie les mesures des controles qui sont à l'intérieur.
Ainsi les dimensions Width et Height de la Forme sera toujours en Twips, par contre les dimensions ScaleWidth et ScaleHeight dépendent de l'unité choisie.
la différence entre Width et ScaleWidth (qui sont pas forcément dans la même unité) dépendent du BorderStyle.
ScaleWidth et ScaleHeight représente la zone client c'est la partie utilisable, le reste c'est la bordure ou la barre du haut pour la Forme et n'est pas accessible.
Picture1.ScaleMode 3 et Picture1.ScaleMode vbPixels c'est la même chose.

les autres unités:
1 --> vbTwips
2 --> vbPoints
3 --> vbPixels
4 --> vbCharacters
5 --> vbInches
6 --> vbMillimeters
7 --> vbCentimeters

pour convertir les unités:
MsgBox "1 pixels = " & ScaleX(1, vbPixels, vbTwips) & " twips"

Daniel
Messages postés
37
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
18 avril 2005

Sinon j'aurai voulu savoir si il est possible de mettre du texte à coté des axes gradués ? :)



Merci d'avance.

Cordiallement Sébastien
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
il faut utiliser l'instruction Picture1.Print qui écrit à la position courante du curseur en coordonnées graphiques.
la position courante est 0,0 au départ et est modifiée par les instructions graphiques, aussi bien que par Print lui même.
exemples:

sans rien changer au programme précédent:
Dim g As Integer
g = 0
For i = axe_Y To Lx Step 30
Picture1.Line (i, axe_X - 2)-(i, axe_X + 2), vbRed
Picture1.Print g
g = g + 1
Next

en modifiant légèrement la position:
For i = axe_Y To Lx Step 30
Picture1.Line (i, axe_X - 2)-(i, axe_X + 2), vbRed
If g < 10 Then
Picture1.CurrentX = i - 6
Else
Picture1.CurrentX = i - 8
End If
Picture1.Print g
g = g + 1
Next

avec une autre couleur et une police plus petite:
Picture1.ForeColor = vbBlue
Picture1.FontName = "arial"
Picture1.FontSize = 6
For i = axe_Y To Lx Step 30
Picture1.Line (i, axe_X - 2)-(i, axe_X + 2), vbRed
If g < 10 Then
Picture1.CurrentX = i - 4
Else
Picture1.CurrentX = i - 6
End If
Picture1.Print g
g = g + 1
Next

Daniel