Les valeurs que l’on désire visualiser sous forme de courbe sont données sous la forme d’un tableau de nombres de la forme valeur[i] avec i = 0…N-1
private double[] getBornesCours(double[] val){
int nbreVal = val.length;
double min = val[0], max = val[0];
for(int i = 0; i < nbreVal; i++){
if(val[i]<= min) min = val[i];
if(val[i]>= max) max = val[i];
}
double[] bornes = {min, max};
return bornes;
}
Pour N points, et une largeur de graphique L (en pixels) :
u = L / (N-1)
b. Verticalement, v, se calcule en fonction des valeurs minimum que l’on souhaite afficher et des valeurs et de la hauteur effective de la zone de traçage.
Si on souhaite afficher des valeurs comprises entre Ymin et Ymax dans une zone de traçage de hauteur H (en pixels),
v = H / (Vmax-Vmin)
X’ = n*i*u
Y’ = (Y-Ymin)*v
En substance cela s’effectue en faisant la transformation suivante (voir graphique ci-dessous) :
X = X’
Y = -Y’ + H
Soit finalement les coordonnées de chacun des points de la forme (i, valeur[i]) dans le repère propre à Java sont :
X = i*u = i * L / (N-1)
Y = -(Y-Ymin)*v + H = -H*(Y-Ymin) / (Ymax-Ymin) + H
Pour tracer la courbe, il faut afficher chacun de ces points pour i = 0 … N-1 et les relier entre eux.
C’est ce qu’accomplit le bout de code ci-dessous :
/////////////////////////////////
// dessin de la courbe des cours
N = cours.length;
double[] valeursCours = cours;
double[] bornesCours = this.getBornesCours(valeursCours);
// calcul des valeurs des valeurs limites affichées
this.valGraphMax = bornesCours[1] + 0.1*(bornesCours[1] - bornesCours[0]);
this.valGraphMin = bornesCours[0] - 0.1*(bornesCours[1] - bornesCours[1]); bornesCours[0]);
// calcul des unités
double deltaCours = valGraphMax - valGraphMin;
double u1 = wg/(N-1);
double v1 = hg1/deltaCours;
g.setColor(0, 0, 255);
for(int i = 0; i < N-1; i++){
int x1 = (int)(marge + i*u1);
int y1 = - (int)((valeursCours[i]-valGraphMin)*v1) + marge + (int)hg1 ;
int x2 = (int) (marge + ((i+1)*u1));
int y2 = - (int)((valeursCours[i+1]-valGraphMin)*v1) + marge + (int)hg1 ;
g.drawLine(x1, y1, x2, y2);
}