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 GraficoFunzione extends Applet
{
	private int npunti; // num. campioni usati per tracciare il grafico
	private double x1, x2, y1, y2; // finestra di visualizzazione (WC)
	private int maxx, maxy; // dim. finestra applet (DC)
	
	public void init()
	{
		System.out.println("init()");
	}

	public void start()
	{
		System.out.println("start()");
		ConsoleReader lettore = new ConsoleReader(System.in);
		System.out.print("Quanti punti? ");
		this.npunti = lettore.readInt();
		System.out.print("Xmin = ");
		this.x1 = lettore.readDouble();
		System.out.print("Xmax = ");
		this.x2 = lettore.readDouble();
		System.out.print("Ymin = ");
		this.y1 = lettore.readDouble();
		System.out.print("Ymax = ");
		this.y2 = lettore.readDouble();
	}

	public void paint(Graphics g)
	{
		System.out.println("paint()");
		this.maxx = getWidth();
		this.maxy = getHeight();
		Graphics2D g2 = (Graphics2D)g;
		
		asseX(g2); 
		asseY(g2);
		
		double x = this.x1;
		double passo = (double)(this.x2 - this.x1) / (this.npunti - 1);
		while(x <= x2) {
			double y = f(x);
			double y2 = f2(x);
			final int EPS = 1;
			Ellipse2D.Double punto = new Ellipse2D.Double(trasformaX(x) - EPS, 
			                               trasformaY(y) - EPS, 2*EPS+1, 2*EPS+1);
			Ellipse2D.Double punto2 = new Ellipse2D.Double(trasformaX(x) - EPS, 
			                               trasformaY(y2) - EPS, 2*EPS+1, 2*EPS+1);
			g2.fill(punto);
			Color col = g2.getColor();
			g2.setColor(Color.green);
			g2.fill(punto2);
			g2.setColor(col);
			x += passo;
		}
	}

	private static double f(double x) {
		return 1 + x*x / Math.sin(x);
	}
	
	private static double f2(double x) {
		return x*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 boolean 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));
			this.drawAsse(g2, asse);
			return true;
		} else return false;
	}
			
	private boolean 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));
			this.drawAsse(g2, asse);
			return true;
		} else return false;
	}
	
	private void drawAsse(Graphics2D g2, Line2D.Double asse) {
			Color col = g2.getColor();
			g2.setColor(Color.red);
			g2.draw(asse);
			g2.setColor(col);
	}	
	
	public void stop() {
		System.out.println("stop()");
	}
	
	public void destroy() {
		System.out.println("destroy()");
	}
}




Questa la bacheca di Informatica Grafica, corso di laurea specialistica in Ing. Edile-architettura
by FdA
ultima modifica: 02/02/2005 11.30