サイン・コサインと円の関係

サインが縦、コサインが横
っていうのがわかりやすくなるようなプログラムを考えてみる

//SinCos.java

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import static java.lang.Math.*;

public class SinCos {
  public static void main(String[] args){
    JFrame f = new JFrame("三角関数");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(400, 350);
    final Image img = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
    Image buf = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
    final Graphics2D g = (Graphics2D) img.getGraphics();
    final Graphics2D gb = (Graphics2D) buf.getGraphics();
    final JLabel lbl = new JLabel(new ImageIcon(buf));
    f.add(lbl);
    f.setVisible(true);

    new Thread(){
      @Override
      public void run() {
        for(;;){
          g.setColor(Color.WHITE);
          g.fillRect(0, 0, 400, 300);
          for(int i = 0; i < 200; ++i){
            //sin・cosの計算
            double r = PI * 2 * i / 200;
            int x = (int) (45 + cos(r) * 40);
            int y = (int) (45 - sin(r) * 40);
            //描画
            g.setColor(Color.WHITE);
            g.fillRect(5, 5, 100, 100);
            g.setColor(Color.BLACK);
            //円
            g.drawOval(5, 5, 80, 80);
            //円の中
            g.drawLine(45, 45, x, y);
            //sin
            g.drawString("sin", 140, 55);
            g.drawLine(100, 45, 300, 45);
            g.fillOval(i + 100, y, 2, 2);
            //cos
            g.drawString("cos", 50, 180);
            g.drawLine(45, 100, 45, 300);
            g.fillOval(x, i + 100, 2, 2);
            
            gb.drawImage(img, 0, 0, null);
            gb.setColor(Color.GRAY);
            gb.drawLine(i + 100, y, x, y);
            gb.drawLine(x, i + 100, x, y);
            lbl.repaint();
            try{
              Thread.sleep(20);
            }catch(InterruptedException e){}
          }
        }
      }
    }.start();
  }
}