使用Java怎么模拟行星运动

  介绍

使用Java怎么模拟行星运动?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>一、类的设计:

明星继承自JPanel.Star类是行星的基类,所有运动的行星都是继承自明星类。内部画()方法主要绘制了一个实心圆形、目的是在每次绘制时,可以保证中心行星始终显示.paintComponent()方法重写了JPanel的绘制方法,目的是保证继承自明星类的明星类的实例对象可以绘制出自己的行星。如下:

package 明星;   import  java.awt.Color;   import  java.awt.Graphics;   import  javax.swing.JPanel;   public  class  Star  extends  JPanel {   ,/* *   ,,*,基本的行星类   ,,*/private 才能static  final  long  serialVersionUID =, 1 l;   int 才能;x, y;   int 才能,宽度,高度;   public 才能;明星(),{   ,,,width =, 10;   ,,,height =, 10;   ,,}   public 明星才能(int  x,, int  y) {   ,,,this.x =, x;   ,,,this.y =, y;   ,,,width =, 10;   ,,,height =, 10;   ,,}   public 才能;void 画(Graphics  g) {   ,,,g.setColor (Color.blue);   ,,,g.fillOval (x, y),宽度,高度);   ,,}   protected 才能;void  paintComponent (Graphics  g) {   ,,,super.paintComponent (g);   ,,,g.fillOval (x, y),宽度,高度);   ,,}   }

明星类继承自明星类,是对明星类的进一步细化,表示运动的行星.Stars类中的阿尔法表示运动行星的运动起始角度,速度表示运动速度,可对其进行修改.Long,短分别表示椭圆轨迹的长轴与短轴.center表示其实例化对象的中心行星.paintComponent()函数重写了paintComponent()内部引用了父类的画()函数,并且根据长、短绘制了椭圆轨道,长,短由实例化对象调用构造方法来决定.move()函数描述了x, y的变化方程,即围绕着椭圆轨道变化,同时规定了阿尔法的变化方式.start()函数表示线程开始,暂停()函数表示线程暂停,加速()函数表示对行星的加速操作,减速()函数表示对行星减速的操作。

Pthread类目的是控制线程,即通过对Pthread类的实例化可以控制行星的开始运动,暂停运动,加速、减速.Pthread类继承自线程类,且包含于开始类中,因而,Pthread类不能被定义为共有类.Pthread类提供了运行()方法,不断调用重画()方法,对画面进行重新绘制.setsuspend()方法利用改变布尔变量对线程进行暂停操作(调用notifyall()方法)。因为Pthread类是开始的内部类,所以之后开始类中将生成一个Pthread类的对象,并且利用该对象,对线程进行操作。

设计如下:

package 明星;   import  java.awt.Color;   import  java.awt.Graphics;   public  class  Stars  extends 明星{   ,/* *   ,,*,运动的行星   ,,*/private 才能static  final  long  serialVersionUID =, 1 l;   double 才能;alfa ;   double 才能;speed ;   Star 才能;中心;   int 才能Long ,,//长轴   int 才能;短;//短轴   public 才能;星星(int  Px, int  Py Star 中心){   ,,,超级(Px, Py);   ,,,this.center =,中心;   ,,,Long =, (Px 作用;center.x) * 2;   ,,,Short =, (Py 作用;center.y) * 2;   ,,,this.setOpaque(真正的);//,,,();   ,,,alfa =, 0;   ,,,speed =, 0.001;   ,,}   protected 才能;void  paintComponent (Graphics  g) {   ,,,super.paintComponent (g);   ,,,center.draw (g);//画出中心点   ,,,();   ,,,g.setColor (Color.GREEN);   ,,,g.drawOval (center.x-Long/2,, center.y-Short/2,,,,短);   ,,}   public 才能;void 移动(){   ,,,x =, center.x  +, (int)(长/2 * Math.cos(阿尔法));   ,,,y =, center.y  +, (int)(短/2 * sin(阿尔法));   ,,,//沿椭圆轨迹运行   ,,,alfa  +=,速度;   ,,,//角度不断变化   ,,}   class 才能PThread  extends 线程{//重才能画线程类   ,,,private  boolean  suspend =,真的;   ,,,private  String  control =,““   ,,,public  void 运行(){   ,,,,,,(真正的){   ,,,,,,,synchronized (控制),{   ,,,,,,,,,如果(暂停){   ,,,,,,,,,,,//移动();   ,,,,,,,,,,,重画();   ,,,,,,,,,}   ,,,,,,,}   ,,,,,}   ,,,}   ,,,public  void  setsuspend (boolean  s) {   ,,,,,//设置线程暂停方法   ,,,,,,if (暂停),{   ,,,,,,,,synchronized (控制),{   ,,,,,,,,,,control.notifyAll ();   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用Java怎么模拟行星运动