一个时钟,其中有这样一句话
double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));hourAngle 是时针角度,
toRadians是将用度数测量的角转换为近似相等的用弧度测量的角。
minutes 是总的分钟
在下数学不好,请教一下toRadians括号中参数的意义。

解决方案 »

  1.   

    刚才没看清楚要求括号里面的90应该是0点时的时针角度360 * minutes / (12 * 60)表示时针又经过的角度数
    因为1分钟时针经过的角度为1 / (12小时内的分钟总数) * 360度
    然后就得到上面的公式了两者相减,是因为时针是顺时针走的,每过一小时相当于减少一定角度
      

  2.   

    Math.toRadians就是把角度转成弧度
    要做时钟其实就是根据时间来换算,把时分秒换算出来
    然后再根据这些时间值换算成对应的角度
    然后每个时间指针能够指对
    然后用graphics类画出来就行了
      

  3.   

    我写的一个时钟,你可以拿去研究一下
    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();
    }
    }