中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java怎么模擬行星運動

發布時間:2021-04-15 17:29:22 來源:億速云 閱讀:247 作者:Leah 欄目:編程語言

使用Java怎么模擬行星運動?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、類的設計:

Star繼承自JPanel。Star類是行星的基類,所有運動的行星都是繼承自Star類。內部draw()方法主要繪制了一個實心圓形,目的是在每次繪制時,可以保證中心行星始終顯示。paintComponent()方法重寫了JPanel的繪制方法,目的是保證繼承自Star類的Stars類的實例對象可以繪制出自己的行星。如下:

package Star;
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 width,height;
  public Star() {
    width = 10;
    height = 10;
  }
  public Star(int x, int y){
    this.x = x;
    this.y = y;
    width = 10;
    height = 10;
  }
  public void draw(Graphics g){
    g.setColor(Color.blue);
    g.fillOval(x, y, width, height);
  }
  protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.fillOval(x, y, width, height);
  }
}

Stars類繼承自Star類,是對Star類的進一步細化,表示運動的行星。Stars類中的alfa表示運動行星的運動起始角度,speed表示運動速度,可對其進行修改。Long,Short分別表示橢圓軌跡的長軸與短軸。center表示其實例化對象的中心行星。paintComponent()函數重寫了paintComponent(),內部引用了父類的draw()函數,并且根據Long,,Short繪制了橢圓軌道,Long、Short由實例化對象調用構造方法來決定。move()函數描述了x,y的變化方程,即圍繞著橢圓軌道變化,同時規定了alfa的變化方式。start()函數表示線程開始,pause()函數表示線程暫停,accelerate()函數表示對行星的加速操作,decelerate()函數表示對行星減速的操作。

Pthread類目的是控制線程,即通過對Pthread類的實例化可以控制行星的開始運動,暫停運動,加速,減速。Pthread類繼承自Thread類,且包含于Starts類中,因而,PThread類不能被定義為共有類。PThread類提供了run()方法,不斷調用repaint()方法,對畫面進行重新繪制。setsuspend()方法利用改變boolean變量對線程進行暫停操作(調用notifyall()方法)。因為Pthread類是Starts的內部類,所以之后Starts類中將生成一個PThread類的對象,并且利用該對象,對線程進行操作。

設計如下:

package Star;
import java.awt.Color;
import java.awt.Graphics;
public class Stars extends Star{
  /**
   * 運動的行星
   */
  private static final long serialVersionUID = 1L;
  double alfa ;
  double speed ;
  Star center;
  int Long ; //長軸
  int Short;//短軸
  public Stars(int Px,int Py,Star center){
    super(Px,Py);
    this.center = center;
    Long = (Px - center.x)*2;
    Short = (Py - center.y)*2;
    this.setOpaque(true);
//   move();
    alfa = 0;
    speed = 0.001;
  }
  protected void paintComponent(Graphics g){
    super.paintComponent(g);
    center.draw(g);//畫出中心點
    move();
    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));
    //沿橢圓軌跡運行
    alfa += speed;
    //角度不斷變化
  }
  class PThread extends Thread{
  //重畫線程類
    private boolean suspend = true;
    private String control = "";
    public void run(){
      while(true){
        synchronized (control) {
          if(suspend){
            //move();
            repaint();
          }
        }
      }
    }
    public void setsuspend(boolean s){
      //設置線程暫停方法
       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(){
    //加速的方法
    if(speed > 0){
      //角度每次加速0.0002
      speed += 0.0002;
    }
    else
      speed = 0.001;
  }
  public void decelerate(){
    //減速的方法
    if(speed > 0){
      speed -= 0.0002;
      //角度每次減速0.0002
    }
    //若減速到0,則不能繼續減速,另速度為0,停止運動
    else speed = 0;
  }
}

StarFrame類是本程序的啟動面板,通過實例化該類,生成主程序界面,并且將行星部件,按鈕,標簽添加進面板。內部的getPanel()方法對兩個按鈕進行了設置,并且返回一個JPanel(將四個按鈕添加進該JPanel中)。getLabel()方法返回一個文字描述的JLabel。Center對象是Star類的實例化,p1是Stars類的實例化,分別表示中心行星與環繞行星。jb1,jb2,jb3,jb4分別是行星的啟動,暫停,加速,減速的控制按鈕。image表示界面背景圖,LayeredPanel是界面的層次面板,方便背景圖的設置。jp,jl是設置背景圖的部件。設計如下:

package Star;
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;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class StarFrame extends JFrame{
  /**
   *行星模擬啟動面板
   */
  private static final long serialVersionUID = 1L;
  Star center = new Star(300,200);//定義中心行星
  Stars p1 = new Stars(300+230,200+130,center);//環繞中心的行星
  Stars p2 = new Stars(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(image);
    jp.add(jl);
    //將jp放到最底層。
    layeredPane.add(jp,JLayeredPane.DEFAULT_LAYER);
    //將jb放到高一層的地方
    layeredPane.add(p1,JLayeredPane.MODAL_LAYER);
//   layeredPane.add(p2,JLayeredPane.MODAL_LAYER);
    layeredPane.add(getPanel(),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-generated method stub
        p1.pause();
      }
    });
    jb3.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        p1.accelerate();
      }
    });
    jb4.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated 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(){
    //返回定義的四個按鈕
    JPanel jp = new JPanel();
    jp.add(jb1);
    jp.add(jb2);
    jp.add(jb3);
    jp.add(jb4);
    jp.setBounds(750,450,200,70);
    return jp;
  }
  private JPanel getLabel(){
    //返回文字描述
    JLabel jl = new JLabel("行星模擬");
    jl.setForeground(Color.RED);//設置字體顏色
    jl.setFont(new Font("Dialog",0,20));//設置字體
    JPanel jp = new JPanel();
    jp.add(jl,BorderLayout.CENTER);
    jp.setBounds(800,0,150,40);
    return jp;
  }
  public static void main(String[] args) {
    @SuppressWarnings("unused")
    StarFrame f = new StarFrame();
  }
}

運行效果:

使用Java怎么模擬行星運動

二、對象:

因為java是面向對象的語言,當然不能像c語言一樣,僅僅靠函數實現,課設里豈能沒有對象?

主要對象:

對象center,即中心行星

對象p1,即環繞行星

對象pt,即負責控制線程的對象

對象f,即程序啟動面板

三、對象之間的關系(交互)

p1與center的關系:Star類是行星的基類,繼承自JPanel,其內部定義了基本的半徑與坐標,其實例化對象center即是運動行星的中心行星。而繼承自Star的Stars類表示運動行星,是其進一步的細化,因此其實例化對象p1表示運動的行星1,且圍繞著center運動,同時center作為參數傳遞給p1的構造方法,完成二者交互。對象p1與center便是這樣的關系。實例化對象center后,便會在指定坐標下繪制實心圓形,center對象的x,y坐標不會變化。而對象p1在實現繪制實心圓形的基礎上,又根據center的坐標繪制了指定長軸,短軸的橢圓軌道,同時其內部實現了Thread類,不中斷的執行線程。相互的繼承關系,使得center和p1可以互不干擾的繪制圖形,值得一提的是,在Stras類中的paintComponent()方法中,仍需要調用center對象的draw()方法,因為線程開始時會調用repaint()方法,如果不實現center的draw()方法,那么最終結果將不會顯示中心行星。

pt與p1的關系:PThread類繼承自Thread類,定義了run()方法,通過其實例化對象p1,可以調用start()方法啟動線程,而PThread類在Starts類內部,因而通過p1內的方法可以控制線程,即控制其速度,加速減速,控制其運行與否。

f與各對象的關系:StarFrame繼承自JFrame,其實例化對象f將各對象添加進繪畫布里,制作了界面,并控制了每個部件的大小、位置,是程序運行的關鍵。

看完上述內容,你們掌握使用Java怎么模擬行星運動的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦城县| 高雄县| 从化市| 辛集市| 烟台市| 大荔县| 边坝县| 沿河| 大埔县| 筠连县| 张家界市| 临泉县| 洛隆县| 团风县| 武安市| 武穴市| 黄平县| 延庆县| 嘉兴市| 南昌市| 郧西县| 周至县| 和平区| 济南市| 莱芜市| 滕州市| 舞阳县| 铜鼓县| 安吉县| 庆安县| 沂水县| 余江县| 长治市| 吉木乃县| 石楼县| 库尔勒市| 长兴县| 嘉善县| 泸溪县| 肃宁县| 武夷山市|