//
//  complexCalc.java
//  complexCalc
//
//  Created by Chris Thiel on 3/2/06.
//  Copyright (c) 2006 __MyCompanyName__. All rights reserved.
//  A simple Java applet
//

import java.awt.*;
import java.applet.*;
import java.lang.Math;

public class complexCalc extends Applet {

    static final String message = "Hello World!";
	static final char root = (char)(8730);
	static final char deg = (char)(176);
	static final char sq = (char)(178);
	static final char mu = (char)(181);
	static final char theta= (char)(952);
    private Font bFont = new Font("sansserif", Font.BOLD, 18);
	private Font sFont = new Font("sansserif", Font.BOLD, 12);
	private Font iFont = new Font("serif", Font.ITALIC+Font.BOLD, 18);
	Rectangle Screen= new Rectangle(10,10,600,300);
	public Rectangle dot;
	double xfactor, yfactor;
	double xmin, ymin, xmax, ymax;
	Choice system=new Choice();
	 public void StdView(){
		xfactor=10;
		yfactor=10;
		xmin=-30;
		xmax=30;
		ymin=-15;
		ymax=15;
	}
	private int screenX (double x){
		//(300= half the screen width 10=offset)
        return (int)(xfactor*(x-xmin)+10); //converts xmin<x<xmax to screen coords
    }
    private int screenY (double y){
        return (int)(yfactor*(ymax-y)+10); //converts -15<y<15 to screen coords
    }
     private int grafX (int x){
        return (int)(100*((x-10)/(xfactor)+xmin))/100; //converts screen coords to coords of the graph
    }
    private int grafY (int y){
        return (int)(100*((y-10)/(-1*yfactor)+ymax))/100; //converts screen coords to graph
    }

	
	
    public void init() {
		StdView();
		 //setLayout (null);
		system.addItem("Co-ords");
		system.addItem("Complex Number");
		add(system);
		dot = new Rectangle( 6,6, 8, 8);
       
    }
	
    public void paint (Graphics g) {
		double r=Math.sqrt(dot.x*dot.x+dot.y*dot.y);
		double t=(int)(18000*(Math.acos(dot.x/r))/Math.PI)/100.0;
		r=(int)(100*r)/100.0;
		if(dot.y<0) { t=360-t;}
		g.setColor(new Color(0xA0F080));
        g.fillRect(Screen.x, Screen.y, Screen.width, Screen.height);
        g.setColor(Color.blue);
        g.setFont(bFont);
		if (system.getSelectedIndex()==0) {
			g.drawString("("+dot.x+" , "+dot.y+")", 40, 80);
			g.drawString("("+r+" , "+t+deg+")" ,40, 105);
			g.drawString("(x,y)=(r cos "+theta+", r sin "+theta+")=("+r+" cos "+t+(char)(176)+", "+r+" sin "+t+(char)(176)+")=("+dot.x+","+dot.y+")", 40, 340);
			g.drawLine(106,362,170,362);
			g.drawString("(r,"+theta+deg+")=("+root+"x "+sq+" + y "+sq+", arccos (x/r))=("+r+","+t+(char)(176)+")", 40, 380);
		} else {
			g.drawString(dot.x+"+"+dot.y+"i", 40, 80);
			g.drawString(r+" (cos "+t+deg+" + i sin "+t+deg+")" ,40, 105);
			g.drawString(r+" ", 40, 130);
			g.drawString("e", 85, 130);
			g.setFont(sFont);
			g.drawString(" "+t+deg+"i",105,120);
			//g.setFont(bFont);
			g.drawString("x + yi = r (cos "+theta+"+ i sin "+theta+")="+r+" (cos "+t+deg+"+ i  sin "+t+deg+")="+dot.x+" + "+dot.y+"i", 40, 340);
			g.drawLine(130,367,170,367);
			g.drawString("r(cos"+theta+"+i sin"+theta+")="+root+"x "+sq+" + y "+sq+"(cos (arccos (x/r))+ i sin (arccos (x/r))="+r+"(cos "+t+deg+"+ i sin "+t+deg+")", 40, 380);

		}
		 g.setFont(sFont);
		g.setColor(Color.red);
		g.fillOval(screenX(dot.x) -4, screenY(dot.y) -4, dot.width, dot.height);
		//draw triangle
		g.drawLine( 310 , 160, screenX(dot.x), screenY(dot.y));
		g.setFont(iFont);
		g.drawString("r", (310+screenX(dot.x))/2, (160+screenY(dot.y))/2);
		if(dot.y<0) {
			g.drawString("x", (310+screenX(dot.x))/2, 155);
		} else {
			g.drawString("x", (310+screenX(dot.x))/2, 170);
		}
		if(dot.x>0) {
			g.drawString("y", (int)(screenX(dot.x))+10, (160+screenY(dot.y))/2);
		}else {
			g.drawString("y", (int)(screenX(dot.x))-10, (160+screenY(dot.y))/2);
		}	
		g.drawString(""+theta, screenX(3.0*Math.cos(Math.PI*t/360.0)),screenY(3.0*Math.sin(Math.PI*t/360.0)));
		g.drawLine(screenX(dot.x), 160, screenX(dot.x), screenY(dot.y));
		 g.drawArc(290,140,40,40,0,(int)(t));
		// draw axes
		g.setColor(Color.black);
		g.drawLine(10, 160 , 610, 160);
		g.drawLine(310,10,310,310); 
    }
	 /***
     * Choice event methods
     */
    public boolean action(Event e, Object arg) {
                   if (e.target instanceof Choice) {
                  
                     repaint();
                      return true;
                  } else { return false;}
               
    }
    
    
    /*
     * Mouse methods
     */
     public boolean mouseDown(java.awt.Event evt, int x, int y) {
        
           dot.setLocation(grafX(x),grafY(y));
        
       repaint();
       return true;
    }
    public boolean mouseDrag(java.awt.Event evt, int x, int y) {
      
           dot.setLocation(grafX(x),grafY(y));
            repaint();
        return true;
    }

}
