放射楕円を描く


拡大する,拡大縮小する放射楕円を描画。

スレッドを使い,描画位置のxy座標と,幅と高さを変化さすことで,拡大,縮小。

Java Applet

ソースコード

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

public class ja04d extends Applet implements Runnable
{
  int xpos1,ypos1,xpos2,ypos2,xpos3,ypos3;  //放射楕円の左上のxy座標
  int r = 5;      //円の半径
  int cw,ch;      //放射する楕円の幅と高さ
  int n = 1;      //拡大する放射楕円の,半径の増分
  int m = 1;      //拡大縮小する楕円の,半径の増分
  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 < 10;i++){    //放射楕円(固定)
      ofg.setColor(new Color(i * 15,i * 25,i * 5));
      xpos1 = 70 - 7 * i;    //楕円の左上のxy座標
      ypos1 = 20 - 2 * i;
      cw = 2 * (r + 7 * i);     //放射楕円の幅
      ch = 2 * (r + 2 * i);     //放射楕円の高さ
      ofg.drawOval(xpos1,ypos1,cw,ch);  //オフスクリーンに描画
    }

    for(int i = 0;i < n;i++){     //0.3秒間隔で拡大する放射楕円
      ofg.setColor(new Color(i * 19,i * 16,i * 3));
      xpos2 = 100 - 7 * i;       //楕円の左上のxy座標
      ypos2 = 100 - 2 * i;
      cw = 2 * (r + 7 * i);     //放射楕円の幅
      ch = 2 * (r + 2 * i);     //放射楕円の高さ
      ofg.drawOval(xpos2,ypos2,cw,ch);  //オフスクリーンに描画
    }

    for(int i = 0;i < m;i++){     //0.3秒間隔で拡大縮小する放射楕円
            //i*i/2 は,最大時に真円にすりための調整
      ofg.setColor(new Color(i * 10,i * 18,i * 15));
      xpos3 = 300 - i * i / 2;        //楕円の左上のxy座標
      ypos3 = 100 - 7 * i;
      cw = 2 * (r + i * i / 2 );      //放射楕円の幅
      ch = 2 * (r + 7 * i);           //放射楕円の高さ
      ofg.drawOval(xpos3,ypos3,cw,ch);  //オフスクリーンに描画
    }

    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 += 1;           	//拡大する楕円の増分
        if(n > 15)n = 1;  	//一定以上になると,デフォルトの 1 に戻す

        if(b)m += 1;      	//拡大する楕円の増分
          if(m > 15)b = false;  //一定以上になると,フラグを反転さす
        if(!b)m -= 1;     	//縮小する楕円の減分
          if(m < 1)b = true;    //一定以下になると,フラグを反転さす

        repaint();
        Thread.sleep(300);    	//0.3秒間隔でスレッドを実行
      }catch(InterruptedException e){stop();}
    }
  }

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

末尾