import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class NewGuideCanvas extends Canvas implements MouseListener{
    private static final Color bgcolor2 = new Color(255,255,250);
    private static final Color bgcolor = Color.white;
    //private static final Color bgcolor2 = Color.gray;
    private static final int LeftMargin=20, RightMargin=10, TopMargin=10, BottomMargin=10;
    private static final Font labfont = new Font("SanSerif",Font.PLAIN,10);
    private static final Font symbfont= new Font("Serif",Font.PLAIN,12);
    private static final Font symbfont2= new Font("Serif",Font.PLAIN,14);
    private static final Font labfont2= new Font("Serif",Font.BOLD,16);
    private static final Font labfont4= new Font("Serif",Font.PLAIN,12);
    private static final Font labfont3 = new Font("SanSerif",Font.PLAIN,12);
    private int x[], y[];
    private int N_elements;
    private double frequency, epsilon_r, epsilon_r0, mu_r, phase_velocity, phase_velocity0;
    private double DipoleLength_lambda, wavelength, radius_lambda;
    private static final double epsilon0 = 8.8541878176E-12; //Units: F/m
    private static final double mu0 = 1.25663706144E-6; //Units H/m
    //private static final double light_velocity = Math.sqrt(1.0/(epsilon0*mu0)); //  Units m/s
    private static final double light_velocity = 3.0E8; //  Units m/s - simplified
    
    private Image im;
    private Graphics buf;
    private String stmp;
    private double temp;
    private boolean IsFocusOn, IsTopoOn;
    public boolean Is3D;
    NewGuide_State state;
    
    public NewGuideCanvas(NewGuide_State state){
	super();
        this.state = state;
        
	IsFocusOn = false;
	IsTopoOn = false;
	N_elements = 2;
	setBackground(bgcolor);
	x = new int[5];
	y = new int[5];

	//Listeners
	this.addMouseListener(this);
	
	epsilon_r = 1.0;
	epsilon_r0 = 1.0;
	mu_r = 1.0;
	frequency = 1.0E9;
	DipoleLength_lambda = 0.5;
	radius_lambda = 1.0E-5;
	
	Is3D = true;
	
	wavelength = light_velocity/frequency/Math.sqrt(epsilon_r);
	
    }

    public void drawCanvas(Graphics g){
	
	setBackground(bgcolor2);
	g.clearRect(0,0,getSize().width,getSize().height);
	g.setColor(Color.black);
	
	    draw3D(g);
	    
    }
    
    
    private void drawWire(int x1, int y1, int x2, int y2, int mode, Graphics g){
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    
		//g.setColor(Color.white);
		g.setColor(Color.gray);
		g.drawLine(x1,y1,x2,y2);
		if(mode==1){
			g.setColor(Color.black);
			g.drawLine(x1,y1+1,x2,y2+1);
		}
		else if(mode==2){
			g.setColor(Color.black);
			g.drawLine(x1+1,y1,x2+1,y2);
		}
    }

    private void draw3DRect(int x, int y, int width, int height, Color c, Graphics g){
		g.setColor(c);
		g.fillRect(x-width/2,y-height/2,width,height);
		//g.setColor(Color.white);
		g.setColor(Color.gray);
		g.drawLine(x-width/2,y-height/2,x+width/2,y-height/2);
		g.drawLine(x-width/2,y-height/2,x-width/2,y+height/2);
		g.setColor(Color.black);
		g.drawLine(x-width/2,y+height/2,x+width/2,y+height/2);
		g.drawLine(x+width/2,y-height/2,x+width/2,y+height/2);
	}
	
	private void drawRect(int x, int y, int width, int height, Color c, Graphics g){
		g.setColor(c);
		g.fillRect(x-width/2,y-height/2,width,height);
	}
	

	private void drawCircle(int x, int y, int radius, Color c, Graphics g){
		g.setColor(c);
		g.fillOval(x-radius,y-radius,2*radius,2*radius);
		//g.setColor(Color.white);
		g.setColor(Color.gray);
		g.drawOval(x-radius,y-radius,2*radius,2*radius);
		g.setColor(Color.black);
		g.drawArc(x-radius-1,y-radius-1,2*radius+2,2*radius+2,30,-120);
	}

	
    private void draw3D(Graphics g){    
	Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    
	//Draw the background
		
		g.setColor(Color.black);
		//set the arrays
		x[0] = getSize().width/2;
		x[1] = x[0] -7;
		x[2] = getSize().width-state.s50;
		
		y[0] = getSize().height-state.s20;
		y[1] = getSize().height/2;

		g.clearRect(0,0,getSize().width-1,getSize().height-1);
		
                //----------------------------------------------------------
		String lambda, rho;
		g.setFont(symbfont2);
		g.getFontMetrics();
		lambda="\u03bb";
		rho ="\u03c1";
		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		
	    if(IsFocusOn){
                // this is disabled here
	    }
	    else{	
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		//Arc for theta
		int xCenter = getSize().width/2;//x[0];
		int yCenter = y[1];
		int Radius = state.s15;
		int beginAngle = 90;
		int Angle = -120;
		int raio = 2*Radius;
		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                
                // theta angle arc
                g.setColor(Color.cyan);
		g.fillArc(xCenter-Radius,yCenter-Radius,raio,raio,beginAngle,Angle);
		g.setColor(Color.black);
		g.drawArc(xCenter-Radius,yCenter-Radius,raio,raio,beginAngle,Angle);
		
                // theta angle symbol
                g.setColor(Color.blue);
		g.setFont(new Font("Serif",Font.ITALIC,state.font15));
		g.drawString("\u03b8",x[0]+state.s30,y[1]+state.s14);
		g.setFont(new Font("SanSerif",Font.PLAIN,state.font12));
		g.setColor(Color.black);
                
                int endpoint = state.s75;
                
		//draw axes
		g.setColor(Color.black);
		g.drawLine(x[0],state.s20,x[0],y[0]); 
		//MaestroG.drawArrow(x[0],20,5,g);
                MaestroG.drawArrowScaled(x[0],state.s20,1,state.sfactor,g);
		g.drawLine(x[0],y[1],x[0],y[1]+state.s15);
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                
                MaestroG.subscripter("0","","",g,state.font14,x[1]-state.s10,yCenter+state.s5);
                MaestroG.subscripter("x","","",g,state.font14,x[2]+state.s10,y[1]-state.s9);
                MaestroG.subscripter("z","","",g,state.font14,x[0]-state.s20,state.s20);
                
                g.drawLine(x[1]+state.s2,y[1],x[2]+state.s10,y[1]);
                MaestroG.drawArrowScaled(x[2]+10,y[1],3,state.sfactor,g);
		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                g.setColor(Color.red);
		
                int xtip, ytip;
                xtip = x[0]+state.s75;
                ytip = y[1]+state.s45;
                
                //radial line to point P
		g.drawLine(x[0],y[1],xtip,ytip);
		
		//draw Field vectors
		g.setColor(Color.red);
		//E_theta
		g.drawLine(xtip,ytip,xtip-state.s12,ytip+state.s20);
		g.drawLine(xtip-state.s12,ytip+state.s20,xtip-state.s10,ytip+state.s10);
		g.drawLine(xtip-state.s12,ytip+state.s20,xtip-state.s4,ytip+state.s13);
		
		MaestroG.subscripterSymbol2("E","\u03b8","",g,state.font14,xtip,ytip+state.s20);
		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
		//point P
		g.setColor(Color.green);
		MaestroG.fillCircle(xtip,ytip,state.s6,g);
		g.setColor(Color.black);
		MaestroG.drawCircle(xtip,ytip,state.s6,g);
                
                
                // draw array
                int xleft = state.s50;
                int yshift = state.s10;
                int xCenterN = xCenter - xleft;
                if(N_elements == 1){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter, state.s8, g);
                }
                else if(N_elements == 2){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s16, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s16, state.s8, g);
                    
                    g.setColor(Color.gray);
                    g.drawLine(xCenterN, yCenter-state.s16, xCenterN, yCenter+state.s16);
                    //MaestroG.drawArrow(xCenterN,yCenter-16+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+16-yshift,6,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s16+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s16-yshift,2,state.sfactor,g);
		
                    //end lines
                    g.drawLine(xCenterN-state.s5,yCenter-state.s16,xCenterN+state.s5,yCenter-state.s16);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s16,xCenterN+state.s5,yCenter+state.s16);
                    
                    g.setColor(Color.black);
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5);
                }
                else if(N_elements == 3){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s32, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s32, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s32, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s32, state.s8, g);
                    
                    g.setColor(Color.gray);
                    g.drawLine(xCenter-xleft, yCenter-state.s32, xCenter-xleft, yCenter+state.s32);
                    //MaestroG.drawArrow(xCenterN,yCenter+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-32+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+32-yshift,6,g);
                    
                    MaestroG.drawArrowScaled(xCenterN,yCenter+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s32+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s32-yshift,2,state.sfactor,g);
		
                    // end lines
                    g.drawLine(xCenterN-state.s5,yCenter,xCenterN+state.s5,yCenter);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s32,xCenterN+state.s5,yCenter-state.s32);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s32,xCenterN+state.s5,yCenter+state.s32);
                    
                    g.setColor(Color.black);
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s16);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s16);
                }
                else if(N_elements == 4){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s16, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s48, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s48, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s16, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s48, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s48, state.s8, g);
                    
                    g.setColor(Color.gray);
                    g.drawLine(xCenter-xleft, yCenter-state.s48, xCenter-xleft, yCenter+state.s48);
                    //MaestroG.drawArrow(xCenterN,yCenter-16+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+16-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-16-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+16+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-48+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+48-yshift,6,g);
                    
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s16+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s16-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s16+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s16-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s48+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s48-yshift,2,state.sfactor,g);
                    
                    // end lines
                    g.drawLine(xCenterN-state.s5,yCenter-state.s16,xCenterN+state.s5,yCenter-state.s16);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s16,xCenterN+state.s5,yCenter+state.s16);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s48,xCenterN+state.s5,yCenter-state.s48);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s48,xCenterN+state.s5,yCenter+state.s48);
                    
                    g.setColor(Color.black);
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s32);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s32);
                }
                else if(N_elements == 5){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s32, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s32, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s64, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s64, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s32, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s32, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s64, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s64, state.s8, g);
                    
                    g.setColor(Color.gray);
                    g.drawLine(xCenter-xleft, yCenter-state.s64, xCenter-xleft, yCenter+state.s64);
                    //MaestroG.drawArrow(xCenterN,yCenter+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-32+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+32-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-32-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+32+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-64+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+64-yshift,6,g);
                    
                    MaestroG.drawArrowScaled(xCenterN,yCenter+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s32+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s32-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s32+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s32-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s64+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s64-yshift,2,state.sfactor,g);
                    
                    g.drawLine(xCenterN-state.s5,yCenter,xCenterN+state.s5,yCenter);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s32,xCenterN+state.s5,yCenter-state.s32);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s32,xCenterN+state.s5,yCenter+state.s32);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s64,xCenterN+state.s5,yCenter-state.s64);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s64,xCenterN+state.s5,yCenter+state.s64);
                    g.setColor(Color.black);
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s16);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s16);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s48);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s48);
                }
                else if(N_elements == 6){
                    g.setColor(Color.yellow);
                    MaestroG.fillCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s16, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s48, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s48, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter-state.s80, state.s8, g);
                    MaestroG.fillCircle(xCenter, yCenter+state.s80, state.s8, g);
                    g.setColor(Color.black);
                    MaestroG.drawCircle(xCenter, yCenter-state.s16, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s16, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s48, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s48, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter-state.s80, state.s8, g);
                    MaestroG.drawCircle(xCenter, yCenter+state.s80, state.s8, g);
                    
                    g.setColor(Color.gray);
                    g.drawLine(xCenter-xleft, yCenter-state.s80, xCenter-xleft, yCenter+state.s80);
                    //MaestroG.drawArrow(xCenterN,yCenter-16+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+16-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-16-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+16+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-48+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+48-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-48-yshift,6,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+48+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter-80+yshift,5,g);
                    //MaestroG.drawArrow(xCenterN,yCenter+80-yshift,6,g);
                    
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s16+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s16-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s16+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s16-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s48+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s48-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s48+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s48-yshift,2,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter-state.s80+yshift,1,state.sfactor,g);
                    MaestroG.drawArrowScaled(xCenterN,yCenter+state.s80-yshift,2,state.sfactor,g);
		
                    // end lines
                    g.drawLine(xCenterN-state.s5,yCenter-state.s16,xCenterN+state.s5,yCenter-state.s16);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s16,xCenterN+state.s5,yCenter+state.s16);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s48,xCenterN+state.s5,yCenter-state.s48);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s48,xCenterN+state.s5,yCenter+state.s48);
                    g.drawLine(xCenterN-state.s5,yCenter-state.s80,xCenterN+state.s5,yCenter-state.s80);
                    g.drawLine(xCenterN-state.s5,yCenter+state.s80,xCenterN+state.s5,yCenter+state.s80);
                    
                    g.setColor(Color.black);
                    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s32);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s32);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5-state.s64);
                    MaestroG.subscripterSymbol2("d","","",g,state.font16,xCenterN-state.s15,yCenter+state.s5+state.s64);
                }
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
	    }
    }
    
    private void drawArcThick(Graphics g, double xCenter, double yCenter, double Radius, double Radius2, double startangle, double endangle, int thick, Color color){
	
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(color);
        g2d.setStroke(new BasicStroke(thick));
        
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        Arc2D.Double arc_one = new Arc2D.Double(xCenter,yCenter,Radius,Radius2,startangle,endangle,0);
        g2d.draw(arc_one);
  
        g2d.setStroke(new BasicStroke(1));
        //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
}
    
    public synchronized void setFrequency(double frequency){
	this.frequency = frequency;
    }
    
    public synchronized void setEpsilon(double epsilon_r){
	this.epsilon_r = epsilon_r;
    }
    
    public synchronized void setEpsilon0(double epsilon_r0){
	this.epsilon_r0 = epsilon_r0;
    }
    
    public synchronized void setMu(double mu){
	this.mu_r = mu;
    }
    
    public synchronized void setElements(int N_elements){
	this.N_elements = N_elements;
    }
    
    public synchronized void set3D(boolean Is3D){
	this.Is3D = Is3D;
    }
    
    public synchronized void setAntennaLength(double DipoleLength_lambda){
	this.DipoleLength_lambda = DipoleLength_lambda;
    }
    
    public synchronized void setAntennaRadius(double radius_lambda){
	this.radius_lambda = radius_lambda;
    }
    
    @Override
    public void paint(Graphics g){
	    if(im == null){
		im = createImage(getSize().width,getSize().height);
		buf = im.getGraphics();
		drawCanvas(buf);
	    }
	    else{
		drawCanvas(buf);
	    }
	    g.drawImage(im,0,0,null);
    }
    
    
    @Override
    public void update(Graphics g){
	paint(g);
    }
    
    public void mouseClicked(MouseEvent evt){
	//if(IsFocusOn){
	  //  IsFocusOn = false;
	  //  repaint();
	//}
	
	//else{
	  //  IsFocusOn = true;
	  //  repaint();
	//}
    }
    
    public void mouseEntered(MouseEvent evt){
	//IsTopoOn = true;
	//repaint();
    }
    public void mouseExited(MouseEvent evt){
	//IsTopoOn = false;
	//repaint();
    }
    
    public void mousePressed(MouseEvent evt){}
    public void mouseReleased(MouseEvent evt){}
}
