この記事では、Javaプログラミングによって実装された惑星運動のシミュレーションについて説明します。次のように、参照のために共有してください。
私が長い間楽しみにしていたJava言語プログラミングも終わりました。数ヶ月で、私は基本的にJavaの単純な使用法を習得し、Java、オブジェクト指向の思考、マルチスレッドの並行性コントロール、スイングインターフェイスデザイン、アニメーション制作などの主要な基本知識を学びました。最後に、できるだけ学習した知識をカバーできるコースデザインを作成し、シリーズで接続する予定です。したがって、惑星の動きをシミュレートするための簡単なソフトウェアを実装することを検討しました。主なアイデアは次のとおりです。
アニメーションは、惑星の動きをシミュレートするために使用されます。メインパネルには中央の惑星があり、楕円形の軌道が描かれており、動く惑星が中央惑星の周りを動き回っています。同時に、右下隅に4つのボタンが設定されています。つまり、惑星がそれぞれ移動、一時停止、加速、減速を引き起こす可能性のある「開始」、「一時停止」、「加速」、「減速」です。
1。クラスデザイン:
星はjpanelから継承します。星のクラスは惑星の基本クラスであり、すべての動く惑星は星のクラスから継承されています。内部描画()メソッドは主に固体の円を描きます。目的は、中央惑星が描画されるたびに常に表示されるようにすることです。 PaintComponent()メソッドは、JPANEL描画方法をオーバーライドし、星クラスから継承された星のインスタンスクラスが独自の惑星を描くことができるようにすることを目指しています。次のように:
パッケージスター; Import java.awt.color; Import java.awt.graphics; Import javax.swing.jpanel; public class Star extends jpanel { / ***基本的な惑星クラス* / private static final long serialversionuid = 1l; int x、y; int幅、高さ; public star(){width = 10;高さ= 10; } public Star(int x、int y){this.x = x; this.y = y;幅= 10;高さ= 10; } public void draw(グラフィックg){g.setcolor(color.blue); g.filloval(x、y、幅、高さ); }保護されたvoid paintComponent(グラフィックg){super.paintComponent(g); g.filloval(x、y、幅、高さ); }}星のクラスは、動いている惑星を表す星クラスのさらなる洗練である星のクラスから継承します。 Alfa in the Starsクラスは、移動惑星の開始角を表し、速度は移動の速度を表し、これを変更できます。長くて短いのは、それぞれ楕円形の軌跡の主軸と小軸を表します。センターは、インスタンス化されたオブジェクトの中央惑星を表しています。 PaintComponent()関数は、PaintComponent()をオーバーライドし、親クラスのdraw()関数を内部的に参照し、長い、短、長い、短い、短い、短い楕円形のトラックを描画します。 move()関数は、xとyの変化方程式、つまり楕円軌道の周りの変化を記述し、アルファの変化方法も指定します。 start()関数は、スレッドの開始を示し、一時停止()関数はスレッドの一時停止を示し、アクセラレーション()関数は惑星のアクセラレーション動作を示し、減速()関数は惑星の減速の動作を示します。
Pthreadクラスの目的は、スレッド、つまり、Pthreadクラスのインスタンス化を通じて、初期の動き、モーションを一時停止し、加速し、惑星の減速を制御することです。 Pthreadクラスはスレッドクラスから継承され、Startsクラスに含まれています。したがって、pthreadクラスを共通のクラスとして定義することはできません。 pthreadクラスはrun()メソッドを提供し、画像を塗り直すためにrepaint()メソッドを絶えず呼び出します。 SetSusPend()メソッドは、ブール変数を変更してスレッドを一時停止します(NotifyAll()メソッドを呼び出します)。 Pthreadクラスはスタートの内部クラスであるため、PTHREADクラスのオブジェクトはStartsクラスで生成され、このオブジェクトを使用してスレッドが操作されます。
デザインは次のとおりです。
パッケージスター; Import java.awt.color; Import Java.awt.Graphics;パブリッククラススターは星{ / ***移動惑星* / private static final long serialversionuid = 1l;ダブルアルファ;ダブルスピード;スターセンター; int long; // darken axis int short; //短い軸のパブリックスター(int px、int py、星センター){super(px、py); this.center = center; long =(px -center.x)*2; short =(py -center.y)*2; this.setopaque(true); // move(); alfa = 0;速度= 0.001; }保護されたvoid paintComponent(グラフィックg){super.paintComponent(g); center.draw(g); //中心点移動()を描画します。 g.setcolor(color.green); G.drawoval(center.x-long/2、center.y-short/2、long、short); } public void move(){x = center.x +(int)(long/2*math.cos(alfa)); y = center.y +(int)(short/2*math.sin(alfa)); //楕円形の軌跡 +=速度に沿ってアルファを実行します。 //角度は絶えず変化しています} class pthread拡張スレッド{// repaintスレッドクラスのプライベートブールサスペンド= true;プライベート文字列control = ""; public void run(){while(true){synchronized(control){if(suspend){// move(); Repaint(); }}}} public void setSsopend(boolean s){// thread pause method if(!suspend){synchronized(control){control.notifyall(); }} this.suspend = s; }} public pthread pt = new pthread(); public void start(){pt.setsuspend(true); pt.start(); } public void pause(){pt.setsuspend(false); } public void accelerate(){// Accelerateメソッドif(speed> 0){//角度加速0.0002速度 += 0.0002; } else speed = 0.001; } public void decelerate(){//メソッドを減速If(速度> 0){速度 - = 0.0002; //各角度で減速0.0002} //速度が0に減速している場合、減速し続けることはできません。速度は0です。ストップモーションelse speed = 0; }}StarFrameクラスは、このプログラムのスタートアップパネルです。このクラスをインスタンス化することにより、メインプログラムインターフェイスが生成され、惑星コンポーネント、ボタン、およびラベルがパネルに追加されます。内部getPanel()メソッドは2つのボタンを設定し、jPanelを返します(JPANELに4つのボタンを追加します)。 getLabel()メソッドは、文字通りの説明でJLabelを返します。中心オブジェクトは星クラスのインスタンス化であり、P1は星のクラスのインスタンス化であり、それぞれ中央惑星と周回惑星を表しています。 JB1、JB2、JB3、およびJB4は、それぞれ惑星の開始、一時停止、加速、減速のコントロールボタンです。画像はインターフェイスの背景画像を表し、レイヤードパネルはインターフェイスの階層パネルであり、背景画像の設定を容易にします。 JP、JLは、背景画像を設定するコンポーネントです。デザインは次のとおりです。
パッケージスター; java.awt.borderlayout; Import java.awt.color; Import java.awt.font; Import java.awt.event.event.event; Import java.awt.event; Import javax.swing.swing.imageicon; Import javax.swing.javax.javax.swing; javax.swing.jlabel; Import javax.swing.jlayeredpane; Import javax.swing.jpanel; public class starframe拡張jframe { / ***惑星シミュレーションスタートアップパネル* / private static final long serialversionuid = 1l;スターセンター=新しい星(300,200); //センタープラネットスターP1 =新しい星(300+230,200+130、センター); //中心星を取り巻く惑星P2 =新しい星(300+230+20,200+130+20、P1); jbutton jb1 = new jbutton( "start"); jbutton jb2 = new jbutton( "Pause"); jbutton jb3 = new jbutton( "Accelerate"); jbutton jb4 = new jbutton( "decelerate"); ImageIcon Image = new ImageIcon( "timg.jpg"); //背景画像、相対パスを使用してJlayeredPane layeredpaneを定義します。 //背景画像を配置するための階層パネルを定義しますjpanel jp; Jlabel JL; public starframe(){// p1の位置を設定し、サイズp1.setbounds(40,40,600,400); // p2.setbounds(40,40,600,400); //背景画像を定義し、jlabelに背景画像を配置し、jlabelをjpanel layeredpane = new jlayeredpane()に配置します。 jp = new JPanel(); jp.setbounds(0,0、image.geticonwidth()、image.geticonheight()); jl = new Jlabel(画像); jp.add(jl); // JPを下層に置きます。 layeredpane.add(jp、jlayeredpane.default_layer); // jbを1階にlayeredpane.add(p1、jlayeredpane.modal_layer); // layeredpane.add(p2、jlayeredpane.modal_layer); layeredpane.add(getpanel()、jlayeredpane.modal_layer); layeredpane.add(getlabel()、jlayeredpane.modal_layer); layeredpane.add(getlabel()、jlayeredpane.modal_layer); // JB1、JB2、JB3、およびJB4の関連するアクションをそれぞれ設定します。JB1.AddActionListener(new ActionListener(){public void actionperformed(actionevent e){// todo auto generated method stub p1.start();}}); jb2.addactionlistener(new ActionListener(){public void ActionPerformed(ActionEvent e){// todo auto-formated method stub p1.pause();}}); jb3.addActionListener(new ActionListener(){public void ActionPerformed(ActionEvent e){// todo auto-formated method stub p1.accelerate();}}); jb4.addactionlistener(new ActionListener(){public void ActionPerformed(ActionEvent e){// todo auto-formated method stub p1.decelerate();}}); this.setlayeredpane(layeredpane); this.settitle( "star"); this.setbounds(100,100,1000,600); this.setDefaultCloseoperation(jframe.exit_on_close); this.setVisible(true); } private jpanel getPanel(){//定義された4つのボタンを返しますjpanel jp = new jpanel(); jp.add(jb1); jp.add(jb2); jp.add(jb3); jp.add(jb4); jp.setbounds(750,450,200,70); jpを返します。 } private jpanel getLabel(){//テキストの返された説明jlabel jl = new Jlabel( "Planetary Simulation"); jl.setforeground(color.red); // font color jl.setfont(new font( "dialog"、0,20)); // font jpanel jp = new jpanel(); jp.add(jl、borderlayout.center); jp.setbounds(800,0,150,40); jpを返します。 } public static void main(string [] args){@suppresswarnings( "unused")starframe f = new Starframe(); }}ランニング効果:
2。オブジェクト:
Javaはオブジェクト指向言語であるため、もちろん、C言語のように機能によって実装することはできません。コース構造にオブジェクトはどのようにできませんか?
主なオブジェクト:
オブジェクトセンター、つまり中央惑星
惑星を周回するオブジェクトP1
オブジェクトPT、つまり、スレッドの制御を担当するオブジェクト
オブジェクトF、つまり、プログラムスタートアップパネル
3。オブジェクト間の関係(相互作用)
P1とセンターの関係:星クラスは、JPanelから継承された惑星の基本クラスであり、基本的な半径と座標は内部で定義されます。実際、インスタンス化されたオブジェクトセンターは、移動する惑星の中心です。星から継承された星のクラスは、動く惑星を表しており、これはさらに洗練されています。したがって、インスタンスオブジェクトP1は移動する惑星1を表し、中心を移動します。同時に、センターはP1のパラメーターとして渡され、2つの間の相互作用を完了します。これは、オブジェクトP1とセンターの関係です。オブジェクト中心をインスタンス化すると、指定された座標の下に固体円が描画され、中心オブジェクトのxおよびy座標は変わりません。固体円を描くことに基づいて、オブジェクトP1は、中心の座標に従って、指定された主軸と単軸の楕円形の軌道を描きます。同時に、スレッドクラスを内部的に実装しますが、実行スレッドを中断しません。相互継承関係により、センターとP1は互いに干渉することなくグラフを描くことができます。 STRASクラスのPaintComponent()メソッドでは、スレッドが最初にRepaint()メソッドを呼び出すため、中央オブジェクトのdraw()メソッドを呼び出す必要があることに言及する価値があります。センターのdraw()メソッドが実装されていない場合、最終結果は中央惑星を示しません。
PTとP1の関係:PTHREADクラスはスレッドクラスから継承し、run()メソッドを定義します。オブジェクトP1をインスタンス化することにより、スレッドを開始するためにstart()メソッドを呼び出すことができます。 PthreadクラスはStartsクラス内にあるため、スレッドはP1のメソッドを介して制御できます。つまり、速度を制御し、加速および減速し、実行するかどうかを制御できます。
Fと各オブジェクトの関係:StarFrameはJFrameから継承します。実際、インスタンス化オブジェクトFは、各オブジェクトをキャンバスに追加し、インターフェイスを作成し、各コンポーネントのサイズと位置を制御します。これは、プログラムの操作の鍵です。
4。オブジェクト指向の理解:
すべてがオブジェクトです。一部の学生は、オブジェクトが何であるかと尋ねました。私は、新しいものを持つ人はオブジェクトであり、オブジェクトはクラスのインスタンス化であると答えました。このプログラムでは、星のクラスをインスタンス化することで無数の惑星を作成できます(理論的には、はい)。ただし、内部機能の実装におけるいくつかの問題を解決することは困難です。主なことは、PaintComponent()メソッドを書き換えることです。オブジェクトをもう一度作成した後、メソッドが再び書き直されるため、避けられない問題が発生します。これは、解決できない後悔です!
Java関連のコンテンツを増やすために、このサイトに興味のある読者は、「Javaオブジェクト指向プログラミングに関する紹介と高度なチュートリアル」、「Javaデータ構造とアルゴリズムに関するチュートリアル」、Java Operation domノードスキルの要約」、「Javaファイルの概要、およびJava操作スキルの概要」の概要を見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。