bas de la zone d’affichage, à l’endroit du Y=0 mathématique.
Les considérations précédentes à propos de la programmation de tracés de fonctions mathématiques, ont mis en évidence des outils utiles pour la détermination des valeurs de X.
Il faut maintenant calculer le facteur d'amplitude de Y et la formule de sa représentation compte tenu de l'inversion de l'axe des Y.
0
Height
YMax
YMin
Facteur d'amplitude : FacteurY
La fonction calcule un Y à représenter à
l'écran L'écran doit positionner
un Y' en rapport avec le résultat de la fonction Ha u te u r Nb V a le u rY Y Y'
Le facteur d'amplitude est le rapport d'échelle entre la plage de pixels verticaux et la plage des Y calculés, soit
FacteurY = Hauteur / NbValeurY. Il faut donc calculer NbValeurY et, en procédant comme pour la plage des X, on obtient la formule NbValeurY = |YMax - YMin| + 1.
Pour la position à l'écran de la valeur de Y ajustée par son facteur d'amplitude, il faut encore corriger l'erreur induite par l'inversion de l'axe Y.
Puisque le facteur d'amplitude garantit une représentation de chaque Y' proportionnelle à la valeur Y correspondante, on peut écrire :
( Hauteur - Y' ) / Hauteur = | YMin - Y | / NbValeurY
( Hauteur - Y' ) = | YMin - Y | / NbValeurY * Hauteur ( Hauteur - Y' ) = | YMin - Y | * Hauteur / NbValeurY ( Hauteur - Y' ) = | YMin - Y | * FacteurY
- Y' = | YMin - Y | * FacteurY - Hauteur
Y' = Hauteur - | YMin - Y | * FacteurY
Comme réalisé dans cette dernière formule, la valeur de chaque Y calculé doit être convertie en distance par rapport à YMin, cette distance doit subir le facteur d'amplitude et le résultat doit être soustrait de la coordonnée Y du bas de la plage graphique pour donner la position de Y' sur cette plage.
Enfin, pour finaliser ces formules, il faut encore déterminer les valeurs extrêmes de Y. Pour cela, le plus simple est de calculer toutes les valeurs de Y compte tenu du pas d'échantillonnage des valeurs de X et d'attraper au passage le plus petit et le plus grand des résultats.
YMin = Fonction(XMin) ' Supposons que f(XMin) donne le plus petit Y
YMax = Fonction(XMax) ' Supposons que f(XMax) donne le plus grand Y
For X = XMin To XMax Step PasX ' Echantillonnge des X au pas de PasX
Y = Fonction(X) ' Calcul de l'Y correpondant
If Y < YMin Then YMin = Y ' Si un Y est plus petit, on change
If Y > YMax Then YMax = Y ' Si un Y est plus grand, on change
Next
Il faut encore savoir si le tracé des axes X et Y est opportun. La présence de l'axe X est utile si la valeur 0 existe dans la plage des Y et celle de l'axe Y est utile si la valeur 0 existe dans la plage des X. Dans un cas comme dans l'autre, le produit des valeurs extrêmes donne un résultat négatif si la valeur 0 existe. Presque tous les ingrédients sont en place :
NbValeurX = |XMax - Xmin| + 1 ' Plage des X
PasX = NbValeurX / Largeur ' Pas d'échantillonnage des X. ' Largeur correspond à Width
NbValeurY = |YMax - YMin| + 1 ' Plage des Y
FacteurY = Hauteur / NbValeurY ' Facteur d'amplitude des Y ' Hauteur correspond à Height
Y' = Hauteur - | YMin - Y | * FacteurY ' Y' est la position de Y à l'écran.
If XMin * XMax < 0 Then … ' Tracer l'axe Y à l'écran.
Le dessin à l'écran se réalise à l'aide de segments de droite. Les coordonnées de départ du premier segment sont données par XMin et f(XMin), les coordonnées de l'extrémité de ce segment sont données par XMin + PasX et f(XMin + PasX). Ces coordonnées de l'extrémité du premier segment deviennent ensuite celles de départ du segment suivant. Ce processus est répété jusqu'à la fin du dernier segment.
Dans le programme suivant, la fonction utilisée pour l'exemple est Y = Sinus(X). Elle est enfermée à l'intérieur d'une fonction nommée Fonction. L'utilisateur qui souhaite expérimenter une autre fonction doit en écrire le code à l'intérieur de Fonction et poser des bornes XMin et XMax cohérentes.
Dans cet exemple, l’espace graphique utilisé est la surface d’un Panel de 400 pixels sur 400, nommé Graphe.
Imports System.Drawing ' Pour disposer de la classe Graphics
Imports System.Math ' Pour disposer de Pi, Sin() et Abs()
Private Function Fonction(ByVal x As Single) As Single Return Sin(x)
End Function
Dim MG As Graphics
Dim NbValeurX, NbValeurY As Single ' Les plages de valeurs
Dim XMin, XMax, YMin, YMax as Single ' Les valeurs extrêmes
Dim PasX, FacteurY As Single ' Pas et facteur
Dim X, Y As Single ' Le nécessaire au calcul
Dim Xe, Largeur, Hauteur As Single ' Comptage des X "écran" et nombres de pixels
Dim XDepart, YDepart As Single ' Coordonnées de départ à l'écran
Dim XEcran, YEcran As Single ' Coordonnées de l'extrémité du segment
Dim XEcrPrec, YEcrPrec As Single ' Coordonnées du début du segment suivant
Graphe.BackColor = Drawing.Color.White ' Pour dessiner sur fond blanc
Graphe.Refresh() ' Obliger le form à se redessiner
MG = Graphe.CreateGraphics() ' Instanciation de l'objet Graphics
' Position et dimensions du tracé avec une marge de 5 pixels tout autour
XDepart = 5
Largeur = Graphe.Width - 10 YDepart = Graphe.Height - 5 Hauteur = Graphe.Height - 10
' Limites des X (idéalement à encoder par l'utilisateur)
XMin = -2 * PI XMax = 2 * PI
' Mettre les bornes dans le bon ordre (en cas de mauvais encodage)
If XMin > XMax Then Dim tmp As Single tmp = XMin
XMin = XMax XMax = tmp End If
' Nombre d'unités de la plage des X
NbValeurX = Abs(XMax - XMin) + 1
' Calcul du pas d’échantillonnage des X
PasX = NbValeurX / Largeur
' Limites des Y
YMin = Fonction(XMin) YMax = Fonction(XMax)
For X = XMin To XMax Step PasX Y = Fonction(X)
If Y < YMin Then YMin = Y If Y > YMax Then YMax = Y Next
' Nombre d'unités de la plage des Y
NbValeurY = Abs(YMax - YMin) + 1
' Calcul du facteur d'amplitude pour Y
FacteurY = Hauteur / NbValeurY
' Tracer de l'axe Y si 0 entre XMin et XMax (en noir)
If XMin * XMax < 0 Then
XEcran = XDepart + Largeur * Abs(XMin) / NbValeurX
MG.DrawLine(Drawing.Pens.Black, XEcran, YDepart, XEcran, YDepart - Hauteur) End If
' Tracer de l'axe X si 0 entre YMin et YMax (en noir)
If YMin * YMax < 0 Then
YEcran = YDepart - Abs(YMin) * FacteurY
MG.DrawLine(Drawing.Pens.Black, XDepart, YEcran, XDepart + Largeur, YEcran) End If
' Tracer le graphe (en bleu)
X = XMin
Y = Fonction(X) XEcrPrec = XDepart
YEcrPrec = YDepart - Abs(YMin - Y) * FacteurY ' YDepart correspond à Height,
For Xe = 1 To Largeur ' donc à Hauteur (à la marge près)
X = X + PasX Y = Fonction(X)
XEcran = XDepart + Xe
YEcran = YDepart - Abs(YMin - Y) * FacteurY
MG.DrawLine(Drawing.Pens.Blue, XEcrPrec, YEcrPrec, XEcran, YEcran) XEcrPrec = XEcran
YEcrPrec = YEcran Next