ifproject - implémentation d'un Web Service financier et du client J2ME correspondant
Le traçage des courbes

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

1) à partir des valeurs à afficher, on calcule les valeurs minimum et maximum que prennent ces valeurs. Dans notre code, c’est la méthode getBorneCours() qui s’en charge.
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;

}
2) Cela permet de calculer les unités du graphique en pixels (ie à combien de pixels équivaut la valeur 1) :
a. Horizontalement, u, se calcule selon le nombre de valeurs à afficher et la largeur de la zone de traçage.

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)

3) Ainsi, dans un système cartésien standard (x > 0 vers la droite, y >0 vers le haut) si l’on souhaite afficher le point (X, Y) = (n*i, Y), il aura les coordonnées

X’ = n*i*u

Y’ = (Y-Ymin)*v

4) Il faut ensuite tenir compte des différences entre le système de repère cartésien utilisé pour la représentation mathématique de courbe et le système de coordonnées utilisée par Java pour le dessin (x > 0 vers la droite, mais y > 0 vers le bas)

En substance cela s’effectue en faisant la transformation suivante (voir graphique ci-dessous) :

X = X’

Y = -Y’ + H

reperes

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);
	}

 
  • <<
  •  
  • >>