/* */ import java.awt.*; import java.applet.*; public class chpt01 extends Applet implements Runnable { private Thread m_chpt01 = null; private double m_mu; private double m_dmu; double ua=0.5d;double ub=0.5d; double t=0.05d;double gl=9.8d; int wa=50; int ha=25; double va=0; double aa=0; int wb=200;int hb=30; double vb=0; double ab=0; double fa=0;double fb=0;double ma;double mb; double xa=60; double ya=150; double xb=xa - 50;double yb=ya + ha; double vya = 0;//速度のy成分 int xl=(int)Math.round(xa) + wa; int yl=(int)Math.round(ya) + (ha / 2);int wl=150; Graphics m_OffGC;Image m_OffScreen; int mox=377;int moy=300; int xarrow;//摩擦力の描画で使用 public void init() { super.init(); //{{INIT_CONTROLS setLayout(null); resize(500,300); b_init=new Button("初期化"); add(b_init); b_init.reshape(378,7,91,30); s_mu= new Scrollbar(Scrollbar.HORIZONTAL,(int)(0.7*100),5,0,100); add(s_mu); s_mu.reshape(378,45,84,15); s_dmu= new Scrollbar(Scrollbar.HORIZONTAL,(int)(0.5*100),5,0,100); add(s_dmu); s_dmu.reshape(378,67,84,15); s_ma= new Scrollbar(Scrollbar.HORIZONTAL,(int)(2*10),5,0,100); add(s_ma); s_ma.reshape(378,89,84,15); s_mb= new Scrollbar(Scrollbar.HORIZONTAL,(int)(5*10),5,0,100); add(s_mb); s_mb.reshape(378,111,84,15); //}} //オフスクリーンを作る try { // m_OffScreen = createImage(size().width,size().height); m_OffScreen = createImage(mox,moy); } catch(Exception e) { } if (m_OffScreen != null) { m_OffGC = m_OffScreen.getGraphics(); } } public boolean handleEvent(Event event) { if ((event.id == Event.SCROLL_ABSOLUTE && event.target == s_mu) |(event.id == Event.SCROLL_PAGE_DOWN && event.target == s_mu) |(event.id == Event.SCROLL_PAGE_UP && event.target == s_mu) |(event.id == Event.SCROLL_LINE_DOWN && event.target == s_mu) |(event.id == Event.SCROLL_LINE_UP && event.target == s_mu)) { scrollAbsoluteSMu(event); return true; } else if ((event.id == Event.SCROLL_ABSOLUTE && event.target == s_dmu) |(event.id == Event.SCROLL_PAGE_DOWN && event.target == s_dmu) |(event.id == Event.SCROLL_PAGE_UP && event.target == s_dmu) |(event.id == Event.SCROLL_LINE_DOWN && event.target == s_dmu) |(event.id == Event.SCROLL_LINE_UP && event.target == s_dmu)) { scrollAbsoluteSDmu(event); return true; } else if ((event.id == Event.SCROLL_ABSOLUTE && event.target == s_ma) |(event.id == Event.SCROLL_PAGE_DOWN && event.target == s_ma) |(event.id == Event.SCROLL_PAGE_UP && event.target == s_ma) |(event.id == Event.SCROLL_LINE_DOWN && event.target == s_ma) |(event.id == Event.SCROLL_LINE_UP && event.target == s_ma)) { scrollAbsoluteSMa(event); return true; } else if ((event.id == Event.SCROLL_ABSOLUTE && event.target == s_mb) |(event.id == Event.SCROLL_PAGE_DOWN && event.target == s_mb) |(event.id == Event.SCROLL_PAGE_UP && event.target == s_mb) |(event.id == Event.SCROLL_LINE_DOWN && event.target == s_mb) |(event.id == Event.SCROLL_LINE_UP && event.target == s_mb)) { scrollAbsoluteSMb(event); return true; } else if (event.id == Event.ACTION_EVENT && event.target == b_init) { clickedBInit(); return true; } repaint(); return super.handleEvent(event); } //{{DECLARE_CONTROLS Button b_init; Scrollbar s_mu; Scrollbar s_dmu; Scrollbar s_ma; Scrollbar s_mb; //}} public void paint(Graphics g) { if (m_OffGC != null) { m_OffGC.setColor(getBackground()); // m_OffGC.fillRect(0,0,size().width,size().height); m_OffGC.fillRect(0,0,mox,moy); m_OffGC.setColor(Color.black); m_OffGC.setFont(new Font("DIALOG",Font.PLAIN,16)); m_OffGC.drawString("運動方程式(台の上の物体と摩擦)", 10, 20); drawBox(m_OffGC); g.drawImage(m_OffScreen,0,0,this); } } public void update(Graphics g) { paint(g); } public void start() { m_mu=s_mu.getValue()/100d; m_dmu=s_dmu.getValue()/100d; ma=s_ma.getValue()/10d; mb=s_mb.getValue()/10d; if (m_chpt01 == null) { m_chpt01 = new Thread(this); m_chpt01.start(); } } public void stop() { if (m_chpt01 != null) { m_chpt01.stop(); m_chpt01 = null; } } public void run() { while (true) { try { repaint(); Thread.sleep(Math.round(t * 1000)); } catch (InterruptedException e) { stop(); } } } public boolean mouseDrag(Event evt, int x, int y) { int wwl=10; if ((x>xl+wl)&&(y>yl-wwl)&&(ym_mu) { m_dmu=m_mu;s_dmu.setValue((int)(m_dmu*100)); } p_init(); } public void scrollAbsoluteSDmu(Event ev) { m_dmu=s_dmu.getValue()/100d; if (m_dmu>m_mu) { m_dmu=m_mu;s_dmu.setValue((int)(m_dmu*100)); } p_init(); } public void scrollAbsoluteSMa(Event ev) { ma=s_ma.getValue()/10d; p_init(); } public void scrollAbsoluteSMb(Event ev) { mb=s_mb.getValue()/10d; p_init(); } private void drawArrow(Graphics g,int x1,int y1,int a,int b) { if(!((a==0)&&(b==0))){ int x2=x1+a;int y2=y1+b;int m=6;double dd=0.6d; g.drawLine(x1,y1,x2,y2); double d=Math.atan2((double)b,(double)a); double xa=x2-m*Math.cos(d+dd); double ya=y2-m*Math.sin(d+dd); g.drawLine(x2,y2,(int)xa,(int)ya); double xb=x2-m*Math.cos(d-dd); double yb=y2-m*Math.sin(d-dd); g.drawLine(x2,y2,(int)xb,(int)yb); } } private void drawBox(Graphics g) { if (fa==0){ //引く力が0のときはmouseDrag()で処理していない if (va>vb){ //ずれている間は摩擦がはたらくので加速する aa = (-m_dmu * gl); ab = m_dmu * ma * gl / mb; } else{ aa = 0; ab = 0; va = vb; //念のため } fb = mb * ab; //摩擦力の大きさを計算 } //位置計算 va+=aa*t;vb+=ab*t; xa+=va*t;xb+=vb*t; if(xa > xb + wb){ //台から外れた aa = fa / ma; //上の物体は加速 ab = 0; //下の物体は加速せず(外力0) fb = 0; //摩擦もない if(ya < yb + hb - ha){ //床につく前 vya += gl * t; ya += vya * t; } else{ //床に落ちた ya = yb + hb - ha; } yl=(int)Math.round(ya) + (ha / 2); //ひも } xl=(int)Math.round(xa) + wa; //ひも //描画 g.setColor(Color.black); g.drawLine(0,(int)yb+hb,mox,(int)yb+hb);//床 g.drawRect((int)xa,(int)ya,wa,ha);//上の箱 g.drawRect((int)xb,(int)yb,wb,hb);//下の箱 g.drawLine(xl,yl,xl+wl,yl);//ひも g.setColor(Color.red); drawArrow(g,xl,yl,(int)fa,0); xarrow = (int)((xa + wa/2 < xb + wb) ? xa + wa/2 : xb + wb); //摩擦力の位置をそれらしく drawArrow(g,xarrow,(int)ya+ha,(int)-fb,0); g.setColor(Color.blue); drawArrow(g,xarrow,(int)ya+ha,(int)fb,0); // drawArrow(g,(int)xa+wa/2,(int)yb,(int)fb,0); g.setColor(Color.black); g.drawString("静止摩擦係数 "+m_mu ,240,58); g.drawString("動摩擦係数  "+m_dmu,240,80); g.drawString("上の物体の質量 "+ma+"[kg]" ,210,102); g.drawString("下の物体の質量 "+mb+"[kg]" ,210,124); } }