//PolarCanvas.java

import java.awt.*;

public class PolarCanvas extends Canvas implements Runnable{
	private static final Color ccolor = new Color(230,230,230);
	private static final Color acolor = new Color(176,176,176);
	private Image im;
	private Graphics buf;
	private int rcx, rcy, raio;
	private Polarization_State state;
	Thread tron;
	private boolean isTronRunning;
	public int SleepTime = 10;
        
	public PolarCanvas(Polarization_State state){
		super();
                this.state = state;
                setBackground(acolor);
		isTronRunning = false;
		//state = new Polarization_State();
	}
	
	public void paint(Graphics g){
	    if(im == null){
		im = createImage(getSize().width,getSize().height);
		buf = im.getGraphics();
		drawCanvas(buf);
		drawState(buf);
	    }
	    else{
		drawCanvas(buf);
		drawState(buf);
	    }
	    g.drawImage(im,0,0,null);
	    state.preset();
	}
	
	private void drawCanvas(Graphics g){
		double resmag, resphase;
		g.setColor(Color.black);
		rcx=getSize().width/2;
		rcy=getSize().height/2;
		raio=(75*getSize().width/200);
		
                g.setColor(acolor);
		if(state.RESET || !state.isTracerOn){
                    g.fillRect(0,0,getSize().width-1,getSize().height-1);
                }
		
		//draw axis system
		g.setColor(Color.black);
		g.drawLine(getSize().width/2,state.s10,getSize().width/2,getSize().height-state.s11);
		g.drawLine(state.s10,getSize().height/2,getSize().width-state.s11,getSize().height/2);
		
                g.drawLine(getSize().width-state.s44,getSize().height/2+state.s5,getSize().width-state.s44,getSize().height/2-state.s5);
		g.drawLine(getSize().width/2-state.s5,state.s44,getSize().width/2+state.s5,state.s44);
		g.drawLine(state.s44,getSize().height/2+state.s5,state.s44,getSize().height/2-state.s5);
		g.drawLine(getSize().width/2-state.s5,getSize().height-state.s45,getSize().width/2+state.s5,getSize().height-state.s45);
		
		//MaestroG.drawArrow(getSize().width-state.s15,getSize().height/2,7,g);
                Polygon pX1 = new Polygon();
                    pX1.addPoint(getSize().width-state.s15+state.s7,getSize().height/2);
                    pX1.addPoint(getSize().width-state.s15,getSize().height/2-state.s2);
                    pX1.addPoint(getSize().width-state.s15,getSize().height/2+state.s2);
                    g.drawPolygon(pX1);
                    g.fillPolygon(pX1);
		//MaestroG.drawArrow(getSize().width/2,state.s13,5,g);
                Polygon pX4 = new Polygon();
                    pX4.addPoint(getSize().width/2,state.s6);
                    pX4.addPoint(getSize().width/2+state.s2,state.s13);
                    pX4.addPoint(getSize().width/2-state.s2,state.s13);
                    g.drawPolygon(pX4);
                    g.fillPolygon(pX4);
                        
                g.setFont(new Font("SanSerif",Font.PLAIN,state.font11));
		g.drawString("X",getSize().width-state.s20,getSize().height/2+state.s20);
		g.drawString("Y",getSize().width/2-state.s20,state.s15);		
	}	
	
	public void drawState(Graphics g){
	   double resmag;
                
		rcx=getSize().width/2;
		rcy=getSize().height/2;
		raio=(75*getSize().width/200);
		
		//draw the resultant vector
		resmag=Math.sqrt(state.ampAA*Math.cos(state.phaseAA+state.wt) *  state.ampAA*Math.cos(state.phaseAA+state.wt) +
		        state.ampBB*Math.cos(state.phaseBB+state.wt) *  state.ampBB*Math.cos(state.phaseBB+state.wt));
		
                g.setColor(acolor);
		g.setXORMode(getBackground());
		
		//Paint tracer on path 
                
		//Delete old tracer
		g.setColor(acolor);
                //Delete old x and y components
		g.setPaintMode();
		
                Graphics2D g2d = (Graphics2D)g;
                //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                if(!state.isTracerOn){
                    g.fillOval((int)(rcx-state.s2+raio*state.ampAA*Math.cos(state.phaseAA+(state.wt-state.dwt)))-state.s2,
                           (int)(rcy-state.s2-raio*state.ampBB*Math.cos(state.phaseBB+(state.wt-state.dwt)))-state.s2,state.s10,state.s10);
                }
                //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                		
		//Paint new tracer
		resmag=Math.sqrt(state.ampA*Math.cos(state.phaseA+state.wt) *  state.ampA*Math.cos(state.phaseA+state.wt)
		     +  state.ampB*Math.cos(state.phaseB+state.wt) *  state.ampB*Math.cos(state.phaseB+state.wt));
		
		//Draw axes
		g.setColor(Color.black);
		g.setPaintMode();
		g.drawLine(getSize().width/2,state.s10,getSize().width/2,getSize().height-state.s11);
		g.drawLine(state.s10,getSize().height/2,getSize().width-state.s11,getSize().height/2);
		
		g.setColor(acolor);
                //Delete old x and y components
		g.setPaintMode();
                MaestroG.drawLineThick2(g,(double)(getSize().width/2),(double)state.s44,(double)(getSize().width/2),(double)(getSize().height-state.s44),5,acolor);
                MaestroG.drawLineThick2(g,(double)(state.s44),(double)(getSize().height/2),(double)(getSize().width-state.s44),(double)(getSize().height/2),5,acolor);
                //--------------------------------------------------------------
		// DRAW FIELD VECTOR COMPONENTS
		g.setColor(Color.red);
                MaestroG.drawLineThick(g,(double)(rcx),(double)rcy,(double)(rcx),(rcy-raio*state.ampB*Math.cos(state.phaseB+state.wt)),5,Color.red);
		g.setColor(Color.green);
		MaestroG.drawLineThick(g,(double)(rcx),(double)(rcy),(double)(rcx+raio*state.ampA*Math.cos(state.phaseA+state.wt)),(double)(rcy),5,Color.green);
                //--------------------------------------------------------------
                int rad = state.s5;
                int rad2 = state.s5; 
		
                if(state.isTracerOn){
                    //Repaint previous line with a different color
                    g.setColor(Color.white);
                    MaestroG.drawLineThick(g,(double)(rcx),(double)rcy,
                            (double)(rcx+(raio)*state.ampAA*Math.cos(state.phaseA+(state.wt-state.dwt))),
                            (double)(rcy-(raio)*state.ampBB*Math.cos(state.phaseB+(state.wt-state.dwt))),2,new Color(190,190,190));
		
                    //Paint new line 
                    g.setColor(Color.magenta);
                    MaestroG.drawLineThick(g,(double)(rcx),(double)rcy,
                            (double)(rcx+(raio)*state.ampA*Math.cos(state.phaseA+state.wt)),
                            (double)(rcy-(raio)*state.ampB*Math.cos(state.phaseB+state.wt)),1,Color.magenta);
                }
                else{
                    //erase oldline
                    g.setColor(acolor);
                    MaestroG.drawLineThick(g,(double)(rcx),(double)rcy,
                            (double)(rcx+(raio)*state.ampAA*Math.cos(state.phaseA+(state.wt-state.dwt))),
                            (double)(rcy-(raio)*state.ampBB*Math.cos(state.phaseB+(state.wt-state.dwt))),5,acolor);
		
                    //Paint new line 
                    g.setColor(Color.black);
                    g.drawLine(rcx,rcy,(int)(rcx+(raio)*state.ampA*Math.cos(state.phaseA+state.wt)),
                                       (int)(rcy-(raio)*state.ampB*Math.cos(state.phaseB+state.wt)));
                }
                
		//Paint new tracer
                if(state.isTracerOn){
                    // change color of previous one
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    g.setColor(new Color(210,210,210));
                    g.fillOval((int)(rcx-state.s2+raio*state.ampAA*Math.cos(state.phaseA+(state.wt-state.dwt))),
                               (int)(rcy-state.s2-raio*state.ampBB*Math.cos(state.phaseB+(state.wt-state.dwt))),rad2,rad2);
                    g.setColor(new Color(255,255,255));
                    g.fillOval((int)(rcx-state.s1+raio*state.ampAA*Math.cos(state.phaseA+(state.wt-state.dwt))),
                               (int)(rcy-state.s1-raio*state.ampBB*Math.cos(state.phaseB+(state.wt-state.dwt))),state.s2,state.s2);
                    g.setColor(new Color(150,150,150));
                    g.drawOval((int)(rcx-state.s2+raio*state.ampAA*Math.cos(state.phaseA+(state.wt-state.dwt))),
                               (int)(rcy-state.s2-raio*state.ampBB*Math.cos(state.phaseB+(state.wt-state.dwt))),rad2,rad2);		
                }
                // paint new yellow one
                g.setColor(Color.yellow);
		g.fillOval((int)(rcx-state.s2+raio*state.ampA*Math.cos(state.phaseA+state.wt)),
                           (int)(rcy-state.s2-raio*state.ampB*Math.cos(state.phaseB+state.wt)),rad2,rad2);		
		g.setColor(Color.black);
                g.drawOval((int)(rcx-state.s2+raio*state.ampA*Math.cos(state.phaseA+state.wt)),
                           (int)(rcy-state.s2-raio*state.ampB*Math.cos(state.phaseB+state.wt)),rad2,rad2);		
		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
                //state.push();
		state.phaseAA=state.phaseA;
		state.phaseBB=state.phaseB;
		state.ampAA=state.ampA;
		state.ampBB=state.ampB;
                
                //Draw axes
		g.setColor(Color.black);
		g.setPaintMode();
		g.drawLine(getSize().width/2,state.s10,getSize().width/2,getSize().height-state.s11);
		g.drawLine(state.s10,getSize().height/2,getSize().width-state.s11,getSize().height/2);
                
                g.drawLine(getSize().width-state.s44,getSize().height/2+state.s5,getSize().width-state.s44,getSize().height/2-state.s5);
		g.drawLine(getSize().width/2-state.s5,state.s44,getSize().width/2+state.s5,state.s44);
		g.drawLine(state.s44,getSize().height/2+state.s5,state.s44,getSize().height/2-state.s5);
		g.drawLine(getSize().width/2-state.s5,getSize().height-state.s45,getSize().width/2+state.s5,getSize().height-state.s45);
		
                
                //--------------------------------------------------------------
		// DRAW FIELD VECTOR COMPONENTS AGAIN
		g.setColor(Color.red);
                MaestroG.drawLineThick2(g,(double)(rcx),(double)rcy,(double)(rcx),(rcy-raio*state.ampB*Math.cos(state.phaseB+state.wt)),5,Color.red);
		g.setColor(Color.green);
		MaestroG.drawLineThick2(g,(double)(rcx),(double)(rcy),(double)(rcx+raio*state.ampA*Math.cos(state.phaseA+state.wt)),(double)(rcy),5,Color.green);
                //--------------------------------------------------------------
	}
	
	public void update(Graphics g){
		paint(g);
	}
	
	
	public void start(){
		if(tron == null){
		    tron = new Thread(this);
		    tron.start();
		}
	}
	
	public void stop(){
		if(tron != null){
		    //tron.stop();
		    tron = null;
		}
	}
	
	
	public void run(){
	    while(true){
		try{
		    Thread.sleep(SleepTime);
		}
		catch(InterruptedException e){e.printStackTrace();}   
		if(isTronRunning){
		    repaint();
		    state.increment();
		}
	    }
	}
	
	public void pause(boolean tmp){
	    if(tmp){
		isTronRunning = false;
		//tron.suspend();
	    }
	    else {
		isTronRunning = true;
		//tron.resume();
	    }
	}
	
	public void setSleepTime(int SleepTime){
	
	    this.SleepTime = SleepTime;
	}
	
	public synchronized void setState(Polarization_State state){
	    this.state = state;
	}
}
