//*******************************************************************
//*   二重振り子シミュレーション     Visual J++ 6.0   1999  T.A    *
//*******************************************************************
import java.awt.*;
import java.applet.*;
import java.math.*;

/**
 * このクラスは、HTML ホストページから PARAM タグを読み、アプレット
 * の color および label プロパティを設定します。プログラムの実行は init()
 * メソッドから始まります。
 */
public class huriko extends Applet  implements Runnable
{
 Font theFont =new Font("MS明朝",Font.PLAIN,20);

 public void run(){
  while(true){

  draw(can_G);
 if(Y[0]>3600){//計算上の一時間で終了
  stop();
 

  }

  try{Thread.sleep(interval);}
  catch( InterruptedException e){}
  }
 }

 protected void mb(int x, int y, int w ,int h, Button b, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(b,gc);
  add(b);
 }
  protected void mchoice(int x, int y, int w ,int h, Choice c, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(c,gc);
  add(c);
 }
 protected void ml(int x, int y, int w ,int h, String n, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  Label l=new Label(n);

  gb.setConstraints(l,gc);
  add(l);
 }

 protected void mlist(int x, int y, int w ,int h, List l, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
 

  gb.setConstraints(l,gc);
  add(l);
 }

 protected void mBar(int x, int y, int w ,int h, Scrollbar sc, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(sc,gc);
  add(sc);
 }

 protected void mCan(int x, int y, int w ,int h, Canvas c, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(c,gc);
  add(c);
 }

  protected void mlb(int x, int y, int w ,int h,Label l, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(l,gc);
  add(l);
 }

  protected void mcheck(int x, int y, int w ,int h,Checkbox l, GridBagLayout gb,GridBagConstraints gc){
  gc.gridx = x;
  gc.gridy = y;
  gc.gridwidth=w;
  gc.gridheight=h;
  gb.setConstraints(l,gc);
  add(l);
  }

protected void makegc( GridBagConstraints aa){
  aa=new GridBagConstraints();
 }
 

 /**
 *********** アプレットのためのエントリ ポイントです。*************
  */
 Graphics can_G,can_G_phase;
 Image img1;
 Label lbar,lbar2,theta1,theta2,teikou1,teikou2,mass1,mass2,l_phase;
 Label lx;//経過時間表示ラベル
 Checkbox che_g;
 Button b1;
 Button b2;
 Button b3;
 Choice c_photo;
 Canvas can1,can_hyoudai,can_phase;
 Color theColor,TitleColor;
 Color theColor_bk;
 Color theColor1;
 Color theColor2;
 Color theColorp1;
 Color theColorp2;
 Color theColorY;
 Color theColor_p_bk;

 int now_calc=0;
 int r2,r1;
 Scrollbar sc_l1,sc_l2,sc_teikou1,sc_teikou2,sc_B,sc_speed,sc_theta1;
 Scrollbar sc_theta2,sc_mass1,sc_mass2;
 double dt=0.0001;
 doubleroot2=1.41421356237,root3=1.732050807569,root5=2.2360679774998;
 doubleroot7=2.64575131106,root10=3.162277660168;
 doublepi=3.14159265358,dw_x=pi/100;
 double ratio=root2;
 double dw_y=dw_x*ratio;
 int kaisuu_x;
 Thread runThread;
 int old_x;
 int old_x_1;
 int old_x_2;
 int old_y_1;
 int old_y_2;
 int circlex_1;
 int circlex_2;
 int circley_1;
 int circley_2;
 int new_x_1;
 int new_x_2;
 int new_y_1;
 int new_y_2;
 int circle_newx_1;
 int circle_newx_2;
 int circle_newy_1;
 int circle_newy_2;
 int old_y; 
 int x;
 int y;
 int interval=1;
 int photo_num=1;
 double Q_1,Q_2,Q_3,Q_4;
 double res1 , res2  ;//'錘1、2の角速度に比例した抵抗係数
 double l1=8.0 , l2=5.0 , sc= 10,sc_p_x=5,sc_p_y=10;
 int x_center, y_center,x_center_p, y_center_p;
 double[] Y ={0,3*pi/4,pi/2,0,0};
 double[] Y_INIT= {0,3*pi/4,pi/2,0,0};
 double[] k ={0,0,0,0,0};
 double[] kk ={0,0,0,0,0};
 double[] kkk ={0,0,0,0,0};
 double r , K_temp , Q_temp ;
 double x1_n , x1_o , y1_n , y1_o;
 double x2_n , x2_o , y2_n , y2_o ;
 double y1 , y2 , y3 , y4 ;
 double SS , CC , g , s1 , s2 , mu , m1 , m2;
 double l1_INIT , l2_INIT ;
 double m1_INIT , m2_INIT ;
 double h_INIT , g_INIT ;
 int minute ;// '連続計算時間(分)
 int t_count ;
 double r_1 ;
 double r_2 ;
 int x_disp_o_1 ;
 int y_disp_o_1 ;
 int x_disp_o_2 ;
 int y_disp_o_2 ;
 int x_disp_n ;
 int y_disp_n ;
 int x_dispAT_o ;
 int y_dispAT_o ;
 int x_dispAT_n ;
 int y_dispAT_n ;
 double energy ;
 double VV  ;//'抵抗計算用
 double K_energy ;// 'kinetic energy  この辺は未使用
 double P_energy  ;//'potential energy
 double energy_INIT ;
 double K_energy_INIT  ;//'kinetic energy
 double P_energy_INIT  ;//'potential energy
 int rec_max;
 long T=0;
 //***********************************************************
 public void init()
 {
  g = 9.8 ;//'重力加速度
  g_INIT = g;//
  m1 = 2.0 ;//'球1の質量
  m2 = 2.0;// '球2の質量
  m1_INIT = m1;
  m2_INIT = m2;
  mu = (m1 + m2) / m2;
  k[0] = 1 / 2; kk[0] = 1 / 2; kkk[0] = 2;
  k[1] = 1.0 - 1.0 / Math.sqrt(2); kk[1] = 1.0 - 1.0 /Math.sqrt(2); kkk[1] = 1.0;
  k[2] = 1.0 + 1.0 / Math.sqrt(2); kk[2] = 1.0 + 1.0 /Math.sqrt(2); kkk[2] = 1.0;
  k[3] = 1.0 / 6.0; kk[3] = 1.0 / 2.0; kkk[3] = 2.0;
  res1=0;
  res2=0;

  can1 = new Canvas(){
     public void paint(Graphics g) {
      if(now_calc==0) {
      r2=(int)( Math.pow(m2*80,1.0/3.0))*2;
      r1=(int)( Math.pow(m1*80,1.0/3.0))*2;
      old_x_1=(int)(x_center+sc*l1*Math.sin(Y_INIT[1]));
      old_x_2= (int)(x_center+sc*l1*Math.sin(Y_INIT[1])+sc*l2*Math.sin(Y_INIT[2])   );
      old_y_1=(int)( y_center+sc*l1*Math.cos(Y_INIT[1]));
      old_y_2= (int)( y_center+sc*l1*Math.cos(Y_INIT[1])+sc*l2*Math.cos(Y_INIT[2])  );
     circlex_1=x_center+(int)(sc*l1*Math.sin(Y_INIT[1])-r1/2);
      circley_1= y_center+(int)(sc*l1*Math.cos(Y_INIT[1])-r1/2);
      circlex_2=x_center+(int)(sc*l1*Math.sin(Y_INIT[1])+sc*l2*Math.sin(Y_INIT[2]) -r2/2 );
      circley_2= y_center+(int)(sc*l1*Math.cos(Y_INIT[1])+sc*l2*Math.cos(Y_INIT[2]) -r2/2);
      g.setColor(theColor);
      g.drawLine(old_x_1,old_y_1,x_center,y_center);
      g.drawLine(old_x_1,old_y_1, old_x_2,old_y_2  );
      g.setColor(theColor1);
      g.fillOval(circlex_1,circley_1,r1,r1);
      g.setColor(theColor2);
      g.fillOval(circlex_2,circley_2,r2,r2  );
       for(int i=0;i<5;i++){
             Y[i]=Y_INIT[i];
       }
      }

     }

   };

    can_phase = new Canvas(){
      public void paint(Graphics g) {
      if(now_calc==0) {
      g.clearRect(0,0,600,150);//キャンバスの消去
      g.setColor(theColorY);//座標軸の表示
      for(int i=0;i<9;i++){
      g.drawLine(x_center_p+(int)((double)i*(double)sc_p_x*2*pi),0,x_center_p+(int)((double)i*(double)sc_p_x*2*pi),150);
      g.drawLine(x_center_p-(int)((double)i*(double)sc_p_x*2*pi),0,x_center_p-(int)((double)i*(double)sc_p_x*2*pi),150);

      }
      g.drawLine(0,y_center_p,550,y_center_p);
      int x=(int)(x_center_p+sc_p_x*Y_INIT[1]);//位相空間赤初期点
      int y=(int)( y_center_p+sc_p_y*Y_INIT[3]);
      g.setColor(theColorp1);
      g.drawLine(x,y,x,y);
      x=(int)(x_center_p+sc_p_x*Y_INIT[2]);//位相空間青初期点
      y=(int)( y_center_p-sc_p_y*Y_INIT[4]);
      g.setColor(theColorp2);
      g.drawLine(x,y,x,y);

       }
 

     }

   };

   can_hyoudai = new Canvas(){
    public void paint(Graphics g) {
    img1 = getImage(getCodeBase(),"photo.gif");
    g.drawImage(img1,0,0,322,45,this) ;
    Font theFont =new Font("MS明朝",Font.PLAIN,24);
    setFont(theFont);
    //g.setColor(TitleColor);
    //g.drawString( "  2重振り子シミュレーション  ",0,30);

    }

   };

   can_G = can1.getGraphics();
   can_G_phase = can_phase.getGraphics();
   theColor_bk=new Color(200,200,200);
   theColor_p_bk=new Color(0,60,70);
   theColor=new Color(0,0,0);
   theColor1=new Color(200,0,0);
   theColor2=new Color(0,0,200);
   theColorp1=new Color(255,80,80);
   theColorp2=new Color(140,150,255);
   x_center=150;              //canvasの中心座標
   y_center=130;
   x_center_p=270;
   y_center_p=75;
   theColorY=new Color(230,230,0);
   TitleColor=new Color(250,250,0);
   can1.setBackground(theColor_bk);
   can1.setForeground(theColor1);
   can1.setSize(301,301);
   can_phase.setBackground(theColor_p_bk);
   can_phase.setForeground(theColor1);
   can_phase.setSize(600,150);
   b1=new Button("開始");
   b1.setName("start");
   b2=new Button("停止");
   b2.setName("stop");
   b3=new Button("初期化");
   b3.setName("cls");
 

   GridBagLayout gb=new GridBagLayout();
   GridBagConstraints gc=new GridBagConstraints();
   setLayout(gb);
   gc.fill = GridBagConstraints.BOTH;
   gc.ipadx = 50;
   gc.ipady = 10;
   gc.weightx=1.0;
   gc.weighty=1.0;

   //リストボックスの生成************************************
   //スクロールバーの生成*************************************
   //Scrollbar

    sc_l1=new Scrollbar(Scrollbar.HORIZONTAL,80,5,1,100);
    sc_l1.setName("l1_bar");
    sc_mass1=new Scrollbar(Scrollbar.HORIZONTAL,20,5,1,50);//1の質量用
    sc_mass1.setName("mass1_bar");
    sc_mass2=new Scrollbar(Scrollbar.HORIZONTAL,20,5,1,50);//2の質量用
    sc_mass2.setName("mass2_bar");
    sc_l2=new Scrollbar(Scrollbar.HORIZONTAL,50,5,1,100);
    sc_l2.setName("l2_bar");
    sc_teikou1=new Scrollbar(Scrollbar.HORIZONTAL,0,5,0,100);
    sc_teikou1.setName("teikou_bar1");
    sc_teikou2=new Scrollbar(Scrollbar.HORIZONTAL,0,5,0,100);
    sc_teikou2.setName("teikou_bar2");
    sc_theta1=new Scrollbar(Scrollbar.HORIZONTAL,335,10,0,400);
    sc_theta1.setName("theta1_bar");
    sc_theta2=new Scrollbar(Scrollbar.HORIZONTAL,290,10,0,400);
    sc_theta2.setName("theta2_bar");
    sc_speed=new Scrollbar(Scrollbar.HORIZONTAL,1,1,1,100);
    sc_speed.setName("speed_bar");
    lbar=new Label("L1= 8.0 m");
    lbar2=new Label("L2= 5.0 m");
    theta1=new Label("θ1= 135°");
    theta2=new Label("θ2=  90°");
    teikou1=new Label("抵抗係数1= 0.0");
    teikou2=new Label("抵抗係数2= 0.0");
    mass1=new Label("M1= 2.0kg");
    mass2=new Label("M2= 2.0kg");
    lx=new Label("  0 秒");
    l_phase=new Label("位相空間  横軸:角度(1目盛 2π[rad])  縦軸:角速度 ");
    che_g=new Checkbox("無重力",false);
   mb(7,2,1,1,b1,gb,gc);
   ml(6,3,1,1,"",gb,gc);
   ml(6,4,1,1,"",gb,gc);
   ml(6,5,1,1,"",gb,gc);
   ml(6,6,1,1,"",gb,gc);
   ml(6,7,1,1,"",gb,gc);
   ml(6,8,1,1,"",gb,gc);
   ml(6,9,1,1,"",gb,gc);
   ml(6,10,1,1,"",gb,gc);
   ml(6,11,1,1,"",gb,gc);
   ml(6,12,1,1,"",gb,gc);
   ml(6,13,1,1,"",gb,gc);
   mb(7,3,1,1,b2,gb,gc);
   mb(8,2,1,2,b3,gb,gc);
   mBar(7,5,1,1,sc_l1,gb,gc);
   mBar(8,5,1,1,sc_l2,gb,gc);
   mBar(7,7,1,1,sc_theta1,gb,gc);
   mBar(8,7,1,1,sc_theta2,gb,gc);
   mBar(7,11,1,1,sc_teikou1,gb,gc);
   mBar(8,11,1,1,sc_teikou2,gb,gc);
   mBar(7,13,1,1,sc_speed,gb,gc);
   ml(7,12,1,1," 速← 速度 →遅",gb,gc);
   mBar(7,9,1,1,sc_mass1,gb,gc);
   mBar(8,9,1,1,sc_mass2,gb,gc);
   mcheck(8,0,1,1,che_g,gb,gc);
   mlb(7,4,1,1,lbar,gb,gc);
   mlb(8,4,1,1,lbar2,gb,gc);
   mlb(7,6,1,1,theta1,gb,gc);
   mlb(8,6,1,1,theta2,gb,gc);
   mlb(7,10,1,1,teikou1,gb,gc);
   mlb(8,10,1,1,teikou2,gb,gc);
   mlb(8,8,1,1,mass2,gb,gc);
   mlb(7,8,1,1,mass1,gb,gc);
   mlb(7,0,2,1,lx,gb,gc);
   mlb(1,14,4,1,l_phase,gb,gc);
   mCan(1,2,4,12,can1,gb,gc);
   mCan(1,15,8,11,can_phase,gb,gc);
   setLayout(gb);
   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.ipadx = 50;
   gc.ipady = 60;
   mCan(1,0,4,1,can_hyoudai,gb,gc);
   usePageParams();

 }
 
 

 private final String labelParam = "label";
 private final String backgroundParam = "background";
 private final String foregroundParam = "foreground";

 /**
  * このアプレットを含む HTML ページのパラメータを読み、プロパティを
  * 設定します。
  */
 private void usePageParams()
 {
  final String defaultLabel = "Default label";
  final String defaultBackground = "C0C0C0";
  final String defaultForeground = "000000";
  String labelValue;
  String backgroundValue;
  String foregroundValue;

  /**
   * アプレットを含む HTML ページから、以下のタグを読みます。
   * <PARAM NAME="label" VALUE="文字列">
   * <PARAM NAME="background" VALUE="rrggbb">
   * <PARAM NAME="foreground" VALUE="rrggbb">
   */
  labelValue = getParameter(labelParam);
  backgroundValue = getParameter(backgroundParam);
  foregroundValue = getParameter(foregroundParam);

  if ((labelValue == null) || (backgroundValue == null) ||
   (foregroundValue == null))
  {
   /**
    * HTML のタグに問題がありました。
    * 既定値で生成します。
    */
   labelValue = defaultLabel;
   backgroundValue = defaultBackground;
   foregroundValue = defaultForeground;
  }

  /**
   * アプレットのラベル文字列、背景色および前景色
   * を設定します。
   */
  label1.setText(labelValue);
  label1.setBackground(stringToColor(backgroundValue));
  label1.setForeground(stringToColor(foregroundValue));
  this.setBackground(stringToColor(backgroundValue));
  this.setForeground(stringToColor(foregroundValue));
 }

 /**
  * "rrggbb" 形式の文字列を awt.Color オブジェクトに変換します。
  */
 private Color stringToColor(String paramValue)
 {
  int red;
  int green;
  int blue;

  red = (Integer.decode("0x" + paramValue.substring(0,2))).intValue();
  green = (Integer.decode("0x" + paramValue.substring(2,4))).intValue();
  blue = (Integer.decode("0x" + paramValue.substring(4,6))).intValue();

  return new Color(red,green,blue);
 }

 /**
  * デザインツールがアプレットのプロパティを表示するための外部インターフェイスです。
  */
 public String[][] getParameterInfo()
 {
  String[][] info =
  {
   { labelParam, "String", "Label string to be displayed" },
   { backgroundParam, "String", "Background color, format \"rrggbb\"" },
   { foregroundParam, "String", "Foreground color, format \"rrggbb\"" },
  };
  return info;
 }

 Label label1 = new Label();
 

 public boolean handleEvent(Event evt)
 {
  // TODO: 独自のインプリメンテーションを追加してください。
  if (evt.target instanceof Scrollbar){
   int a=((Scrollbar)evt.target).getValue();
   String name=((Scrollbar)evt.target).getName();
   //if (name=="red_bar" )or( name=="green_bar")or( name=="blue_bar")){
   if (name=="l1_bar"){//----------------------赤の振り子の長さスクロールバー

    //double aa=(double)(((Scrollbar)evt.target).getValue());
    now_calc=0;
       stop();
    l1 =(double)a/10;
    lbar.setText("L1= "+String.valueOf(l1)+"m");
    can1.repaint();
    can_phase.repaint();
   }else if(name=="l2_bar"){//------------青の振り子の長さスクロールバー
    now_calc=0;
       stop();
    l2 =(double)a/10;
    lbar2.setText("L2= "+String.valueOf(l2)+"m");
    can1.repaint();
    can_phase.repaint();
   }else if (name=="theta1_bar"){//----------------------赤の振り子の長さスクロールバー

    //double aa=(double)(((Scrollbar)evt.target).getValue());
    now_calc=0;
       stop();

    Y[1] =(double)(a-200)/180*pi;
    Y_INIT[1]=Y[1];
     theta1.setText("θ1= "+String.valueOf(a-200)+"度");
    can1.repaint();
    can_phase.repaint();
 

   }else if(name=="theta2_bar"){//------------青の振り子の長さスクロールバー
    now_calc=0;
       stop();
    Y[2] =(double)(a-200)/180*pi;
    Y_INIT[2]=Y[2];
     theta2.setText("θ2= "+String.valueOf(a-200)+"度");
    can1.repaint();
     can_phase.repaint();
 
 

   }else if(name=="teikou_bar1"){
    now_calc=0;
       stop();
    res1=((double)a)/10;
    teikou1.setText("抵抗係数1= "+String.valueOf(res1));
    can1.repaint();
    can_phase.repaint();
    }else if(name=="teikou_bar2"){
    now_calc=0;
       stop();
    res2=((double)a)/10;
    teikou2.setText("抵抗係数2= "+String.valueOf(res2));
    can1.repaint();
    can_phase.repaint();
    }else if(name=="mass2_bar"){

    now_calc=0;
       stop();
    m2=((double)a)/10;
      m2_INIT=m2;
     mass2.setText("M2 = "+String.valueOf(m2)+"kg");
      can1.repaint();
    can_phase.repaint();
    }else if(name=="mass1_bar"){
     now_calc=0;
        stop();
       m1=((double)a)/10;
      m1_INIT=m1;
     mass1.setText("M1 = "+String.valueOf(m1)+"kg");
      can1.repaint();
    can_phase.repaint();
    }else if(name=="speed_bar"){
     interval=a;

    }

  }else if(evt.target instanceof Button){
   String name=((Button)evt.target).getName();
   if(name=="cls"){
   //cls();
   stop();
   now_calc=0;
   can1.repaint();
   can_phase.repaint();

   T=0;

   lx.setText(" 0 秒");
 

   }else if(name=="start"){
   now_calc=1;
   start1();
   }else if(name=="stop"){

   stop();
 

   }else{stop();}
 
 

  }else if(evt.target instanceof List){
   String name=((List)evt.target).getName();
  }else if(evt.target instanceof Checkbox){
   if (che_g.getState()==false){
    g=9.8;
   }else{
    g=0;
   }
  }
 
 

  return true;
 }

 public void cls(){
 can_G = can1.getGraphics();
 can_G.clearRect(0,0,320,301);
// can_G_phase = can1.getGraphics();
// can_G_phase.clearRect(0,0,600,150);

 }

 public void draw(Graphics p1)
 {

  x_disp_o_1=(int)(x_center_p+sc_p_x*Y[1]);//位相空間の古い座標の記録
  y_disp_o_1=(int)(y_center_p-sc_p_y*Y[3]);
  x_disp_o_2=(int)(x_center_p+sc_p_x*Y[2]);
  y_disp_o_2=(int)(y_center_p-sc_p_y*Y[4]);

  p1 = can1.getGraphics();
   for (int i=0;i<200;i++){
      Y[0]=Y[0]+ dt;

   for(int j=0;j< 4 ; j++ ){

    SS = Math.sin(Y[1] - Y[2]);
    CC = Math.cos(Y[1] - Y[2]);
    s1 = Math.sin(Y[1]);
    s2 = Math.sin(Y[2]);
     Q_temp = Q_1;
     K_temp = dt * Y[3];
     r = k[j] * (K_temp - kkk[j] * Q_temp);
     y1 = Y[1] + r;
     Q_1 = Q_temp + 3 * r - kk[j] * K_temp;
     Q_temp = Q_2;
     K_temp = dt * Y[4];
    r = k[j] * (K_temp - kkk[j] * Q_temp);
    y2 = Y[2] + r;
    Q_2 = Q_temp + 3 * r - kk[j] * K_temp;
   Q_temp = Q_3;
   K_temp = -dt * (l1 * SS * CC * Y[3] * Y[3] + l2 * SS * Y[4] * Y[4] + g * (mu * s1 - s2 * CC) - (l1 * l2 * res2 * CC * CC - l1 * l2 * (res1 + res2 * SS * SS)) * Y[3] / l2 / m2 - l2 * res2 * CC * Y[4] / m2) / l1 / (mu - CC * CC);
   r = k[j] * (K_temp - kkk[j] * Q_temp);
   y3 = Y[3] + r;
   Q_3 = Q_temp + 3 * r - kk[j] * K_temp;
   Q_temp = Q_4;
   K_temp = dt * (l2 * SS * CC * Y[4] * Y[4] + mu * l1 * SS * Y[3] * Y[3] + g * mu * (CC * s1 - s2) + l1 * CC * (res1 + res2 * SS * SS) * Y[3] / m2 - l2 * res2 * mu * (l1 * CC * Y[3] + l2 * Y[4]) / m2 / l2) / l2 / (mu - CC * CC);
   r = k[j] * (K_temp - kkk[j] * Q_temp);
   y4 = Y[4] + r;
    Q_4 = Q_temp + 3 * r - kk[j] * K_temp;
   Y[1] = y1;
   Y[2] = y2;
   Y[3] = y3;
   Y[4] = y4;
   }
  }//roop i

      r2=(int)( Math.pow(m2*80,1.0/3.0) )*2;
      r1=(int)( Math.pow(m1*80,1.0/3.0))*2;
      new_x_1=(int)(x_center+sc*l1*Math.sin(Y[1]));
      new_x_2= (int)(x_center+sc*l1*Math.sin(Y[1])+sc*l2*Math.sin(Y[2])   );
      new_y_1=(int)( y_center+sc*l1*Math.cos(Y[1]));
      new_y_2= (int)( y_center+sc*l1*Math.cos(Y[1])+sc*l2*Math.cos(Y[2])  );
      circle_newx_1=x_center+(int)(sc*l1*Math.sin(Y[1])-r1/2);
      circle_newy_1= y_center+(int)(sc*l1*Math.cos(Y[1])-r1/2);
      circle_newx_2=x_center+(int)(sc*l1*Math.sin(Y[1])+sc*l2*Math.sin(Y[2]) -r2/2 );
      circle_newy_2= y_center+(int)(sc*l1*Math.cos(Y[1])+sc*l2*Math.cos(Y[2]) -r2/2);
       cls();
      p1.setColor(theColor);
      p1.drawLine(new_x_1,new_y_1,x_center,y_center);
      p1.drawLine(new_x_1,new_y_1, new_x_2,new_y_2  );
      p1.setColor(theColor1);
      p1.fillOval(circle_newx_1,circle_newy_1,r1,r1);
      p1.setColor(theColor2);
      p1.fillOval(circle_newx_2,circle_newy_2,r2,r2  );
      old_x_1=new_x_1;
      old_x_2=new_x_2;
      old_y_1=new_y_1;
      old_y_2=new_y_2;
      circlex_1=circle_newx_1;
      circlex_2=circle_newx_2;
      circley_1=circle_newy_1;
      circley_2=circle_newy_2;
      kaisuu_x=(int)Math.round(Y[0]);
      lx.setText(String.valueOf(kaisuu_x)+" 秒");
      p1 = can_phase.getGraphics();//      位相空間の描画
      p1.setColor(theColorY);                   //座標軸の表示
      p1.drawLine(0,y_center_p,550,y_center_p);
      for(int i=0;i<9;i++){
      p1.drawLine(x_center_p+(int)((double)i*(double)sc_p_x*2*pi),0,x_center_p+(int)((double)i*(double)sc_p_x*2*pi),150);
      p1.drawLine(x_center_p-(int)((double)i*(double)sc_p_x*2*pi),0,x_center_p-(int)((double)i*(double)sc_p_x*2*pi),150);
         }
     if(Y[1]>16*pi){                               //画面からはみ出したときの処理
      Y[1]=Y[1]-32*pi;
      x_disp_o_1=(int)(x_center_p+sc_p_x*Y[1]);   //位相空間の古い座標の更新
      p1.clearRect(0,0,600,150);                   //キャンバスの消去
      }
       if(Y[1]<-16*pi){                           //画面からはみ出したときの処理
      Y[1]=Y[1]+32*pi;
      x_disp_o_1=(int)(x_center_p+sc_p_x*Y[1]);   //位相空間の古い座標の更新
      p1.clearRect(0,0,600,150);                   //キャンバスの消去
      }
     if(Y[2]>16*pi){                              //画面からはみ出したときの処理
      Y[2]=Y[2]-32*pi;
      x_disp_o_2=(int)(x_center_p+sc_p_x*Y[2]);   //位相空間の古い座標の更新
      p1.clearRect(0,0,600,150);                   //キャンバスの消去
      }

      if(Y[2]<-16*pi){                           //画面からはみ出したときの処理
      Y[2]=Y[2]+32*pi;
      x_disp_o_2=(int)(x_center_p+sc_p_x*Y[2]);   //位相空間の古い座標の更新
      p1.clearRect(0,0,600,150);                   //キャンバスの消去
      }
 

  int x=(int)(x_center_p+sc_p_x*Y[1]);           //red
  int y=(int)( y_center_p-sc_p_y*Y[3]);
  p1.setColor(theColorp1);
  p1.drawLine(x,y,x_disp_o_1,y_disp_o_1);
  //p1 = can_phase.getGraphics();
  p1.setColor(theColorp2);
  int xx=(int)(x_center_p+sc_p_x*Y[2]);           //blue
  int yy=(int)( y_center_p-sc_p_y*Y[4]);
  p1.drawLine(xx,yy,x_disp_o_2,y_disp_o_2);

 }
 

 public void paint(Graphics p1)  {
   super.paint(p1);
 }
 

 public void start1()
 {

  if (runThread==null){
   runThread=new Thread(this);
   runThread.start();
  }

  super.start();
 }

 public void stop()
 {
  if (runThread != null){
   runThread.stop();
   runThread = null;

  }
  super.stop();
 }

 public void update(Graphics p1)
 {

 }

 public Insets insets()
 {

  return new Insets(10,10,10,10);
 }
 
 
 

}