이 기사에서는 Java 프로그래밍에서 구현 한 행성 모션의 시뮬레이션에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
내가 오랫동안 기대했던 Java 언어 프로그래밍도 끝났습니다. 몇 달 만에 기본적으로 Java의 간단한 사용을 마스터했으며 Java, 객체 지향적 사고, 다중 스레드 동시성 제어, 스윙 인터페이스 디자인, 애니메이션 제작 등의 주요 기본 지식을 배웠습니다. 마지막으로, 가능한 한 많은 지식을 다루고 시리즈로 연결할 수있는 코스 디자인을 만들 계획입니다. 따라서 나는 행성 운동을 시뮬레이션하기 위해 간단한 소프트웨어를 구현하는 것을 고려했습니다. 주요 아이디어는 다음과 같습니다.
애니메이션은 행성 운동을 시뮬레이션하는 데 사용됩니다. 메인 패널에는 중앙 행성이 있으며 타원형 궤도가 그려지고 움직이는 행성이 중앙 행성 주위로 움직이고 있습니다. 동시에 오른쪽 하단에 4 개의 버튼이 설정되어 있습니다. 즉, "시작", "일시 정지", "가속"및 "감속"이 각각 이동, 일시 중지, 가속 및 감속 할 수 있습니다.
1. 수업 디자인 :
스타는 JPANEL에서 물려받습니다. 스타 클래스는 행성의 기본 클래스이며 모든 움직이는 행성은 스타 클래스에서 상속됩니다. 내부 드로우 () 방법은 주로 단단한 원을 그립니다. 목적은 중앙 행성이 그릴 때마다 항상 표시되도록하는 것입니다. PaintComponent () 메소드는 JPANEL 그리기 메소드를 대체하여 Star 클래스에서 상속 된 Stars 클래스의 인스턴스 객체가 자신의 행성을 그릴 수 있도록합니다. 다음과 같이 :
패키지 스타; import java.awt.color; import java.awt.graphics; import javax.swing.jpanel; public class star 확장 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는 움직이는 행성의 시작 각도를 나타내고 속도는 움직임의 속도를 나타내며, 이는 수정 될 수 있습니다. 길고 짧은 것은 각각 타원형 궤적의 주요 축과 작은 축을 나타냅니다. 중심은 인스턴스화 된 대상의 중앙 행성을 나타냅니다. PaintComponent () 함수는 PaintComponent ()를 재정의하고, 내부적으로 상위 클래스의 Draw () 함수를 말하며, 길고 짧고 짧고 짧고 짧은에 따라 타원형 트랙을 그립니다. Move () 함수는 X와 Y의 변화 방정식, 즉 타원형 궤도 주변의 변화를 설명하고 ALFA 변화 방식을 지정합니다. start () 함수는 스레드의 시작을 나타내고, pause () 함수는 스레드 pause를 나타내고, 가속도 () 함수는 행성의 가속 작동을 나타내고 deCelerate () 함수는 행성 감속에서의 작동을 나타냅니다.
PTHREAD 클래스의 목적은 스레드 클래스의 인스턴스화를 통해 스레드, 즉 초기 운동, 일시 정지 운동, 가속 및 감속을 제어하는 것입니다. PTHREAD 클래스는 스레드 클래스에서 상속되며 시작 클래스에 포함됩니다. 따라서 pthread 클래스는 공통 클래스로 정의 할 수 없습니다. pthread 클래스는 run () 메소드를 제공하며, 리 레드 인 () 메소드를 지속적으로 호출하여 그림을 다시 칠합니다. setsuspend () 메소드는 부울 변수 변경을 사용하여 스레드를 일시 중지합니다 (Notifyall () 메소드를 호출). pthread 클래스는 내부 클래스의 시작 클래스이기 때문에 Pthread 클래스의 객체가 시작 클래스에서 생성되고 스레드는이 객체를 사용하여 작동합니다.
디자인은 다음과 같습니다.
패키지 스타; import java.awt.color; import java.awt.graphics; public class Stars는 별을 확장합니다. 이중 알파; 이중 속도; 스타 센터; int long; // Axis int short; // 짧은 축 공개 별 (int px, int py, star center) {super (px, py); this.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); // 센터 포인트 move ()를 그립니다. g.setcolor (color.green); G.Drawoval (Center.x-long/2, center.y-short/2, 길고 짧음); } public void move () {x = center.x + (int) (long/2*math.cos (alfa)); y = center.y + (int) (짧은/2*math.sin (alfa)); // 타원형 궤적 += 속도를 따라 Alfa를 실행합니다. // 각도가 끊임없이 변경되고 있습니다} 클래스 pthread는 스레드를 확장합니다. 개인 문자열 제어 = ""; public void run () {while (true) {synchronized (control) {if (sustend) {// move (); 리 페인트 (); }}}} public void setssopend (boolean s) {// 스레드 정지 메서드를 설정합니다. }} 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 () {// decelerate method if (speed> 0) {speed -= 0.0002; // 각 각도에서 감속 0.0002} // 속도가 0으로 감속되면 계속 감속 할 수 없습니다. 속도는 0입니다. 스톱 모션 else speed = 0; }}스타 프레임 클래스는이 프로그램의 스타트 업 패널입니다. 이 클래스를 인스턴스화함으로써 주요 프로그램 인터페이스가 생성되고 행성 구성 요소, 버튼 및 레이블이 패널에 추가됩니다. 내부 getPanel () 메소드는 두 개의 버튼을 설정하고 jpanel을 반환합니다 (4 개의 버튼을 jpanel에 추가). getLabel () 메소드는 문자 그대로의 설명으로 jlabel을 반환합니다. 중심 객체는 Star 클래스의 인스턴스화이며 P1은 각각 중앙 행성과 궤도 행성을 나타내는 별 클래스의 인스턴스화입니다. JB1, JB2, JB3 및 JB4는 각각 지구의 시작, 일시 중지, 가속 및 감속을위한 제어 버튼입니다. 이미지는 인터페이스 배경 이미지를 나타내고 LayeredPanel은 인터페이스의 계층 적 패널이며 배경 이미지의 설정을 용이하게합니다. JP, JL은 배경 이미지를 설정하는 구성 요소입니다. 디자인은 다음과 같습니다.
패키지 스타; import java.awt.borderlayout; import java.awt.color; import java.awt.font; import java.awt.event.actionevent; import java.awt.event.actionListener; import javax.swing.imageicon; import javax.swing.jbutton; javax.swing.jlabel; import javax.swing.jlayeredpane; import javax.swing.jpanel; public class starframe 확장 jframe { / ***Planetary Simulation Startup 패널* / private static final long serialversionuid = 1l; Star Center = New Star (300,200); // 센터 행성 별 P1 = 새로운 별 (300+230,200+130, 센터); // 중심 별 주변의 행성 P2 = 새로운 별 (300+230+20,200+130+20, P1); JBUTTON JB1 = New JButton ( "시작"); JBUTTON JB2 = NEW JBUTTON ( "일시 정지"); JBUTTON JB3 = NEW JBUTTON ( "Accelerate"); JBUTTON JB4 = 새로운 JBUTTON ( "감속"); imageicon image = new ImageIcon ( "timg.jpg"); // 배경 이미지, 상대 경로를 사용하여 jlayeredpane layeredpane을 정의합니다. // 배경 이미지를 배치하기위한 계층 패널 정의 jpanel jp; Jlabel JL; public starframe () {// p1의 위치를 설정하고 size p1.setbounds (40,40,600,400); // p2. 세트 바운드 (40,40,600,400); // 배경 이미지를 정의하고 배경 이미지를 jlabel에 놓고 jlabel을 jpanel layeredpane = new JlayeredPane ()에 배치합니다. jp = 새로운 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 자동 생성 메소드 Stub P1.start ()}); jb2.addactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {// todo 자동 생성 메소드 Stub p1.pause ();}}); jb3.addactionListener (New ActionListener () {public void actionPerformed (ActionEvent e) {// todo 자동 생성 메소드 스터브 p1.accelerate ();}}); jb4.addactionListener (new ActionListener () {public void actionPerformed (ActionEvent e) {// todo 자동 생성 메소드 스터브 p1.decelerate ()}); this.setlayeredpane (LayeredPane); this.settitle ( "star"); this.setBounds (100,100,1000,600); this.setDefaultCloseOperation (jframe.exit_on_close); this.set -Visible (true); } private jpanel getPanel () {// 정의 된 네 버튼을 반환 jpanel jp = new jpanel (); jp.add (jb1); jp.add (jb2); jp.add (jb3); jp.add (jb4); JP. 세트 바운드 (750,450,200,70); 반환 jp; } private jpanel getLabel () {// 텍스트 설명 jlabel jl = new Jlabel ( "Planetary Simulation"); jl.setforeground (color.red); // 글꼴 color jl.setfont (new font ( "dialog", 0,20))를 설정; // 글꼴 jpanel jp = new jpanel (); jp.add (jl, borderlayout.center); JP. 세트 바운드 (800,0,150,40); 반환 jp; } public static void main (String [] args) {@suppresswarnings ( "Unused") Starframe f = new Starframe (); }}실행 효과 :
2. 개체 :
Java는 물론 객체 지향 언어이기 때문에 C 언어와 같은 기능으로 구현할 수 없습니다. 코스 구조에 어떻게 물체가 없을 수 있습니까?
주요 개체 :
객체 센터, 즉 중앙 행성
물체 P1, 행성 공전
Object Pt, 즉 스레드 제어를 담당하는 객체
객체 F, 즉 프로그램 시작 패널
3. 물체 간의 관계 (상호 작용)
P1과 Center : Star 클래스의 관계는 행성의 기본 클래스이며, Jpanel에서 상속 된 기본 반경과 좌표는 내부적으로 정의됩니다. 실제로, 인스턴스형 객체 중심은 움직이는 행성의 중심입니다. 별에서 상속 된 별 클래스는 움직이는 행성을 나타내며, 이는 추가 개선입니다. 따라서, 인스턴스화 객체 P1은 움직이는 행성 1을 나타내고 중심을 주위로 이동합니다. 동시에, 중심은 둘 사이의 상호 작용을 완료하기 위해 P1의 매개 변수로 전달됩니다. 이것이 객체 P1과 중앙의 관계입니다. 객체 중심을 인스턴스화 한 후 지정된 좌표 아래에 단단한 원이 그려지고 중앙 객체의 X 및 Y 좌표는 변경되지 않습니다. 단단한 원을 그리는 것에 기초하여, 물체 P1은 중심 좌표에 따라 지정된 주요 축 및 사소한 축의 타원형 궤도를 그립니다. 동시에 내부적으로 스레드 클래스를 구현하여 실행 스레드를 방해하지 않습니다. 상호 상속 관계는 센터와 P1이 서로 방해하지 않고 그래프를 그릴 수 있습니다. Stras 클래스의 PaintComponent () 메소드에서 스레드가 처음에 Repaint () 메소드를 호출하기 때문에 중앙 객체의 Draw () 메소드를 여전히 호출해야한다는 것을 언급 할 가치가 있습니다. 센터의 Draw () 메소드가 구현되지 않으면 최종 결과는 중앙 행성을 표시하지 않습니다.
PT와 P1의 관계 : PTHREAD 클래스는 스레드 클래스에서 상속되고 run () 메소드를 정의합니다. 객체 P1을 인스턴스화함으로써 시작 () 메소드를 호출하여 스레드를 시작할 수 있습니다. pthread 클래스는 시작 클래스 내부에 있으므로 P1의 방법을 통해 스레드를 제어 할 수 있습니다. 즉, 속도를 제어하고 가속 및 감속하며 실행 여부를 제어 할 수 있습니다.
f와 각 객체 사이의 관계 : 별 프레임은 jframe에서 상속됩니다. 실제로 인스턴스화 객체 F는 각 객체를 캔버스에 추가하고 인터페이스를 생성하며 각 구성 요소의 크기와 위치를 제어합니다. 이는 프로그램 작동의 핵심입니다.
4. 객체 지향적 이해 :
모든 것이 대상입니다. 어떤 학생들은 나에게 대상이 무엇인지 물었다. 나는 새로운 사람들이 대상이며 대상은 수업의 인스턴스화라고 대답했다. 이 프로그램에서는 별 수업을 인스턴스화하여 수많은 행성을 만들 수 있습니다 (이론적으로 예). 그러나 내부 기능 구현의 일부 문제는 해결하기가 어렵습니다. 가장 중요한 것은 PaintComponent () 메소드를 다시 작성하는 것입니다. 객체를 다시 만들면 메소드가 다시 다시 작성되므로 피할 수없는 문제가 발생하므로 해결할 수없는 후회이기도합니다!
더 많은 Java 관련 컨텐츠를 위해이 사이트에 관심이있는 독자는 "Java 객체 지향 프로그래밍에 대한 소개 및 고급 튜토리얼", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java Operation Dom Node Skills 요약", "Java 파일 및 디렉토리 운영 기술 요약"및 "Java Cache Cache 운영 기술 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.