© Sofia ZAIDENBERGCNRS Mai Interfaces Graphiques Tracer une fonction y = f(x) avec JAVA 2D
© Sofia ZAIDENBERGCNRS Mai Java 2D Afficher la courbe d’une fonction dans un fenêtre (un JPanel ou un JComponent ) y x Espace utilisateur (« World Coordinate System ») Espace écran : (« Device Coordinate System ») F(x) = sin(x) x y Réel Non borné Entier Borné
© Sofia ZAIDENBERGCNRS Mai Java 2D Afficher la courbe d’une fonction dans une fenêtre (un JPanel ou un JComponent ) y x x y 1 Définir la région de l’espace utilisateur à afficher 2 Appliquer au coordonnées exprimées dans WCS une transformation vers DCS Espace utilisateur (« World Coordinate System ») F(x) = sin(x) Réel Non borné Espace écran : (« Device Coordinate System ») Entier Borné
© Sofia ZAIDENBERGCNRS Mai Java 2D l Définir la région de l'espace utilisateur à afficher y x x y xWmin yWmin xWmax yWmax.. Définition d’une fenêtre dans l’espace utilisateur : XWmin, YWmin coordonnées dans WCS du coin inférieur gauche de la fenêtre XWmax,YWmax coordonnées dans WCS du coin supérieur droit de la fenêtre WCS DCS
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation coordonnées WCS coordonnées DCS y x x y xWmin yWmin xWmax yWmax.... xw yw xd yd xw yw = T T dépend de xWin, yWmin, xWmax, yWmax et de ld (largeur) et hd (hauteur) de la région d’affichage ld hd WCS DCS
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation coordonnées WCS coordonnées DCS y x x y xWmin yWmin xWmax yWmax.... xw yw xd yd xw yw = T ld hd WCS DCS.. xWmin yWmin 0 hd T xWmax yWmax ld 0 T
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation coordonnées WCS coordonnées DCS y x x y xWmin yWmin xWmax yWmax.... xw yw xd yd xw yw = T ld hd WCS DCS xw - xWmin lw xd ld = Les proportions doivent être conservées : La position relative de (xd,yd) par rapport à la région d’affichage doit être la même que la position relative de (xw,xw) par rapport à la fenêtre utilisateur yd hd yWmax - yw hw = hw =(yWmax – yWmin) lw =(xWmax – xWmin)
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation coordonnées WCS coordonnées DCS y x x y xWmin yWmin xWmax yWmax.... xw yw xd yd xw yw = T ld hd WCS DCS xd ld xw - xWmin lw = yd hd yWmax - yw hw = xd = xw * - xWmin * ld lw hd hw yd = - yw * + yWmax * hd hw homothétie translation ld lw hd hw ld lw - xWmin * hd hw yWmax * xw yw 1 xd yd 1 = * T
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation coordonnées WCS coordonnées DCS y x x y xWmin yWmin xWmax yWmax.... xw yw xd yd ld hd WCS DCS.. ld lw hd hw ld lw - xWmin * hd hw yWmax * xWmin yWmin 1 0 hd 1 = * ld lw hd hw ld lw - xWmin * hd hw yWmax * ld 0 1 = xWmax yWmax 1 *
© Sofia ZAIDENBERGCNRS Mai Java 2D l Transformation WCS DCS : prise en charge par Java2D public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; int ld = this.getWidth(); int hd = this.getEight(); double lw = xWmax - xWmin;... double m00 = ld / lw;... AffineTransform t = new AffineTransform( m00,0.0,0.0, m11,m02,m12); g2.transform(t);... g2.setStroke(new BasicStroke(0.0f));... g2.draw(aShape); } ld lw hd hw ld lw - xWmin * hd hw yWmax * xw yw 1 xd yd 1 = * T [ x'] = [ m00 m01 m02 ] [ x ] = [ m00x + m01y + m02 ] [ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] [ 1 ] = [ ] [ 1 ] = [ 1 ] T définie par un objet java.awt.AffineTransform Cette transformation est combinée à la transformation courante maintenue par le contexte graphique Les coordonnées des primitives graphiques (« Shape ») sont ensuite exprimées dans WCS et seront automatiquement transformée lors du rendu.
© Sofia ZAIDENBERGCNRS Mai Java 2D public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; int ld = this.getWidth(); int hd = this.getWidth(); double lw = xWmax - xWmin;... double m00 = ld / lw;... AffineTransform t = new AffineTransform( m00,0.0,0.0, m11,m02,m12); g2.transform(t); g2.setStroke(new BasicStroke(0.0f)); } l Échantillonnage de la courbe for (double x = xWmin; x <= xWmax; x += pasX) { tracer segment (x,f(x)) (x + pasX, f(x + pasX); } l La courbe va être approximée par des segments de droite. l Prendre garde de ne pas tracer des primitives géométriques trop petites ( < 1 pixel) l Le pas d’échantillonnage doit être fixé en fonction des dimension de l’espace d’affichage double pasX = lw / ld * 3.0;