7/2 まとめ


課題のまとめ

この講義で課した課題は以下の通り, 課題を提出し忘れた人も7月中に提出すれば(減点はするが),採点する.

試験について

共通試験
独自試験


今日の目標


前回の課題へのヒント

画像を作成するプログラムとして,Grad, Mandelをあげたが,図形を描く例をみてみることにする.
class Draw{
    /**
     *
     * Math.sqrtを呼び出して平方根を計算できる
     */
    static double distance(int x0,int y0, int x1, int y1){
	int dx=x0-x1;
	int dy=y0-y1;
	return Math.sqrt(dx*dx+dy*dy);
    }
    /**
     * circleX 円の中心のX座標 
     * circleY 円の中心のY座標 
     * circleR 円の半径
     */
    static boolean inCircle(int x, int y, int circleX, int circleY, int circleR){
	if(distance(x,y,circleX,circleY) <= circleR) {
	    return true;
	}
	else {
	    return false;
	}
    }
    /**
     * rectangleX 矩形の左上X座標
     * rectangleY 矩形の左上Y座標
     * rectangleW 矩形の幅
     * rectangleH 矩形の高さ
     */
    static boolean inRectangle(int x, int y, 
			    int rectangleX, int rectangleY, 
			    int rectangleW, int rectangleH){
	if(rectangleX <= x &&
	   x <= rectangleX+rectangleW &&
	   rectangleY <= y &&
	   y <= rectangleY+rectangleH){
	    return true;
	}
	else {
	    return false;
	}
    }
    public static void main(String args[]){
	int width=256;
	int height=256;
	int x,y;
	System.out.println("P3 "+width+" "+height+" 255"); 
	for(y=0;y < height;y++){
	    for(x=0;x < height;x++){
		/**
		 * 赤 r, 緑 g, 青 b をすべて0にすると黒
		 */
		int r=0, g=0, b=0;
		if(inRectangle(x,y,0,50,150,100)){
		    // 白みがかった暗い黄色
		    r=200; g=200; b=100;
		}
		if(inCircle(x,y,200,150,50)){
		    // 暗いマゼンダに
		    r=200; g=0; b=200;
		}
		if(inCircle(x,y,150,200,70)){
		    // 白を重ねる
		    r=r+100;
		    g=g+100;
		    b=b+100;
		    // 255までしか色を表現できないので,
		    // 255と小さい方の値を取ることにより,切り捨てる
		    // Math.minを呼び出して小さい方の値を取る
		    r=Math.min(255,r);
		    g=Math.min(255,g);
		    b=Math.min(255,b);
		}
		{
		    // (200,50)を中心にした緑のフレア効果
		    double len=distance(x,y,200,50);
		    g+=200*25/(len+20);
		    g=Math.min(255,g);
		}
		System.out.println(r+" "+g+" "+b);
	    }
	}
    }
}
このプログラムを実行した結果は,
となる.
class Sin{
    public static void main(String args[]){
	int width=256;
	int height=256;
	int x,y;
	System.out.println("P3 "+width+" "+height+" 255"); 
	for(y=0;y < height;y++){
	    for(x=0;x < width;x++){
		    // Math.sinを呼び出してsinを計算する
		double sinY=-Math.sin(x*0.03)*100.0+128.0;
		    // Math.absを呼び出して絶対値をとる
		    // (int)で整数型に変換する
		int dl=(int)Math.abs(y-sinY);
		int r,g,b;
		r=200*25/(dl+20);
		g=200*25/(dl+20);
		b=200*25/(dl+20);
		r=Math.min(255,r);
		g=Math.min(255,g);
		b=Math.min(255,b);
		System.out.println(r+" "+g+" "+b);
	    }
	}
    }
}
このプログラムを実行した結果は,
となる.