月亮绕地球转

//Sky.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Sky extends JLabel implements ActionListener {   //标签类JLabel的子类--刻画天空
   Earth earth;                            
   Timer timer;                                               //计时器
   double pointX[]=new double[360],                           //double型数组pointX刻画水平坐标-地球相对于天空的
          pointY[]=new double[360];                           //double型数组pointY刻画垂直坐标-地球相对于天空的
   int w=400,h=400,i=0;
   Sky() {
     timer=new Timer(100,this);                               //创建timer--振铃间隔是100毫秒--当前Sky对象为其监视器
     earth = new Earth();                                     //构造了一个地球(实际上是一个标签对象)
     earth.setSize(200,200);                                  //地球(标签对象)大小为200*200
     add(earth);                                              //地球位于刻画天空的标签里(标签也可以是容器)
     pointX[0]=0;                                             //地球运动轨道的半径h/2
     pointY[0]=h/2; 
     double angle=1*Math.PI/180;                                          //刻度为1度-弧度 
     for(int i=0;i<359;i++) {                                             //计算出数组中各个元素的值--圆上的坐标点
       pointX[i+1]=pointX[i]*Math.cos(angle)-pointY[i]*Math.sin(angle);   //以圆中心为(0,0),第一个点为(0,h/2),顺时
       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);   //针旋转1弧度后的坐标
     }
     for(int i=0;i<360;i++) {           
       pointX[i]=0.5*pointX[i]+w/2;                                       //坐标缩放平移--将圆中心变为(w/2,h/2)
       pointY[i]=0.5*pointY[i]+h/2;                                       //轨道圆大小缩小1倍
     }
     timer.start();                                                       //计时器启动--每隔100毫秒就会触发ActionEvent
   }
   public void actionPerformed(ActionEvent e) {
       i=(i+1)%360;                                                       //0~359循环变化
       earth.setLocation((int)pointX[i]-100,(int)pointY[i]-100);          //设置earth对象(标签)在sky对象(标签)上的位置
   }
}

//Earth.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Earth extends JLabel implements ActionListener {  //标签类JLabel的子类--刻画地球
   JLabel moon;                                                //标签类--刻画(显示)月亮的外观
   Timer timer;                                                //计时器
   double pointX[]=new double[360],                            //double型数组pointX刻画水平坐标-月亮相对于地球的        
          pointY[]=new double[360];                            //double型数组pointY刻画垂直坐标-月亮相对于地球的
   int w=200,h=200,i=0;
   Earth() {
     timer=new Timer(20,this);//【代码1】                                 //创建timer,振铃间隔是20毫秒当前Earth对象为其监视器    
     setIcon(new ImageIcon("earth.jpg"));                      //设置地球(标签)的图标为earth.jpg
     setHorizontalAlignment(SwingConstants.CENTER);                       //设置地球(标签)对齐方式为居中
     moon=new JLabel(new ImageIcon("moon.jpg"),SwingConstants.CENTER);    //构造月亮(标签)对象
     moon.setSize(60,60);                                                 //设置月亮(标签)大小
     add(moon);//【代码2】                                                           //月亮(标签)放到刻画地球的标签对象里
     pointX[0]=0;                                                         //月亮运动轨道的半径h/2
     pointY[0]=h/2;
     double angle=1*Math.PI/180;                                          //刻度为1度 
     for(int i=0;i<359;i++) {                                             //计算出数组中各个元素的值--圆上的坐标点
       pointX[i+1]=pointX[i]*Math.cos(angle)-pointY[i]*Math.sin(angle);   //以圆中心为(0,0),第一个点为(0,h/2),顺时
       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);   //针旋转1弧度后的坐标
     }
     for(int i=0;i<360;i++) {           
       pointX[i]=0.8*pointX[i]+w/2;                                       //坐标缩放平移--将圆中心变为(w/2,h/2)    
       pointY[i]=0.8*pointY[i]+h/2;                                       //轨道圆大小缩小1倍
     }
     timer.start();//【代码3】                                                       //计时器启动--每隔100毫秒就会触发ActionEvent
   }
   public void actionPerformed(ActionEvent e) { 
       i=(i+1)%360;                                                       //0~359循环变化
       moon.setLocation((int)pointX[i]-30,(int)pointY[i]-30);             //设置moon对象(标签)在earth对象(标签)上的位置
   }
}

//MainClass.java

import javax.swing.*;
public class MainClass {
      public static void main(String args[]) {
      Sky sky= new Sky();                                            //构造了一个天空(标签对象)
      JFrame frame = new JFrame();                                   //构造了一个框架(窗体)
      frame.setTitle("月亮绕地球转");
      frame.add(sky);                                                //将天空(标签)置于框架(窗体)里
      frame.setSize(400,300);
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);                             //设置窗体的位置--居中
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().setBackground(java.awt.Color.white);    //将窗体转换为一个容器并设置其背景色为白色
    }
}

earth.jpg       moon.jpg

时间: 2024-12-25 03:15:08

月亮绕地球转的相关文章

每架飞机只有一个油箱,一箱油可供一架飞机绕地球飞半圈,空中没有加油机,但飞机之间可以相互加油。

每架飞机只有一个油箱,一箱油可供一架飞机绕地球飞半圈,空中没有加油机,但飞机之间可以相互加油. 问:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机? (所有飞机从同一机场起飞,不允许中途降落,必须全部安全返回机场) 6架足矣.3架飞机A.B.C同时起飞,同向而行.飞至1/8航程(绕地球一周)处,正好耗去1/4燃油,其中1架飞机A将2×1/4油箱燃油分加至的飞机B.C油箱中,然后带1/4燃油正好能安全返航.此时飞机B.C油箱是满的.剩下2架飞机继续飞行1/8航程,也就是1/4航

月亮围绕地球的运动

基本参数 偏心率:1/18 近地点:363300 远地点:405500 平均距离:384400 其他运动 月亮围绕地球运动的椭圆,绕着地球,沿正方向运行.椭圆的长轴在3232日或8年零310天里转一周. 月亮的轨道(白道)和黄道的交角有5°多.因此不是每月都有日食和月食.黄白两道的交点线下6798日沿相反方向,在黄道上转动一周. 黄白两道的交角也在变化,平均值是5°8′48″.极小值5°0′1″.极大值5°17′35″.周期173日 中心差 出差 ... ... 月亮的实际运动 ? ? 月亮的质

POJ 1061 青蛙绕地球约会-数论-(解一元一次同余方程+扩展欧几里得算法)

题意:两只青蛙同向跳,起点是x,y,每次分别跳m,n米,地球周长是L,求最少跳几次相遇. 分析: 把式子写好就发现是一个一元一次同余方程.用扩展欧几里得算法来求.这题很基本得会. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #define INF 100000

自从干了IT,我犯过的这些错可以绕地球一圈…

人非圣贤孰能无过,而作为ITer,你又犯过哪些错误?这里分享几则『51CTO论坛』小伙伴的"真实事迹",给大家敲响警钟! PS:看了大家的分享,我想说,一个个都还活的好好的!不容易啊! PPS:本篇内容整理自<作为IT人你犯过什么样的错误?> 看看下面这个朋友,还有什么是他没干过的! 格过服务器:插过环路:内网开过DHCP:格过老大电脑:客户现场删过客户备份文件:恢复没恢复过来:批量部署:删过财务电脑:装系统温度太高烧过硬盘:用引导盘删过全盘:开过肉鸡,在自己公司抓过码:勿

java复习总结

月亮绕地球转.编写一个应用程序,模拟月亮围绕地球转. MainClass.java import javax.swing.*;public class MainClass { public static void main(String args[]) { Sky sky= new Sky(); //构造了一个天空(标签对象) JFrame frame = new JFrame(); //构造了一个框架(窗体) frame.setTitle("月亮绕地球转"); frame.add(s

时间单位换算

时间单位 秒. 毫秒(ms).微秒 (μs). 纳秒(ns). 皮秒(ps). 飞秒(fs).阿秒.渺秒 1 s = 10^3 ms = 10^6 us = 10^9 ns = 10^12 ps = 10^15 fs=10^18阿秒=10^21渺秒=10^43普朗克常数 毫秒 毫秒是一种较为微小的时间单位,是一秒的千分之一.典型照相机的最短曝光时间为一毫秒.一只家蝇每三毫秒扇一次翅膀:蚊子二十毫秒振翅一次:蜜蜂则每五毫秒扇一次.由于月亮绕地球的轨道逐渐变宽,它绕一圈所需的时间每年长两毫秒.在计算

【转】时标与历法

1.时标 时标(Time Scale)就是标度时间的方法.在时间的标度上,存在着两个相互独立的需求:一方面,我们希望时间标度能与地球的自转相吻合,可以称作天文学需求:另一 方面,我们要求时间标度的单位是精确的,便于大家获得准确的时间.由于地球自转的不均匀性,从这两个需求出发制定的时标会有细微的差异. 世界时(UT1)是基于地球自转的时标,下文会详细介绍.国际原子时(TAI)是基于单位时间的时标,它以"铯-133原子基态两个超精细能级间跃迁辐射 9,192,631,770周所持续的时间"

阳历转换成阴历PHP实现详解

相关概念 阳历,有很强的规律性.每年12个月,1.3.5.7.8.10.12月都为31天:平年2月份28天,润年2月份29天,其余的月30天. 阴历,却没有这些规律可循.平年十二个月,大月三十天,小月二十九天,全年354天或355天(一年中哪个月大,哪个月小,年年不同).由于每年的天数比太阳年约差十一天,所以在十九年里设置七个闰月,有闰月的年份全年383天或384天.又根据太阳的位置,把一个太阳年分成二十四个节气,以利于农业种植等活动.纪年用天干地支搭配,六十年周而复始.这种历法相传创始于夏代,

时间单位的档案

时间单位的档案 2011-09-14 10:33:20 分类: C/C++ 编辑: 李瑛 撰文/David Labrader [崔琳琳/译 曾少立/校]时间的单位可以从极小到极大,下面的描述是想传达一种超大时间跨度的感受.一渺秒(十亿分之一秒的十亿分之一)科学家是用渺秒来对瞬时事件进行计时的.研究人员已经用稳定的高速激光产生了仅持续250渺秒的光脉冲.尽管这一时间间隔短得无法想像,但是和普朗克常数相比还是很长的.普朗克常数大约为10-43秒,被认为是可能持续的最短时间.一飞秒(十亿分之一秒的百万