import java.applet.Applet;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;

/**
	<b>Scopo: </b>fornire un esempio di tracciamento del grafico
	di una (o più) funzioni, con trasformazione di <i>coordinate
	di mondo (WC)</i> in <i>coordinate di dispositivo (DC)</i>.
*/

public class GraficoFunzioneModificato extends Applet
{
	private final int NPUNTI=10000; // num. campioni usati per tracciare il grafico
	private final double X1=-20, X2=20, Y1=-300, Y2=300; // finestra di visualizzazione (WC)
	private int maxx, maxy; // dim. finestra applet (DC)
	
	public void paint(Graphics g)
	{
		this.maxx = getWidth();
		this.maxy = getHeight();
		Graphics2D g2 = (Graphics2D)g;
		
		asseX(g2); 
		asseY(g2);
		
		final double passo = (double)(this.X2 - this.X1) / (this.NPUNTI - 1);
		final int EPS = 1;
		double y;
		Ellipse2D.Double punto = new Ellipse2D.Double();
		g2.setColor(Color.green);
		for (double x=this.X1; x <= X2-passo; x+=passo) {
			y = f(x);
			punto.setFrame(trasformaX(x) - EPS, trasformaY(y) - EPS, 2*EPS+1, 2*EPS+1);
			g2.fill(punto);
			}
		g2.setColor(Color.black);
		float approxX, approxY;	
		for (double x=this.X1; x <= X2-passo; x+=passo) {
			y=f(x);	
			approxX=(int)(x*100+0.5)/100.0F;
			approxY=(int)(y*100+0.5)/100.0F;
			if ((f(x-passo)<f(x)) && (f(x)>f(x+passo)))	{
				g2.drawString("( "+approxX+", "+approxY+" )",(float)trasformaX(x)-40,(float)trasformaY(y));
				}
			if ((f(x-passo)>f(x)) && (f(x)<f(x+passo)))	{
				g2.drawString("( "+approxX+", "+approxY+" )",(float)trasformaX(x)-40,(float)trasformaY(y)+10);
				}
			}
	}

	private static double f(double x) {
		return 1 + x*x / Math.sin(x);
	}
	
	private double trasformaX(double x) {
		return this.maxx * (x - this.X1) / (this.X2 - this.X1);
	}
	
	private double trasformaY(double y) {
		return this.maxy * (this.Y2 - y) / (this.Y2 - this.Y1);
	}
	
	private void asseY(Graphics2D g2) {
		if(this.X1 * this.X2 <= 0) {
			Line2D.Double asse = new Line2D.Double(trasformaX(0), trasformaY(this.Y1),
												 trasformaX(0), trasformaY(this.Y2));
		g2.setColor(Color.red);
		g2.draw(asse);
		
		//disegna suddivisioni asseY		
		Line2D.Double trattino=new Line2D.Double();
		double y;
		for(y=0;trasformaY(y)>maxy;y+=(Y2-Y1)*10/maxy);
		while(trasformaY(y)>=0) {
			trattino.setLine(trasformaX(0)-5,trasformaY(y),trasformaX(0)+5,trasformaY(y));
			g2.draw(trattino);
			y+=(Y2-Y1)*10/maxy;			
			}
		for(y=0;trasformaY(y)<=0;y-=(Y2-Y1)*10/maxy);
		while(trasformaY(y)<=maxy) {
			trattino.setLine(trasformaX(0)-5,trasformaY(y),trasformaX(0)+5,trasformaY(y));
			g2.draw(trattino);
			y-=(Y2-Y1)*10/maxy;			
			}
			
		//Disegna etichetta asse Y
		String etichetta="f(x)";
		g2.drawString(etichetta, (float)trasformaX(0)-30, 10);
		
		}
			
	}	
	
			
	private void asseX(Graphics2D g2) {
		if(this.Y1 * this.Y2 <= 0) {
			Line2D.Double asse = new Line2D.Double(trasformaX(this.X1), trasformaY(0),
									   trasformaX(this.X2), trasformaY(0));
		g2.setColor(Color.red);
		g2.draw(asse);
		
		//disegna suddivisioni asseX		
		Line2D.Double trattino=new Line2D.Double();
		double x;
		for(x=0;trasformaX(x)<0;x+=(X2-X1)*10/maxx);
		while(trasformaX(x)<=maxx) {
			trattino.setLine(trasformaX(x),trasformaY(0)-5,trasformaX(x),trasformaY(0)+5);
			g2.draw(trattino);
			x+=(X2-X1)*10/maxx;			
			}
		for(x=0;trasformaX(x)>=maxx;x-=(X2-X1)*10/maxx);
		while(trasformaX(x)>=0) {
			trattino.setLine(trasformaX(x),trasformaY(0)-5,trasformaX(x),trasformaY(0)+5);
			g2.draw(trattino);
			x-=(X2-X1)*10/maxx;			
			}
		
		//Disegna etichetta asse X
		String etichetta="x";
		g2.drawString(etichetta, maxx-10, (float)trasformaY(0)+20);
		}
	}	
}



 


Bacheca di Informatica Grafica

Forum studenti:

by FdA
ultima modifica: 09/02/2004 13.23