一个时钟,其中有这样一句话
double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));hourAngle 是时针角度,
toRadians是将用度数测量的角转换为近似相等的用弧度测量的角。
minutes 是总的分钟
在下数学不好,请教一下toRadians括号中参数的意义。
解决方案 »
- 求助,List myList=new ArrayList()在主类中好用但在其他类中不好用
- 请问如何才能快速提取网页元素?
- JTable中行时间触发问题?
- java函数调用问题
- java 写文本文件
- 调查:大家读《JAVA 编程思想》第三版 (Thinking In Java 3rd)花了多长时间?
- 调用javabean的问题
- 键盘记录器编写
- java的开发环境是不是比.net的对硬盘配置低些呀?想学.net可是机器配置低,为些想学java,大家认为可以吗?
- 帮忙解决application与servlet通信的问题 ,马上给分
- struts2下的“Exception starting filter struts2”错误的问题
- JAVA五子棋网络版 需要传递棋子的 坐标信息 怎么传递到客户端哪 传递到客户端怎么提取出来使用
因为1分钟时针经过的角度为1 / (12小时内的分钟总数) * 360度
然后就得到上面的公式了两者相减,是因为时针是顺时针走的,每过一小时相当于减少一定角度
要做时钟其实就是根据时间来换算,把时分秒换算出来
然后再根据这些时间值换算成对应的角度
然后每个时间指针能够指对
然后用graphics类画出来就行了
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;class ClockPanel extends JPanel
{
private final double PI = Math.PI; //常数PI
private final int clockCircleDotX = 200; //表盘圆心横坐标
private final int clockCircleDotY = 150; //表盘圆心纵坐标
private final int clockCircleRadium = 125; //表盘圆的半径
private final int centerDotRadium = 5; //表盘中心小巧玲珑圆点的半径
private Graphics2D g;
private Calendar calendar;
private JLabel showTimeLabel;
private int hour , minute , second;
private double hourAngle , minuteAngle , secondAngle , numberAngle , bigScaleAngle , smallScaleAngle; public ClockPanel()
{
ClockThread ct = new ClockThread();
Thread t = new Thread(ct);
t.start(); setBackground(Color.YELLOW);
setLayout(new BorderLayout()); showTimeLabel = new JLabel();
add(showTimeLabel , BorderLayout.SOUTH);
showTimeLabel.setHorizontalAlignment(JLabel.CENTER);
} public void paintComponent(Graphics gra)
{
super.paintComponent(gra); //将Graphics 转为化 Graphics2D
g = (Graphics2D)gra; calendar = new GregorianCalendar();
hour = calendar.get(Calendar.HOUR);
minute = calendar.get(Calendar.MINUTE);
second = calendar.get(Calendar.SECOND); hourAngle = (hour * 2 * PI / 12) + (minute * 2 * PI / 60 / 12); //时针转过的角度加上分针转化为小时转过的角度,以12点为起点
minuteAngle = minute * 2 * PI / 60 ; //分针转过的角度,以12点为起点
secondAngle = second * 2 * PI / 60 ; //秒针转过的角度,以12点为起点
numberAngle = 2 * PI / 12; //数字圆转过的角度,以1点为起点
bigScaleAngle = 2 * PI / 12; //每个相邻的大刻度所夹的角度
smallScaleAngle = 2 * PI / 60; //每个相邻的小刻度所夹的角度 drawClockCircle();
drawCenterDot();
drawNumber();
drawBigScale();
drawSmallScale();
drawHourLine();
drawMinuteLine();
drawSecondLine();
showTime();
}
public void drawClockCircle() //画表盘的大圆
{
Ellipse2D.Double ellipse = new Ellipse2D.Double(75 , 25 ,
clockCircleRadium * 2 , clockCircleRadium * 2);
g.draw(ellipse);
}
public void drawCenterDot() //画表盘大圆的中心小圆
{
Ellipse2D.Double centerDot = new Ellipse2D.Double(clockCircleDotX - centerDotRadium /2 ,
clockCircleDotY - centerDotRadium / 2 ,
centerDotRadium , centerDotRadium);
g.fill(centerDot);
}
public void drawNumber() //画表盘周围数字
{
for (int i = 1 ; i <= 12 ; i++)
{
g.drawString(String.valueOf(i) ,
(float)((clockCircleDotX - 4) + (clockCircleDotY - 45) * Math.sin(i * numberAngle)) , //4,5为微调偏移量,(clockCircleDotX - 5,clockCircleDotY + 5)为数字圆的中心坐标
(float)((clockCircleDotY + 5) - (clockCircleDotY - 45) * Math.cos(i * numberAngle))
);
}
}
public void drawBigScale()
{
for (int i = 0 ; i < 12 ; i++)
{
Point2D.Double[] inBigScalePoint = new Point2D.Double[12]; //刻度外圈的12个点
Point2D.Double[] outBigScalePoint = new Point2D.Double[12]; //刻度内圈的12个点
inBigScalePoint[i] = new Point2D.Double(clockCircleDotX + (clockCircleDotY - 35) * Math.sin((i + 1) * bigScaleAngle) , //(clockCircleDotY - 35)为半径
clockCircleDotY - (clockCircleDotY - 35) * Math.cos((i + 1) * bigScaleAngle)
);
outBigScalePoint[i] = new Point2D.Double(clockCircleDotX + (clockCircleDotY - 25) * Math.sin((i + 1) * bigScaleAngle) , //(clockCircleDotY - 25)为半径
clockCircleDotY - (clockCircleDotY - 25) * Math.cos((i + 1) * bigScaleAngle)
);
Line2D.Double bigScaleLine = new Line2D.Double(inBigScalePoint[i] , outBigScalePoint[i]); //将外圈点和内圈点分别连起来
g.draw(bigScaleLine);
}
}
public void drawSmallScale()
{
for (int i = 0 ; i < 60 ; i++)
{
Point2D.Double[] inSmallScalePoint = new Point2D.Double[60]; //刻度外圈的60个点
Point2D.Double[] outSmallScalePoint = new Point2D.Double[60]; //刻度内圈的60个点
inSmallScalePoint[i] = new Point2D.Double(clockCircleDotX + (clockCircleDotY - 30) * Math.sin((i + 1) * smallScaleAngle) ,
clockCircleDotY - (clockCircleDotY - 30) * Math.cos((i + 1) * smallScaleAngle)
);
outSmallScalePoint[i] = new Point2D.Double(clockCircleDotX + (clockCircleDotY - 25) * Math.sin((i + 1) * smallScaleAngle) ,
clockCircleDotY - (clockCircleDotY - 25) * Math.cos((i + 1) * smallScaleAngle)
);
Line2D.Double smallScaleLine = new Line2D.Double(inSmallScalePoint[i] , outSmallScalePoint[i]); //将外圈点和内圈点分别连起来
g.draw(smallScaleLine);
}
}
public void drawHourLine() //画时针
{
Line2D.Double hourLine = new Line2D.Double(clockCircleDotX , clockCircleDotY ,
clockCircleDotX + (clockCircleDotY - 70) * Math.sin(hourAngle) , //clockCircleDotY - 70为时针的半径
clockCircleDotY - (clockCircleDotY - 70) * Math.cos(hourAngle)
);
g.draw(hourLine);
}
public void drawMinuteLine() //画分针
{
Line2D.Double minuteLine = new Line2D.Double(clockCircleDotX , clockCircleDotY ,
clockCircleDotX + (clockCircleDotY - 60) * Math.sin(minuteAngle) , //clockCircleDotY - 60为分针的半径
clockCircleDotY - (clockCircleDotY - 60) * Math.cos(minuteAngle)
);
g.draw(minuteLine);
}
public void drawSecondLine() //画秒针
{
Line2D.Double secondLine = new Line2D.Double(clockCircleDotX , clockCircleDotY ,
clockCircleDotX + (clockCircleDotY - 50) * Math.sin(secondAngle) , //clockCircleDotY - 50为秒针的半径
clockCircleDotY - (clockCircleDotY - 50) * Math.cos(secondAngle)
);
g.draw(secondLine);
}
public void showTime()
{
showTimeLabel.setText(String.valueOf(calendar.get(Calendar.YEAR)) + " - " +
String.valueOf((calendar.get(Calendar.MONTH)) + 1) + " - " +
String.valueOf(calendar.get(Calendar.DATE)) + " " +
String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + " : " +
String.valueOf(calendar.get(Calendar.MINUTE)) + " : " +
String.valueOf(calendar.get(Calendar.SECOND))
);
} private class ClockThread implements Runnable
{
public void run()
{
for(;;)
{
repaint(); //隔一秒重绘
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
}class ClockFrame extends JFrame
{
private final int frameLength = 400;
private final int frameWidth = 400;
private final int frameX = 1024 / 2 - 400 / 2;
private final int frameY = 768 / 2 - 400 / 2; public ClockFrame()
{
ClockPanel cp = new ClockPanel();
add(cp); setTitle("时钟");
setLocation(frameX , frameY);
setSize(frameLength , frameWidth);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}public class Clock
{
public static void main(String[] args)
{
ClockFrame cf = new ClockFrame();
}
}