• Aucun résultat trouvé

Y Une valeur Y = 0 donne Y’ = Height – 0, soit Height, et cette valeur est bien représentée en

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