放射線を描く


三角函数を使い,放射線を描画。


ラジアン値を増加さすことで回転さす。
半径を増減させ,回転縮小さす。

放射線Applet

ソースコード

import java.applet.*;
import java.awt.*;

public class ja04b extends Applet implements Runnable
{
  int xpos1,ypos1,xpos2,ypos2,xpos3,ypos3;  //放射線の先端のxy座標
  int r = 60;       //放射線の半径
  int rd = 0;       //半径の増減量
  double n = 0;     //回転する放射線で使用するラジアン値の変化量
  boolean b = true; //拡大縮小する放射線で使用するフラグ
  Image of;         //オフスクリーン用のイメージ
  Graphics ofg;     //オフスクリーン用のイメージのGraphicsオブジェクト
  Thread td;        //スレッド

  public void init(){
    setBackground(Color.white);	  	//Appletの背景色を白色に設定
    of = createImage(size().width,size().height); //オフスクリーン用のイメージの作成
    ofg = of.getGraphics();   	//オフスクリーン用のイメージのGraphicsオブジェクトを取得
  }

  public void paint(Graphics g){
    ofg.setColor(this.getBackground());   //全体を背景色で塗り潰す
    ofg.fillRect(0,0,size().width,size().height);

    for(int i = 0;i < 24;i++){    	//1番目の放射線(固定)
      ofg.setColor(new Color(i * 8,i * 3,i * 10));
      xpos1 = (int)(70 + (r *Math.sin(2 * Math.PI * i / 24)));
      ypos1 = (int)(70 + (r *Math.cos(2 * Math.PI * i / 24)));
      ofg.drawLine(70,70,xpos1,ypos1);  //オフスクリーンに描画
    }

    for(int i = 0;i < 18;i++){    	//2番目の放射線(回転)
          //スレッドで,ラジアン値をn増加さすことで回転さす
      ofg.setColor(new Color(i * 13,i * 3,i * 10));
      xpos2 = (int)(200 + (r *Math.sin(2 * Math.PI * i / 18 + n)));
      ypos2 = (int)(70 + (r *Math.cos(2 * Math.PI * i / 18 + n)));
      ofg.drawLine(200,70,xpos2,ypos2);   //オフスクリーンに描画
    }

    for(int i = 0;i < 18;i++){    	//3番目の放射線(拡大縮小)
          //スレッドで,半径をrd分増減することで拡大縮小さす。
      ofg.setColor(new Color(i * 3,i * 13,i * 8));
      xpos3 = (int)(330 + ((20 + rd) *Math.sin(2 * Math.PI * i / 18)));
      ypos3 = (int)(70 + ((20 + rd) *Math.cos(2 * Math.PI * i / 18)));
      ofg.drawLine(330,70,xpos3,ypos3);   //オフスクリーンに描画
    }

    g.drawImage(of,0,0,this);   	//オフスクリーンイメージを画面に描画
  }

  public void update(Graphics g){
    paint(g);
  }

  public void start(){
    if(td == null){
      td = new Thread(this);
      td.start();
    }
  }

  public void run(){
    while(true){
      try{
        n += 0.12;      	//2番目の放射線で,増加さすラジアン値
        if(n > 6.28)n = 0;  	//1周分増加すると,0に戻す

        if(b){      //3番目の放射線のフラグ
          rd += 5;    		//半径を5ずつ増加さす
          if(rd > 40)b = false;
        }else{        		//半径が60を超えると,5ずつ減少さす
          rd -= 5;
          if(rd < 0)b = true;
        }
        repaint();
        Thread.sleep(300);    	//0.3秒間隔でスレッドを実行
      }catch(InterruptedException e){stop();}
    }
  }

  public void stop(){
    if(td != null){
      td.stop();
      td = null;
    }
  }
}

末尾