package bane; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.UIManager; /** *
タイトル:
*説明:
*著作権: Copyright (c) 2003
*会社名:
* @author 未入力 * @version 1.0 */ public class Applet1 extends Applet implements AdjustmentListener ,Runnable { private boolean isStandalone = false; private Scrollbar scrP=new Scrollbar(); private Scrollbar scrQ=new Scrollbar(); private boolean drawGraph=true,drawDiagram=true; private boolean goFlag=false,drawInit=false,clear; private Thread th; int sw,sh; int hh,xofs; double P = 1.0; // ダンパー初期値 double Q = 4.0; // バネ初期値 int time = 0; // 時間初期値 int lastTime; // 最終値 double dh; // 刻巾 double rX = 0.0; // 変移 初期値(0) double rY; double k1, k2, k3, k4, l1, l2, l3, l4; int mx,my; private Label label1 = new Label(); private Label label2 = new Label(); private Button button1 = new Button(); private Button clearbutton = new Button(); private Label attlabel = new Label(); private Label strlabel = new Label(); // 速度 //引数値の取得 public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //アプレットのビルド public Applet1() { } //アプレットの初期化 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } //binit(); scrP.addAdjustmentListener(this); scrQ.addAdjustmentListener(this); } //コンポーネントの初期化 private void jbInit() throws Exception { this.setLayout(null); scrP.setOrientation(0); scrP.setBounds(new Rectangle(143, 269, 92, 20)); scrQ.setOrientation(0); scrQ.setValue(25); scrQ.setBounds(new Rectangle(296, 267, 89, 20)); label1.setText("バネ強度"); label1.setBounds(new Rectangle(239, 268, 52, 20)); label2.setText("減衰度"); label2.setBounds(new Rectangle(98, 269, 38, 20)); this.setBackground(Color.lightGray); button1.setLabel("開始"); button1.setBounds(new Rectangle(12, 266, 35, 22)); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { start_actionPerformed(e); } }); clearbutton.setLabel("クリア"); clearbutton.setBounds(new Rectangle(53, 266, 38, 22)); clearbutton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { clear_actionPerformed(e); } }); attlabel.setText("0"); attlabel.setBounds(new Rectangle(177, 247, 38, 17)); strlabel.setText("12"); strlabel.setBounds(new Rectangle(319, 246, 42, 15)); this.add(button1, null); this.add(label1, null); this.add(label2, null); this.add(scrP, null); this.add(clearbutton, null); this.add(scrQ, null); this.add(strlabel, null); this.add(attlabel, null); } public void run(){ goFlag=true; while(goFlag){ repaint(); time++; if(time >lastTime )goFlag=false; try {Thread.sleep(20);} catch(InterruptedException e) {} } } //アプレットの情報取得 public String getAppletInfo() { return "アプレット情報"; } //引数情報の取得 public String[][] getParameterInfo() { return null; } public void adjustmentValueChanged(AdjustmentEvent e) { P = scrP.getValue()/50.0; Q = scrQ.getValue()/2.0; attlabel.setText(Double.toString(P)); strlabel.setText(Double.toString(Q)); repaint(); } public void paint (Graphics g) { if(drawInit){ g.setColor(Color.black); //g.drawString("damp = "+(float)P, 10, 260); //g.drawString("spring = "+Q, 150, 260); //軸の描画 g.drawLine(xofs,hh,sw,hh); g.drawLine(xofs, hh+(sh-50)/4, xofs, hh-(sh-50)/4); drawInit=false; } if(drawGraph){ //for (int i = T0; i < TF; i++ ) { g.setColor(Color.lightGray); g.fillRect(0,0,sw,(sh-50)/2); g.setColor(Color.black); mx=(int)((sw-20)/4*(rX+2)+10); my=(sh-50)/4; g.fillOval(mx-15,my-15,30,30); drawSpring(g,10,mx-25,my); g.drawOval(time+xofs, (int)(hh-rX*50),1,1 ); rkgDeq(); //} } if(clear){ g.setColor(Color.lightGray); g.fillRect(0,(sh-50)/2,sw,(sh-50)/2); clear=false; } } public void update(Graphics g) { paint(g); } private void drawSpring(Graphics g,int osx,int spw,int sph){ int spx,spy; int pspx,pspy; int dy=10; pspx=spx=osx;pspy=spy=sph; double dx=spw/16.0; for(int i=0;i<16;i++){ spx=(int)(osx+dx*(i+1)); spy=spy+dy; if(spy ==sph-dy || spy == sph+dy) dy=-dy; g.drawLine(pspx,pspy,spx,spy); pspx=spx;pspy=spy; //System.out.println("drawspring:"+i+":"+dy); } } private void rkgDeq(){ k1 = dh * fnk( rY ); l1 = dh * fnl(rY, rX); k2 = dh * fnk(rY + l1 /2); l2 = dh * fnl((rY + l1 /2), (rX + k1 /2)); k3 = dh * fnk(rY + l2 /2); l3 = dh * fnl((rY + l2 /2), (rX + k2 /2)); k4 = dh * fnk(rY + l3); l4 = dh * fnl((rY + l3), (rX + k3)); rX += (k1 + 2 * k2 + 2 * k3 + k4)/6; rY += (l1 + 2 * l2 + 2 * l3 + l4)/6; //System.out.println("rkg:"+rX+":"+rY+":"+dh); } public double fnk(double y) { return ( y ); } public double fnl(double y, double x) { return ( -P*y-Q*x ); } void start_actionPerformed(ActionEvent e) { //init double Dt; int hw; sw = getSize().width; sh = getSize().height; int ht = (int)(sh-50); // Disp.size //sh = 50; //g.setColor(Color.black); //g.fillRect(0,0,w,h); P = scrP.getValue()/50.0; Q = scrQ.getValue()/2.0; hw = sw/2; //X軸0レベル hh = ht*3/4; //Y軸0レベル lastTime = sw-20;//終了時刻 xofs = 10; //x軸始点 rY=0; // 初期速度 rX=1; //初期位置 dh=1/60.0; //dh:刻み幅(時間) drawInit=true; repaint(); drawInit=true; drawGraph=true; time=0; th=new Thread(this); th.start(); } void clear_actionPerformed(ActionEvent e) { clear=true; repaint(); } }