Gambas France BETA


Pas de compte ? Incription

Exemple 12 :

Faire un graphique :


Un exemple téléchargeable sur la forge de Gambas nous servira de base : Graphique

Nous utilisons une form avec un DrawingArea qui occupe toute la form.

Les principales propriétés du DrawingArea sont ici :


Arrangement = Fill <---------------------- pour que la zone dessin remplisse toute la surface octroyée par la form
Autoresize = True
Background = SoftOrange
Border = Plain
Cached = True <------------------------- le mode tamponné : cached
...
Expand = True

Ce qui donne ceci dans l'IDE :






Création d'une trame de fond avec le zonage du graphique :



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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
PUBLIC SUB TrameFond() 'tracé trame de fond

DIM xx1 AS SINGLE
DIM x2, y1, y2, fx, v AS SINGLE
DIM scaleX, scaleY AS SINGLE
DIM larg AS SINGLE
DIM haut AS SINGLE
' La définition de ce zonage est le plus difficile dans ce type de projet
' Ne pas hésiter à prendre une feuille de papier et dessiner ce que vous voulez obtenir
' puis définissez votre zonage
' en déterminant l'ensemble des coordonnées de la zone
'--------------- Zonage -------------------- Tout le zonage est en single (ce sont des points que nous allons dessiner)
x2 = CSingle(Log10(300)) '<------------------- largeur de la zone (300Hz)
xx1 = CSingle(Log10(10)) '<------------------- origine en largeur (10Hz)
y2 = CSingle(Log10(0.000000001)) '<----------- hauteur de la zone
y1 = CSingle(Log10(1000000000)) '<------------ origine en hauteur
haut = CSingle(DrawingArea1.Height) '<-------- hauteur de DrawingArea
larg = CSingle(DrawingArea1.Width) '<--------- largeur de DrawingArea
scaleX = CSingle((larg) / (x2 - xx1)) '<------ échelle en largeur (tout est relatif)
scaleY = CSingle((haut) / (y2 - y1)) '<------- échelle en hauteur (tout est relatif)
'--------------------------------------------
WITH Draw '<---------------------------------------------------------------- on définit le dessin
.Foreground = Color.Blue '<--------------------------------------------- les lignes bleues
.Line(0, haut / 6, larg, haut / 6)
.Line(0, haut / 3, larg, haut / 3)
.Line(0, haut * 2 / 3, larg, haut * 2 / 3)
.Line(0, haut * 5 / 6, larg, haut * 5 / 6)
.Foreground = Color.Lighter(Color.DarkCyan) '<------------------------- les lignes cyan foncé
.Line(0, haut * 7 / 18, larg, haut * 7 / 18)
.Line(0, haut * 8 / 18, larg, haut * 8 / 18)
.Line(0, haut * 10 / 18, larg, haut * 10 / 18)
.Line(0, haut * 11 / 18, larg, haut * 11 / 18)
.Foreground = Color.DarkGreen '<---------------------------------------- le texte en vert foncé
.Text(" +6db", 0, haut / 6)
.Text(" +3db", 0, haut / 3)
.Text(" 0db", 0, haut / 2)
.Text(" -3db", 0, haut * 2 / 3)
.Text(" -6db", 0, haut * 5 / 6)
FOR fx = 20 TO 100 STEP 10 '<------------------------------------------ les fréquences de 20Hz à 100Hz tous les 10Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale variant avec la valeur de fx (plus exactement de son Log)
.Text(Format((fx), "0#"), v, haut * 16 / 18) '<-------------------- le texte à la position voulue
NEXT
.Foreground = Color.DarkGreen '<---------------------------------------- lignes verticales désignant les fréquences de 20Hz à 200Hz tous les 5Hz
FOR fx = 20 TO 200 STEP 5 '
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Line(v, y2, v, haut) '<------------------------------------------- tracé de la ligne
NEXT
FOR fx = 110 TO 300 STEP 10 '<----------------------------------------- lignes verticales désignant les fréquences de 110Hz à 300Hz tous les 10Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Line(v, y2, v, haut) '<------------------------------------------- tracé de la ligne
NEXT
FOR fx = 150 TO 250 STEP 50 '<----------------------------------------- le texte de 150Hz à 250hz au pas de 50Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Text(Format((fx), "0#"), v, haut * 16 / 18)
NEXT
FOR fx = 25 TO 35 STEP 10 '<-------------------------------------------- le texte de 25Hz à 35Hz au pas de 10Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Text(Format((fx), "0#"), v, haut * 16 / 18)
NEXT
FOR fx = 20 TO 100 STEP 10 'to 50 '<------------------------------------ le texte de 20Hz à 100Hz au pas de 10Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Text(Format((fx / (fr / qt)), "0.0"), v, haut * 17 / 18)
NEXT
FOR fx = 150 TO 250 STEP 50 '<------------------------------------------ le texte de 150Hz à 250Hz au pas de 50Hz
v = CSingle((Log(fx) / Log(10) - xx1) * scaleX) '<----------------- position horizontale
.Text(Format((fx / (fr / qt)), "0.0"), v, haut * 17 / 18)
NEXT
v = CSingle((Log10(10.125) - xx1) * scaleX) ' <------------------------ position horizontale
.Text(("Fréquences :", v, haut * 16 / 18) '<-------------------------- texte (position Horizontale, position Verticale)
.Text(("Fréquences Normalisées" v, haut * 17 / 18) '<---------------- idem
'------- cadre rouge --------------------
v = CSingle((Log(fr) / Log(10) - xx1) * scaleX) '<--------------------- position horizontale
.Foreground = Color.Red '<--------------------------------------------- la couleur
.Line(v, haut / 6, v, haut * 5 / 6) '<--------------------------------- ligne verticale
.Line(0, haut / 2, larg, haut / 2) '<---------------------------------- ligne horizontale
.Rect(v - larg / 6, haut / 3.5, larg / 3, haut / 2.325) '<------------- rectangle centré en FR
.Text("FR", v, haut / 20 * 1.25) '<------------------------------------ le texte
.Text(Format((fr), "###"), v, haut / 20 * 1.75) '<--------------------- la valeur de Fr en texte
'----------------------------------------
END WITH '<---------------------------------------------------------------- fin de la définition du dessin

END

Zonage :


Le point origine (0,0) doit être défini en premier pour que l'on sache d'où l'on part.

Notre dessin quel-qu'il soit, doit rester dans cette zone sinon notre zonage n'est pas bon.

l'évènement Draw qui va dessiner la trame de fond ainsi que les courbes voulues :


1
2
3
4
5
6
7
8
9
10
11
12
PUBLIC SUB DrawingArea1_Draw()

DIM i AS INTEGER
'------------ l'évènement dessin ------------
i = 0
Draw.Begin(DrawingArea1) 'on commence le dessin
TrameFond() 'on dessine la trame (voir la définition de la trame au dessus)
courbes(i + 1) 'on dessine les courbes (voir la définition dans le code de l'exemple)
Draw.end 'on finit le dessin
'--------------------------------------------

END


Ce que cela donne, le programme étant lancé :


L'échelle utilisée, ici, est logarithmique et non linéaire.


Le plus intéressant ici est la conservation de nos graphiques quelques soient les dimensions de la Form :
Grâce à l'évènement Resize :
1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB Form_Resize()

'-- cette partie peut être réactivée pour tester --
' DrawingArea1.Clear
' Draw.Begin(DrawingArea1)
' TrameFond()
' Draw.end
'--------- et la suivante commentée ---------------
mnuVAB_Click()

END

Le dessin des courbes :


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
PUBLIC SUB mnuVAB_Click()

DIM i, p AS INTEGER

DrawingArea1.Clear 'on efface la zone
Draw.Begin(DrawingArea1) 'on commence le dessin
TrameFond() 'on dessine la trame

FOR p = 0 TO 6 'les sept différentes courbes qu'on va obtenir
qb = bta ^ 4
qes = 1 / bta ^ (-4)
SELECT CASE p
CASE 0
z1 = Bta ^ -2
CASE 1
z1 = Bta ^ -1.5
CASE 2
z1 = Bta ^ -1
CASE 3
z1 = Bta ^ -0.5
CASE 4
z1 = Bta ^ 0
CASE 5
z1 = Bta ^ 0.5
CASE 6
z1 = Bta ^ 1
END SELECT
qts = qtd * Sqr(z1 / (qb * qes))
CalculsHP()
CalculsEnc()
increment = p + 1.25
i += 1
courbes(i) 'on dessine les courbes, une par une
NEXT
Draw.end 'on finit le dessin

END


====================



====================

Navigation :



<-- Liens du Wiki : <--
<-- Accueil du WIKI : <--
<-- États de sortie <--

====================

Documentation :



====================