package matsubara.thssimulator; import java.applet.Applet; import java.awt.Label; import java.awt.Checkbox; import java.awt.Choice; import java.awt.Frame; import java.awt.Panel; import java.awt.Image; import java.awt.Graphics; import java.awt.Color; import java.awt.Rectangle; import java.awt.Dimension; import java.awt.SystemColor; import java.awt.Toolkit; import java.awt.MediaTracker; import java.awt.Font; import java.awt.FontMetrics; import java.awt.BorderLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.AWTEvent; import java.awt.event.AWTEventListener; //import java.awt.image.*; //import java.awt.image.BufferedImage; import java.awt.image.ImageProducer; //import java.text.*; import java.text.NumberFormat; import java.text.FieldPosition; import matsubara.gear.*; import matsubara.graphics.ProgressLine; import matsubara.carcontroller.*; import java.beans.*; import matsubara.uiext.*; import matsubara.uiext.event.*; /** *タイトル: THSシミュレータの動作と描画のスレッド
*著作権: Copyright (c) 2002 matsubara masakazu
* @author m.matsubara * @version 1.2.0 */ class ThsDrawThread extends Thread { private ThsApplet m_applet; private volatile boolean m_bStopRequest = false; /** * THSシミュレータの動作と描画のスレッドの初期化 * @param applet 制御するTHSシミュレータ本体 */ ThsDrawThread(ThsApplet applet) { m_applet = applet; } /** * スレッド本体 */ public void run() { long nSleep; long nTime, nTime2, nTime3; nTime = System.currentTimeMillis(); nTime3 = System.currentTimeMillis(); Graphics graphics = m_applet.getGraphics(); while (m_bStopRequest == false) { try { long nInterval = nTime3 - nTime; nTime = nTime3; // m_applet.lbDebug.setText(String.valueOf(nInterval != 0 ? 1000 / nInterval : 0) + " fps"); m_applet.moveThs(nInterval); m_applet.drawThsObjects(m_applet.getGraphics()); nTime2 = System.currentTimeMillis(); nSleep = 50 - (nTime2 - nTime); if (nSleep < 10) nSleep = 10; sleep(nSleep); } catch (Exception e) { } nTime3 = System.currentTimeMillis(); } } /** * スレッドの停止要求を発行 */ public void stopRequest() { m_bStopRequest = true; } } /** *タイトル: THSシミュレータ
*説明: プリウスのハイブリッドシステム(THS)の心臓部、遊星歯車機構のシミュレーション
*著作権: Copyright (c) 2001
* @author m.matsubara * @version 1.0.0 */ public class ThsApplet extends Applet { /** アプリケーション名 */ public final String mc_sApplicationName = "Prius driving simulator"; /** バージョン表示 */ public final String mc_sVersion = "version 1.3.0"; /** 著作権表示 */ public final String mc_sCopyright = "copyright(c) 2002 matsubara masakazu"; ThsDrawThread m_threadDraw; ThsController m_thsController = null; // BufferedImage m_imgPGear = new BufferedImage(160, 160, BufferedImage.TYPE_INT_RGB); // プラネタリギア描画用バッファ Image m_imgPGear = null; Image[] m_imgPrius = new Image[2]; // 走行中のプリウスの画像2枚(2枚を交代に表示させて走っている感じを出す) Image[] m_imgKame = new Image[2]; // 走行中(?)のカメの画像2枚(2枚を交代に表示させて走っている感じを出す) int m_nImgPriusNo = 0; // 表示中のプリウスの番号(インデックス) Image m_imgMotor; // モーター動作を表すアイコン(オレンジの電球) Image m_imgKaisei; // 回生発電を表すアイコン(緑の電球) Image m_imgGasoline; // エンジンの動作を表すアイコン(ガソリンスタンド) Image m_imgMeter; // メーター Image m_imgMeterKame; // メーター表示用カメ(出力制限警告灯) Image m_imgEnergyMonitor; // エネルギーモニタの図 Image m_imgPriusBrake; // プリウスのブレーキランプ // メーターの位置 final int m_nMeterBaseX = 200; final int m_nMeterBaseY = 55; // エネルギーモニタの位置 final int m_nEmOffsetX = 447; final int m_nEmOffsetY = 0; // エネルギーモニタでエネルギーの流れを表す線、2文字ずつついている大文字の意味は以下のとおり // B : バッテリー, I : インバーター, M : モーター, F : ファイナルギア // G : 発電機, P : プラネタリギア, E : エンジン, T : タイヤ ProgressLine m_lineBI = new ProgressLine(m_nEmOffsetX + 121, m_nEmOffsetY + 38, m_nEmOffsetX + 112, m_nEmOffsetY + 64, Color.red, 6); ProgressLine m_lineIM = new ProgressLine(m_nEmOffsetX + 112, m_nEmOffsetY + 64, m_nEmOffsetX + 102, m_nEmOffsetY + 94, Color.red, 6); ProgressLine m_lineMF = new ProgressLine(m_nEmOffsetX + 102, m_nEmOffsetY + 94, m_nEmOffsetX + 83, m_nEmOffsetY + 88, Color.red, 6); ProgressLine m_lineIG = new ProgressLine(m_nEmOffsetX + 112, m_nEmOffsetY + 64, m_nEmOffsetX + 85, m_nEmOffsetY + 57, Color.red, 6); ProgressLine m_lineGP = new ProgressLine(m_nEmOffsetX + 85, m_nEmOffsetY + 57, m_nEmOffsetX + 72, m_nEmOffsetY + 84, Color.red, 6); ProgressLine m_lineEP = new ProgressLine(m_nEmOffsetX + 50, m_nEmOffsetY + 77, m_nEmOffsetX + 72, m_nEmOffsetY + 84, Color.red, 6); ProgressLine m_linePF = new ProgressLine(m_nEmOffsetX + 72, m_nEmOffsetY + 84, m_nEmOffsetX + 83, m_nEmOffsetY + 88, Color.red, 6); ProgressLine m_lineFT = new ProgressLine(m_nEmOffsetX + 83, m_nEmOffsetY + 88, m_nEmOffsetX + 70, m_nEmOffsetY + 116, Color.red, 6); // 道路描画用のバッファ、この上にプリウスやメーター、エネルギーモニタなどが表示される。 Image m_imgRoad = null; double m_rRoadPosition = 0; // 道路の白線を描画するためのインデックス、プリウスが進むと増える。 // アプレット最下段に表示されるメッセージ String m_sMessage1 = ""; String m_sMessage2 = ""; boolean isStandalone = false; Label label1 = new Label(); Label label2 = new Label(); Label lbRingGearSpeed = new Label(); Label label4 = new Label(); Label lbPlaCarrierSpeed = new Label(); Label label6 = new Label(); Label lbSunGearSpeed = new Label(); Choice cmbRange = new Choice(); Panel panel1 = new Panel(); Checkbox ckDriveMode = new Checkbox(); Label label8 = new Label(); Label label9 = new Label(); Slider sliRingGear = new Slider(); Slider sliPlaCarrier = new Slider(); Slider sliSunGear = new Slider(); Slider sliBrake = new Slider(); Slider sliAccel = new Slider(); Label lbDebug = new Label(); //引数値の取得 public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //アプレットの構築 public ThsApplet() { try { m_thsController = new ThsController(80, 80, 60); } catch (Exception e) { e.printStackTrace(); } } //アプレットの初期化 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //コンポーネントの初期化 private void jbInit() throws Exception { label1.setAlignment(1); label1.setFont(new java.awt.Font("Dialog", 0, 12)); label1.setForeground(new Color(255, 128, 0)); label1.setText("動力分割機構(遊星歯車)"); label1.setBounds(new Rectangle(20, 7, 160, 17)); this.setBackground(Color.white); this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { this_mouseMoved(e); } }); this.setLayout(null); label2.setAlignment(1); label2.setFont(new java.awt.Font("Dialog", 0, 12)); label2.setForeground(new Color(0, 186, 0)); label2.setText("モーター"); label2.setBounds(new Rectangle(202, 6, 56, 17)); lbRingGearSpeed.setAlignment(2); lbRingGearSpeed.setForeground(new Color(0, 186, 0)); lbRingGearSpeed.setText("0 rpm"); lbRingGearSpeed.setBounds(new Rectangle(197, 21, 67, 17)); label4.setAlignment(1); label4.setFont(new java.awt.Font("Dialog", 0, 12)); label4.setForeground(Color.red); label4.setText("エンジン"); label4.setBounds(new Rectangle(270, 6, 59, 17)); lbPlaCarrierSpeed.setAlignment(2); lbPlaCarrierSpeed.setForeground(Color.red); lbPlaCarrierSpeed.setText("0 rpm"); lbPlaCarrierSpeed.setBounds(new Rectangle(266, 21, 67, 17)); label6.setAlignment(1); label6.setFont(new java.awt.Font("Dialog", 0, 12)); label6.setForeground(Color.blue); label6.setText("発電機"); label6.setBounds(new Rectangle(371, 6, 63, 17)); lbSunGearSpeed.setAlignment(2); lbSunGearSpeed.setForeground(Color.blue); lbSunGearSpeed.setText("0 rpm"); lbSunGearSpeed.setBounds(new Rectangle(369, 21, 67, 17)); cmbRange.setBackground(new Color(204, 204, 205)); cmbRange.setBounds(new Rectangle(10, 27, 104, 24)); cmbRange.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(ItemEvent e) { cmbRange_itemStateChanged(e); } }); panel1.setBackground(new Color(204, 204, 205)); panel1.setBounds(new Rectangle(464, 10, 124, 177)); panel1.setLayout(null); ckDriveMode.setBackground(