import java.awt.*;
public class FunctionPlotter extends Canvas{
	private Image dbImage;
	private Graphics dbGraphics;
	private Dimension dim;

	private Vektor[][] gitter;
	private boolean computed;
	private FunctionRnRn f;

	public FunctionPlotter(FunctionRnRn _f){
		gitter = new Vektor[4*50][4*50];
		computed = false;
		f=_f;
		dim = new Dimension(200,200);
		setSize(dim);
		compute();
	}


	private void paintNew(Graphics g){
		g.setColor(Color.red);
		g.drawString("hallo",20,20);
		double factorY = (getSize().height)/(4*50.0);
		int lineEnd=0;
		int lineStart=0;
		for(int i=0;i<gitter.length;i++){
			lineEnd=0;//System.out.print("\nmale line "+i);
			while(lineEnd!=gitter.length){
				lineStart = lineEnd;
				lineEnd = getLineEnd(lineStart,i);//System.out.print("/"+lineEnd);
				g.setColor(new Color((int)Math.abs((-20*(gitter[i][lineStart].getElement(0)+gitter[i][lineStart].getElement(gitter[i][lineStart].length()-1)))%200),(int)Math.abs((7*(gitter[i][lineStart].getElement(0)-99*gitter[i][lineStart].getElement(gitter[i][lineStart].length()-1)))%200),(int)Math.abs((70*(gitter[i][lineStart].getElement(0)+gitter[i][lineStart].getElement(gitter[i][lineStart].length()-1)))%200)));
				g.fillRect((int)(lineStart*factorY),(int)(i*factorY),(int)((lineEnd-lineStart)*factorY),(int)factorY); 
			}
		} 
		//System.out.println("fertig mit malen");

	}

	private int getLineEnd(int start,int i){
		int j=start+1;
		while(j<gitter.length&&gitter[i][start].equals(gitter[i][j]))
			j++;
		return j;
	}

	private void compute(){
		if(!computed){
			for(int i=0;i<gitter.length;i++)
				for(int j=0;j<gitter[i].length;j++){
					//System.out.println(i+"\t"+j);
 						double[] x = {-2.0+((double)j)/50.0,2.0-((double)i)/50.0};
						//System.out.println(x[0]+"\t"+x[1]);

					gitter[i][j] = NumerikImplementations.newtonRnRn(f,new Vektor(x),5,0.0000000000000001);
				}
			computed = true;
		}
		System.out.println("fertig mit computen");


	}

	public void paint(Graphics g){
		//Double-Buffer initialisieren
		if(dbImage == null||this.getSize().height!=dbImage.getHeight(this)||this.getSize().width!=dbImage.getWidth(this)){
			dbImage = createImage(this.getSize().width, this.getSize().height);
			dbGraphics = dbImage.getGraphics();
			//Hintergrund loeschen
			dbGraphics.setColor(getBackground());
			dbGraphics.fillRect(0,0,this.getSize().width, this.getSize().height);
			//Vordergrund zeichene
			dbGraphics.setColor(getForeground());
			paintNew(dbGraphics);
		}
		g.drawImage(dbImage,0,0,this);
	}	



	public void update(Graphics g){
		//Offscreen anzeigen
		g.drawImage(dbImage,0,0,this);
	}

	/*Damit der Layoutmanager des umgebenden Containers die
     *Spalte nicht auf Größe 0x0 schrumpft
     */
    public Dimension getMaximumSize(){
		return dim;
    }
    public Dimension getMinimumSize(){
		return dim;
    } 
    public Dimension getPreferredSizeSize(){
		return dim;
    } 

}
