ボーア模型の酸素原子 (O) を視覚化するサンプルJAVAプログラム

水分子のページに戻る
酸素のページに戻る
トップページ(2電子原子も含む新ボーア模型)

このプログラムは少し長いので、下に示すソースプログラムをコピーして、テキストエディタ(メモ帳など)にそのまま貼り付けて、コンパイルすれば簡単に実行できる。
このプログラムの class file name は oxygen2 なので、このデキストエディタを "oxygen2.java" のファイル名で保存してコンパイルしてほしい。

このプログラムでは、酸素原子核(灰色の円)は、(9285.6 MM, 12499 MM, 11857 MM) に位置している。
ここでは、新しい単位として ( 1 MM = 10-14 meter, 1 SS = 10-21 second, 1 MM/SS = 107 m/s ) を使っている。
テキストボックス内の電子の各座標 (+X (MM), +Y (MM), +Z (MM)) は、この原子核からの”相対的な”位置座標を示している。
"VX: VY: VZ" は電子の初速度の各成分の比を示している。
つまり、(VX: VY; VZ)=(100:100;0) は、(VX: VY: VZ) = (10:10:0) と同じ意味である。
スクロールバーの中から、ド・ブロイ波の数 wn = (0.1 -- 2.0) を選んで、"orbit" ボタンをクリックすると、このプログラムは、軌道に含まれるド・ブロイ波の数が wn になるまで電子軌道計算を続ける。
それから、"retur" ボタンをクリックすると、すべての電子は、また最初のスタートラインの状態に戻ることができる。
また、各電子の座標と速度ベクトルの方向は、テキストボックス内の値をかえて、"Enter" キーを押せば、自由に変更可能である。
また、"radiu" ボタンの隣のテキストボックスに a (MM) の値を入力して "radiu" ボタンをクリックすれば、6つの電子の正八面体の大きさ(半径)が変化する。


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Scanner;
public class oxygen2 extends JPanel     // visualization of oxygen atom
 {
  public static void main(String arg[])
 {                                      // set frame
   JFrame frame = new JFrame("visualization of oxygen");
   J2DPanel j2dpanel = new J2DPanel();
   frame.getContentPane().add(j2dpanel);
   frame.setSize(1180,700);
   frame.setVisible(true);
   frame.setBackground(Color.black);
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  }
  }
 class J2DPanel extends JPanel implements AdjustmentListener, ActionListener
  {
    
    double pai=3.141592653589793; double epsi=8.85418781787346e-12;
   double h=6.62606896e-34; double elc=1.60217653e-19;
   double me=9.1093826e-31;  
    JTextField elp[][]=new JTextField[6][7];     // coordinate and velocity text
    JTextField impho=new JTextField(7);
    JButton b1=new JButton("orbit");            // button definition
    JButton b2=new JButton("retur");
    JButton b3=new JButton("radiu");
    
    String ope[]={"0.1","0.3","0.5","0.7","0.9","1.1","1.3","1.5","1.7","1.9","2.0"};
    JComboBox coom=new JComboBox(ope);          // de Broglie's wave selection
    
    double rtw=Math.sqrt(2); double rth=Math.sqrt(3); double rsi=Math.sqrt(6); 
    double rfi=Math.sqrt(5); int marki[]={0,0,0,0,0,0,0,0};  // marki=marking
    double hpr[][]=new double[6][7]; double hhpr[][]=new double[6][7];
    double nux[]={9285.64, 12499.90, 11857.08};    // nux=nucleus coordinate (MM)

   public J2DPanel()
  {
   setBackground(Color.black);
   JPanel p=new JPanel();  p.setLayout(new GridLayout(9,8));
   String vv,zww; int aaa=0; 
  
   for (int el=0; el <=5; el++) {     // elp[el][0-2]=each electron's coordinate
   for (int pos=0; pos <=2; pos++) {
   elp[el][pos]=new JTextField(7); elp[el][pos].addActionListener(this);
   }}

   for (int el=0; el <=5; el++) {
   for (int pos=3; pos <=6; pos++) {  // elp[][3-6]=other parameterts of electron
   elp[el][pos]=new JTextField(7);
   if (pos > 3) {elp[el][pos].addActionListener(this);}
   }}                                      
                                       // layout

   String mida[][]={{"Nucleus", "X = 9285.6", "Y = 12499", "Z = 11857", 
   "  ---  ", " --- ", "  --- ", "  --- "},
    {"Electron","+ X (MM)","+ Y (MM)","+ Z (MM)", "nuc(MM)","  VX : ", "  VY : ", "  VZ : "}};
   for (int ett=0; ett <=1; ett++) {
   for (int pos=0; pos <=7; pos++) {
   p.add(new Label(mida[ett][pos]));}}

    for (int el=0; el <=5; el++) {
    p.add(new Label("ele "+el+" "));
    for (int pos=0; pos <=6; pos++) {
    p.add(elp[el][pos]); elp[el][pos].setText("0");
   }}

   p.add(b1); p.add(coom); p.add(b2); p.add(b3); p.add(impho);
   p.add(new Label("  ---  ")); p.add(new Label("  ---  ")); p.add(new Label("  ---  "));
   impho.setText("3820"); coom.setSelectedItem("1.9");  
  
   b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);
   add(p,"South");
                                        // hpr[0-5][0-2]=initial coordinates of electrons                         

  double sd1=3820.0; double sd2=sd1/rtw; double sd3=(rth*sd1)/2;double sd4=sd1/2.0;
  hpr[0][0]=sd4+nux[0]; hpr[1][0]=hpr[0][0]; hpr[2][0]=nux[0]-sd4; hpr[3][0]=hpr[2][0];
  hpr[0][1]=nux[1]-sd3; hpr[3][1]=hpr[0][1]; hpr[1][1]=nux[1]+sd3; hpr[2][1]=hpr[1][1];
  hpr[4][0]=nux[0]+sd1; hpr[5][0]=nux[0]-sd1; hpr[4][1]=nux[1]; hpr[5][1]=hpr[4][1];
  hpr[0][2]=nux[2]+sd2; hpr[1][2]=hpr[0][2]; hpr[5][2]=hpr[0][2]; 
  hpr[2][2]=nux[2]-sd2; hpr[3][2]=hpr[2][2]; hpr[4][2]=hpr[2][2];

    double zah1=0.0; int zai1=0;
    for (int el=0; el <=5; el++) {
   for (int pos=0; pos <=2; pos++) {            // calculate coordinate to two decimal places
                                               // change to the relative coordinate
   zai1=(int)(100*(hpr[el][pos]-nux[pos]));  zah1=zai1/100.0;       
   elp[el][pos].setText(Double.toString(zah1)); hhpr[el][pos]=hpr[el][pos];
   }}
                                                 // initial velocity vector of electron

  double velo[][]={{866,500,0},{-866,500,0},{-866,-500,0},{866,-500,0},{0,1000,0},{0,-1000,0}};
  
  for (int el=0; el <=5; el++) {             
  for (int pos=0; pos <=2; pos++) {
  hpr[el][pos+4]=velo[el][pos]; hhpr[el][pos+4]=hpr[el][pos+4];
                                                     // set initial velocity vector of electron
  elp[el][pos+4].setText(Double.toString((double)velo[el][pos])); 
  }}

  double inik=0.0;                        // initial distance between nucleus and electron
  for (int el=0; el <=5; el++) {      
  inik=Math.sqrt((hpr[el][0]-nux[0])*(hpr[el][0]-nux[0])+
  (hpr[el][1]-nux[1])*(hpr[el][1]-nux[1])+(hpr[el][2]-nux[2])*(hpr[el][2]-nux[2]));
  hpr[el][3]=inik; hhpr[el][3]=inik;
  aaa=(int)(inik*100.0); inik=aaa/100.0;  // calculate the diatance to two decimal places
   elp[el][3].setText(Double.toString(inik));
  }
  }  // method  end
 
  
  public void adjustmentValueChanged(AdjustmentEvent e) {
   repaint();
   }

   public void actionPerformed(ActionEvent e)  {
     String ss;
    int RR; double Rf1,Rf2,Rf3,Rf4; int teis=0;
    for (int ett=0; ett <=5; ett++) {       // when coordinate texts change
    for (int sws=0; sws <=2; sws++) {       // marki[2] becomes 2 only after orbiting  
    if (e.getSource()==elp[ett][sws] && marki[2] !=2 ) {
    marki[4]=1;                                       
    ss=elp[ett][sws].getText(); Rf1=Double.parseDouble(ss);  
    Rf2=(Rf1+nux[sws])/71.428;   // plus nuclear coordinate and change to pixel
    Rf3=Rf1+nux[sws]; hpr[ett][sws]=Rf3; hhpr[ett][sws]=Rf3;
                                  // upper and lower limits of coordinate                                     
    if (Rf2 > 319 && sws==0) {Rf3=319*71.428;teis=1;}  
    if (Rf2 > 349 && sws==2) {Rf3=349*71.428;teis=1;}
    if (Rf2 > 349 && sws==1) {Rf3=349*71.428;teis=1;}
    if (Rf2 < 1) {Rf3=71.428;teis=1;}

    RR=(int)(100*(Rf3-nux[sws]));  // change to relative coordinate
    Rf1=RR/100.0;
    if (teis==1) {elp[ett][sws].setText(Double.toString(Rf1));}
    }}}

   if (e.getSource() == b1 && marki[2] !=2) {marki[0]=1;}
   if (e.getSource() == b2) {marki[1]=1;}    // b2=return to the starting points
   if (e.getSource() == b3 && marki[2] !=2) {   // change radius of octahedron
   marki[4]=1;                          // marki[4] becomes 1 when coordinates change
   ss=impho.getText(); Rf1=Double.parseDouble(ss); 
   Rf2=Rf1/rtw; Rf3=(rth*Rf1)/2.0; Rf4=Rf1/2.0;
   hpr[0][0]=Rf4+nux[0]; hpr[1][0]=hpr[0][0]; hpr[2][0]=nux[0]-Rf4; hpr[3][0]=hpr[2][0];
   hpr[0][1]=nux[1]-Rf3; hpr[3][1]=hpr[0][1]; hpr[1][1]=nux[1]+Rf3; hpr[2][1]=hpr[1][1];
   hpr[4][0]=nux[0]+Rf1; hpr[5][0]=nux[0]-Rf1; hpr[4][1]=nux[1]; hpr[5][1]=hpr[4][1];
   hpr[0][2]=nux[2]+Rf2; hpr[1][2]=hpr[0][2]; hpr[5][2]=hpr[0][2]; 
   hpr[2][2]=nux[2]-Rf2; hpr[3][2]=hpr[2][2]; hpr[4][2]=hpr[2][2];
    for (int ett=0; ett <=5; ett++) {
    for (int sws=0; sws <=2; sws++) {          // calculate the values to two decimal places
   RR=(int)(100*(hpr[ett][sws]-nux[sws])); Rf1=RR/100.0;
   elp[ett][sws].setText(Double.toString(Rf1));
   hhpr[ett][sws]=hpr[ett][sws];
   }}
   }
   repaint();
   }

  public void update(Graphics g)  {
  paint(g);
   }

  public void paintComponent(Graphics g)  {

  double kro,krr,krk,pot,pota,potb,gx,gy,gz; int ex,ey,ez,xk,yk,zk; String ww,pyw;
  double rhp[][]= {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}; 
   int qpp[][]=new int[6][3];  
   double ggx,ggy,ggz; double ttav,toav; int tttav;
   
   ggx=0.0; ex=0;
   if (marki[2] != 2) {                       // get values from textfield 
   for (int ett=0; ett <=5; ett++) {
    for (int sws=3; sws <=6; sws++) {
    ww=elp[ett][sws].getText(); ggx=Double.parseDouble(ww);
    hpr[ett][sws]=ggx; hhpr[ett][sws]=hpr[ett][sws];
    }}}
  
   if (marki[1]==1 && marki[2]==2) {          // return to the starting points
    for (int qz=0; qz <=5; qz++) {
   for (int ka=0; ka <=6; ka++)      { 
   if (ka < 3) {ggx=hpr[qz][ka]-nux[ka]; ex=(int)(100*ggx); ggx=ex/100.0;}  
   else {ex=(int)(100*hpr[qz][ka]); ggx=ex/100.0; }
   elp[qz][ka].setText(Double.toString(ggx));
   hhpr[qz][ka]=hpr[qz][ka];
   }}
   marki[1]=0;  marki[2]=0; 
   }
  
   if (marki[2] !=2) {           // before calculation of electron's orbit

   toav=0.0;                    // toav =total potential energy
   for (int yp=0; yp <=5; yp++) {   // calculate repulsive forces between electrons
   for (int kj=0; kj <= 5; kj++) {
 
   if (yp < kj ) {
                                   // kro=distance between electrons
   kro=Math.sqrt((hpr[yp][0]-hpr[kj][0])*(hpr[yp][0]-hpr[kj][0])+
  (hpr[yp][1]-hpr[kj][1])*(hpr[yp][1]-hpr[kj][1])+(hpr[yp][2]-hpr[kj][2])*(hpr[yp][2]-hpr[kj][2]));
   if (kro==0) {kro=5000.0;}
                                   // pot=potential energy between electrons (J)
   pot=(elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14); 
                                  // rhp[][0]=potential energy of each electron
   rhp[yp][0]=rhp[yp][0]+pot/2;  rhp[kj][0]=rhp[kj][0]+pot/2; 
   toav=toav+pot;
   } 
   } }
   
   for (int rv=0; rv <=5; rv++) {
                                   // kro=distance between O nucleus and electrons
   kro=Math.sqrt((hpr[rv][0]-nux[0])*(hpr[rv][0]-nux[0])+
  (hpr[rv][1]-nux[1])*(hpr[rv][1]-nux[1])+(hpr[rv][2]-nux[2])*(hpr[rv][2]-nux[2])); 
   if (kro == 0) {kro=5000.0;}
   hpr[rv][3]=kro; hhpr[rv][3]=kro;
   ex=(int)(100.0*kro); ggx=ex/100.0;  // calculate to two decimal place
   elp[rv][3].setText(Double.toString(ggx));  // show nuc(MM)
                                
   ttav= (-6*elc*elc*6.241509e18)/(4*pai*epsi*kro*1.0e-14);
   rhp[rv][0]=rhp[rv][0]+ttav; toav=toav+ttav;   // add potential energy
   }
   
                                    //  distribute each kinetic energy based on each V 
   gy=-433.103/6;          // -433.103=total energy(eV) of oxygen (of six valence electrons)
   for (int rv=0; rv <=5; rv++) {
    rhp[rv][1]=gy-rhp[rv][0];     // rhp[][1]=kinetic energy (eV) 
   }
   }   //  if (marki[2] !=2 ) end
 
  
                               // ----------orbit calculation start  ----------
  if (marki[0]==1) {    // put orbit button
  
  double sj[][]=new double[6][13]; double wn=0.0; double nvx[]=new double[3];
  String pew=(String)coom.getSelectedItem(); 
   if (pew == "0.1") {wn=0.1;} if (pew == "0.3") {wn=0.3;}
   if (pew == "0.5") {wn=0.5;} if (pew == "0.7") {wn=0.7;}
   if (pew == "0.9") {wn=0.9;} if (pew == "1.1") {wn=1.1;}
   if (pew == "1.3") {wn=1.3;} if (pew == "1.5") {wn=1.5;}
   if (pew == "1.7") {wn=1.7;} if (pew == "1.9") {wn=1.9;}
   if (pew == "2.0") {wn=2.0;}
   for (int kj=0; kj <=2; kj++) {
  nvx[kj]=nux[kj]*1.0e-14; }       // change MM to meter in O nucleus
  
   for (int yp=0; yp <=5; yp++) {
   sj[yp][9]=0.0;                   // sj[][9]=number of de Broglie's waves
   gx=Math.sqrt(hpr[yp][4]*hpr[yp][4]+hpr[yp][5]*hpr[yp][5]+hpr[yp][6]*hpr[yp][6]);
   gy=Math.sqrt((2.0*rhp[yp][1]*1.602177e-19)/me);  // gy=initial velocity (m/s)

   for (int kj=0; kj <=2; kj++) { 
   sj[yp][kj] = hpr[yp][kj]; sj[yp][kj+6]=sj[yp][kj];  //sj[][0-2], sj[][6-8] =each coordinate
   sj[yp][kj+3]=(gy*1.0e-7*hpr[yp][kj+4])/gx;    // sj[][3-5] =each component of velocity(MM/SS)
   sj[yp][kj+10]=0.0;                  // sj[][10-12] =each component of acceleration (MM/SS^2)
   }}

   double ac=(elc*elc)/(4*pai*epsi*me);
  
   do {
   for (int yp=0; yp <=5; yp++) {
   for (int kj=0; kj <=2; kj++) {
   sj[yp][kj]=sj[yp][kj+6]+sj[yp][kj+3];  // electron's position(MM) after 1SS
   sj[yp][10+kj]=0.0;
   }}
   for (int yp=0; yp <=5; yp++) {
   gx=sj[yp][3]*sj[yp][3]+sj[yp][4]*sj[yp][4]+sj[yp][5]*sj[yp][5];
   sj[yp][9]=sj[yp][9]+(me*gx*1.0e-7)/h;       // add de Brogli's waves
   for (int kj=0; kj <=2; kj++) {
   sj[yp][kj+6]=sj[yp][kj+6]*1.0e-14;        // change MM to meter
   }}
     for (int yp=0; yp <=5; yp++) {       // interaction between electrons
   for (int kj=0; kj <=5; kj++) {
   if (yp < kj) {                    // gy=distances between electrons
   gy=Math.sqrt((sj[yp][6]-sj[kj][6])*(sj[yp][6]-sj[kj][6])+
  (sj[yp][7]-sj[kj][7])*(sj[yp][7]-sj[kj][7])+(sj[yp][8]-sj[kj][8])*(sj[yp][8]-sj[kj][8]));
   for (int rv=0; rv <=2; rv++) {
   gx=(1.0e-28*ac*(sj[yp][rv+6]-sj[kj][rv+6]))/(gy*gy*gy);  // set acceleration(gx) at sj[][10-12] 
   sj[yp][rv+10]=sj[yp][rv+10]+gx ;sj[kj][rv+10]=sj[kj][rv+10]-gx ;
   }}}}
     
    for (int yp=0; yp <=5; yp++) {                   // gy=distances between electron and O nucleus
   gy=Math.sqrt((sj[yp][6]-nvx[0])*(sj[yp][6]-nvx[0])+
  (sj[yp][7]-nvx[1])*(sj[yp][7]-nvx[1])+(sj[yp][8]-nvx[2])*(sj[yp][8]-nvx[2]));
   for (int rv=0; rv <=2; rv++) {
   gx=(1.0e-28*6.0*ac*(sj[yp][rv+6]-nvx[rv]))/(gy*gy*gy); // gx=acceleration by nucleus
   sj[yp][rv+10]=sj[yp][rv+10]-gx;
   }}
 
   for (int yp=0; yp <=5; yp++) {
    for (int kj=0; kj <=2; kj++) {
   sj[yp][kj+6]=sj[yp][kj];
   sj[yp][kj+3]=sj[yp][kj+3]+sj[yp][kj+10];  // change velocity vector
    }}

    } while (sj[0][9] < wn );     // repeat above until de Broglie's waves becomes wn
                                    
    marki[2]=2;                 // marki[2] becomes 2 only after orbit calculation
   for (int yp=0; yp <=5; yp++) { 
   for (int kj=0; kj <=2; kj++) { 
    hhpr[yp][kj]=sj[yp][kj]; ggx=sj[yp][kj]/71.428;  // ggx=pixel 
    
                                        // upper and lower limits of coordinates
    if (ggx > 319 && kj==0) {ggx=319;  hhpr[yp][kj]=ggx*71.428; }
    if (ggx > 349 && kj==1) {ggx=349; hhpr[yp][kj]=ggx*71.428;}
    if (ggx > 349 && kj==2) {ggx=349;  hhpr[yp][kj]=ggx*71.428;}
    if (ggx < 1) {ggx=1; hhpr[yp][kj]=ggx*71.428;}
   
   yk=(int)(100.0*(hhpr[yp][kj]-nux[kj])); gx=yk/100.0;  // calculate to two decimal places
   elp[yp][kj].setText(Double.toString(gx));
  
   ggx=Math.sqrt(sj[yp][3]*sj[yp][3]+sj[yp][4]*sj[yp][4]+sj[yp][5]*sj[yp][5]);
   ggy=(1000*sj[yp][kj+3])/ggx; ex=(int)ggy; hhpr[yp][kj+4]=ggy;
   elp[yp][kj+4].setText(Double.toString((double)ex));         // print each component of velocity
   } 
   ggz=Math.sqrt((hhpr[yp][0]-nux[0])*(hhpr[yp][0]-nux[0])+
  (hhpr[yp][1]-nux[1])*(hhpr[yp][1]-nux[1])+(hhpr[yp][2]-nux[2])*(hhpr[yp][2]-nux[2])); 
    hhpr[yp][3]=ggz;
    ex=(int)(ggz*100.0); ggx=ex/100.0;  // calculate to two decimal place
   elp[yp][3].setText(Double.toString(ggx));  // show distance between nucleus and electron
     }
    }   // if (mark[0]==1) end
   
   if (marki[2] != 2 || marki[0]==1 ) {      // show each particle on the screen
  
   for (int yp=0; yp <=5; yp++) {
   pota=Math.sqrt(60)*4.25;              // velocity line length (pixel)
   potb=Math.sqrt(hhpr[yp][4]*hhpr[yp][4]+hhpr[yp][5]*hhpr[yp][5]+hhpr[yp][6]*hhpr[yp][6]) ;
                                         // qpp[][0-2]=each component of velocity for print
    ggx=(pota*hhpr[yp][4])/potb; qpp[yp][0]=(int)ggx;
    ggx=(pota*hhpr[yp][5])/potb; qpp[yp][1]=(int)ggx;
    ggx=(pota*hhpr[yp][6])/potb; qpp[yp][2]=(int)ggx;
    }                      

   int nmx[]=new int[3]; int hpk[][]=new int[6][4];
   for (int kj=0; kj <=2; kj++) {
   nmx[kj]=(int)(nux[kj]/71.428);   // change to pixel in nucleus coordinate
    }
    for (int yp=0; yp <=5; yp++) {
     for (int kj=0; kj <=2; kj++) {   // change to pixel in electron coordinate
    hpk[yp][kj]=(int)(hhpr[yp][kj]/71.428);
    }}
   g.clearRect(9,299,1170,699);
   g.setColor(Color.cyan); g.drawLine(345,310,345,660); g.drawLine(675,310,675,660);

   g.setColor(Color.lightGray);       // show O nucleus on x-y, x-z, y-z planes
   g.fillOval(nmx[0]+10,650-nmx[1],20,20);g.fillOval(340+nmx[0],650-nmx[2],20,20);
   g.fillOval(670+nmx[1],650-nmx[2],20,20);

                             // show particle and velocity vector of electron 0 
   g.setColor(Color.white);                                           
   g.fillOval(hpk[0][0]+13,653-hpk[0][1],14,14); 
   g.fillOval(hpk[0][0]+343,653-hpk[0][2],14,14);
   g.fillOval(hpk[0][1]+673,653-hpk[0][2],14,14);                                     
   g.drawLine(hpk[0][0]+20,660-hpk[0][1], hpk[0][0]+20+qpp[0][0],660-hpk[0][1]-qpp[0][1]);
   g.drawLine(hpk[0][0]+350,660-hpk[0][2], hpk[0][0]+350+qpp[0][0],660-hpk[0][2]-qpp[0][2]);
   g.drawLine(hpk[0][1]+680,660-hpk[0][2],hpk[0][1]+680+qpp[0][1],660-hpk[0][2]-qpp[0][2]); 
 
                                             // show electron 1
   g.fillOval(hpk[1][0]+13,653-hpk[1][1],14,14); 
   g.fillOval(hpk[1][0]+343,653-hpk[1][2],14,14);
   g.fillOval(hpk[1][1]+673,653-hpk[1][2],14,14);
   g.drawLine(hpk[1][0]+20,660-hpk[1][1], hpk[1][0]+20+qpp[1][0],660-hpk[1][1]-qpp[1][1]);
   g.drawLine(hpk[1][0]+350,660-hpk[1][2], hpk[1][0]+350+qpp[1][0],660-hpk[1][2]-qpp[1][2]);
   g.drawLine(hpk[1][1]+680,660-hpk[1][2],hpk[1][1]+680+qpp[1][1],660-hpk[1][2]-qpp[1][2]);  

                                            // show electron 2
   g.setColor(Color.red);
   g.fillOval(hpk[2][0]+13,653-hpk[2][1],14,14);
   g.fillOval(hpk[2][0]+343,653-hpk[2][2],14,14);
   g.fillOval(hpk[2][1]+673,653-hpk[2][2],14,14);
   g.drawLine(hpk[2][0]+20,660-hpk[2][1], hpk[2][0]+20+qpp[2][0],660-hpk[2][1]-qpp[2][1]);
   g.drawLine(hpk[2][0]+350,660-hpk[2][2], hpk[2][0]+350+qpp[2][0],660-hpk[2][2]-qpp[2][2]);
   g.drawLine(hpk[2][1]+680,660-hpk[2][2],hpk[2][1]+680+qpp[2][1],660-hpk[2][2]-qpp[2][2]);  

                                             // show electron 3
   g.fillOval(hpk[3][0]+13,653-hpk[3][1],14,14);
   g.fillOval(hpk[3][0]+343,653-hpk[3][2],14,14);
   g.fillOval(hpk[3][1]+673,653-hpk[3][2],14,14);
   g.drawLine(hpk[3][0]+20,660-hpk[3][1], hpk[3][0]+20+qpp[3][0],660-hpk[3][1]-qpp[3][1]);
   g.drawLine(hpk[3][0]+350,660-hpk[3][2], hpk[3][0]+350+qpp[3][0],660-hpk[3][2]-qpp[3][2]);
   g.drawLine(hpk[3][1]+680,660-hpk[3][2],hpk[3][1]+680+qpp[3][1],660-hpk[3][2]-qpp[3][2]);  

                                              // show electron 4
   g.setColor(Color.green);
   g.fillOval(hpk[4][0]+13,653-hpk[4][1],14,14);
   g.fillOval(hpk[4][0]+343,653-hpk[4][2],14,14);
   g.fillOval(hpk[4][1]+673,653-hpk[4][2],14,14);
   g.drawLine(hpk[4][0]+20,660-hpk[4][1], hpk[4][0]+20+qpp[4][0],660-hpk[4][1]-qpp[4][1]);
   g.drawLine(hpk[4][0]+350,660-hpk[4][2], hpk[4][0]+350+qpp[4][0],660-hpk[4][2]-qpp[4][2]);
   g.drawLine(hpk[4][1]+680,660-hpk[4][2],hpk[4][1]+680+qpp[4][1],660-hpk[4][2]-qpp[4][2]);  

                                              // show electron 5
   g.fillOval(hpk[5][0]+13,653-hpk[5][1],14,14);
   g.fillOval(hpk[5][0]+343,653-hpk[5][2],14,14);
   g.fillOval(hpk[5][1]+673,653-hpk[5][2],14,14);
   g.drawLine(hpk[5][0]+20,660-hpk[5][1], hpk[5][0]+20+qpp[5][0],660-hpk[5][1]-qpp[5][1]);
   g.drawLine(hpk[5][0]+350,660-hpk[5][2], hpk[5][0]+350+qpp[5][0],660-hpk[5][2]-qpp[5][2]);
   g.drawLine(hpk[5][1]+680,660-hpk[5][2],hpk[5][1]+680+qpp[5][1],660-hpk[5][2]-qpp[5][2]);  
  
                                            // show each electron's number
   for (int rw=0; rw <=5; rw++) {
    g.setColor(Color.blue);
    g.drawString(Integer.toString(rw),hpk[rw][0]+17,665-hpk[rw][1]);
    g.drawString(Integer.toString(rw),hpk[rw][0]+347,665-hpk[rw][2] );
    g.drawString(Integer.toString(rw),hpk[rw][1]+677,665-hpk[rw][2] );
     }
   marki[0]=0;
      }                  // if (marki[2] !=2 || marki[0] =1) end
    }}