import java.awt.*;
import java.applet.*;
import java.lang.Math.*;
import javax.swing.*;
import javax.swing.event.*;

public class MMD extends AnimeApplet{
  JSlider VBar;
  JCheckBox StoECB;

  Label l2;

  public void init(){
    super.init();
    Container cont=getContentPane();
    cont.setLayout(new BorderLayout());

    VBar=new JSlider();  
    VBar.setMaximum(99);
    VBar.setMinimum(0);
    VBar.setValue(0);
    VBar.setMajorTickSpacing(10);
    VBar.setMinorTickSpacing(5);
    VBar.setPaintTicks(true);
    VBar.setPaintLabels(true);
    
    VBar.addChangeListener(new ChangeListener() {
	public void stateChanged(ChangeEvent evt) {
	  int vv=VBar.getValue();
	  String s ="地球の速度は光速の"+java.lang.Integer.toString(vv)+"%";
	  l2.setText(s);
	  Vchange(vv);
	}
      });

    l2=new Label("地球の速度は光速の 0%");

    
    StoECB=new JCheckBox("過去から未来へ",true);
    StoECB.addItemListener(new java.awt.event.ItemListener() {
	public void itemStateChanged(java.awt.event.ItemEvent evt) {
	  changeStoEFlg(StoECB.isSelected());
	}
      });

    
    JPanel p2=new JPanel();
    p2.setLayout( new GridLayout(2,3));
    p2.add(animePanel);


    JPanel p4=new JPanel();
    p4.add(l2);
    p4.add(VBar);

    p2.add(p4);
    p2.add(StoECB);
    
    cont.add(p2,java.awt.BorderLayout.SOUTH);
    cont.add(canvas,java.awt.BorderLayout.CENTER);
    
    tm.start();
    start();
  }


  double V=0;
  

  double futosa=0.1;
  double nagasa=0.7;
  double Lfactor=1.0;
  int pw=-1;
  int ph=-1;
  
  //  boolean isEarthCenter=false;
  // boolean isEarthMoving=false;
  boolean isLorentz=true;
  boolean NtoE=true;
  boolean stopFlg=false;
  
  int w,h;
  


  private void line(Graphics g,Color c,double x,double y,double x1,double y1)
  {
    g.setColor(c);
    g.drawLine(w/2+(int)(x*w/2),h/2-(int)(y*w/2),
	       w/2+(int)(x1*w/2),h/2-(int)(y1*w/2));
    
  }
  
  private void circle(Graphics g,Color c,double x,double y,double r)
  {
    g.setColor(c);
    g.drawOval(w/2+(int)((x-r)*w/2),h/2-(int)((y+r)*w/2),
	       (int)(r*w),(int)(r*w));
  }
  
  private void fillcircle(Graphics g,Color c,double x,double y,double r)
  {
    g.setColor(c);
    g.fillOval(w/2+(int)((x-r)*w/2),h/2-(int)((y+r)*w/2),(int)(r*w),(int)(r*w));
  }
  private void fillellipse(Graphics g,Color c,double x,double y,double r,double rr)
  {
    g.setColor(c);
    g.fillOval(w/2+(int)((x-rr*r)*w/2),h/2-(int)((y+r)*w/2),(int)(rr*r*w),(int)(r*w));
  }
  
  private void writeDR(Graphics g,double x,double y, double r, double rr)
  {
    fillellipse(g,Color.blue,x,y,r,rr);
    fillellipse(g,Color.white,x,y-r/5,r/2,rr);
    fillellipse(g,Color.white,x-r/3,y+r/4,r/3,rr);
    fillellipse(g,Color.black,x-r/3,y+r/4,r/6,rr);
    fillellipse(g,Color.white,x+r/3,y+r/4,r/3,rr);
    fillellipse(g,Color.black,x+r/3,y+r/4,r/6,rr);
  }
  
  public void Vchange(int a) { V=((double)a)/100; }
  public void changeStoEFlg(boolean f){ NtoE=f; }
  
  public void writeCanvas(Graphics g){
      int i;
      double lightX;
      double earthX;
      int y,ny;


      w=getWidth();
      h=getHeight();

      g.setColor(Color.white);
      g.fillRect(0,0,w,h);

      earthX=-0.85+V*t;
      
      Lfactor=Math.sqrt(1-V*V);
      
      double Vv=Math.sqrt(1-V*V);
    
      if( Vv*t > nagasa*3 ) {
          t=0.0;
      } else if( Vv*t > nagasa*2 ) {
	fillcircle(g,Color.red,earthX,-nagasa/2,futosa/6);
	if( !NtoE ) {
	  writeDR(g,earthX,nagasa/2+futosa/3,futosa/3,Vv);
	}
      } else {
	if( Vv*t > nagasa ) {
	  fillcircle(g,Color.red,earthX,3*nagasa/2-Vv*t,futosa/6);
	  if( !NtoE ) {
	    writeDR(g,earthX,nagasa/2+futosa/3,futosa/3,Vv);
	  }
	} else {
	    fillcircle(g,Color.red,earthX,-nagasa/2+Vv*t,futosa/6);
	    if( NtoE ) {
	    writeDR(g,earthX,nagasa/2+futosa/3,futosa/3,Vv);
	  }
	}
      }
      
      if( t > nagasa*2/Vv ) {
	  fillcircle(g,Color.red,earthX,-nagasa/2,futosa/6);
	  if( NtoE ) {
	      writeDR(g,earthX+(nagasa+futosa/3)*Vv,-nagasa/2,futosa/3,Vv);
	  }
      } else if ( t > nagasa*Vv/(1-V) ) {
	  fillcircle(g,Color.red,earthX+nagasa*Vv+nagasa*Vv*(1+V)/(1-V)-(1+V)*t,-nagasa/2,futosa/6);
	  if( NtoE ) {
	      writeDR(g,earthX+(nagasa+futosa/3)*Vv,-nagasa/2,futosa/3,Vv);
	  }
      } else {
	  fillcircle(g,Color.red,earthX+(1-V)*t,-nagasa/2,futosa/6);
	  if( !NtoE ) {
	      writeDR(g,earthX+(nagasa+futosa/3)*Vv,-nagasa/2,futosa/3,Vv);
	  }
      }
      
      
      line(g,Color.black,
	   earthX-Lfactor*(futosa/2),-nagasa/2-futosa/2,
	   earthX-Lfactor*(futosa/2),nagasa/2);
      line(g,Color.black,
	   earthX-Lfactor*(futosa/2),nagasa/2,
	   earthX+Lfactor*(futosa/2),nagasa/2);
      line(g,Color.black,
	   earthX+Lfactor*(futosa/2),-nagasa/2+futosa/2,
	   earthX+Lfactor*(futosa/2),nagasa/2);
      line(g,Color.black,
	   earthX-Lfactor*(futosa/2),-nagasa/2-futosa/2,
	   earthX+Lfactor*nagasa,-nagasa/2-futosa/2);
      line(g,Color.black,
	   earthX+Lfactor*(futosa/2),-nagasa/2+futosa/2,
	   earthX+Lfactor*nagasa,-nagasa/2+futosa/2);
      line(g,Color.black,
	   earthX+Lfactor*nagasa,-nagasa/2+futosa/2,
	   earthX+Lfactor*nagasa,-nagasa/2-futosa/2);
      

  }
}


   
