Javaプログラミング学習サイト ゆるゆるプログラミング

・Javaソースダウンロード(Pattern_Radiation01.java)

画像サイズと線の本数と線の角度を指定して、黒と白の放射状模様画像を作成するJavaソースコードです。画像の中心座標(mx,my)から黒い線が放射状に表示されるものです。画像のサイズを2で割って計算している中心座標(mx,my)を変更しても放射状画像は作成できます。いろいろと変更してみてください。

このソースについての記事はこちら「放射状模様」です。

Pattern_Radiation01.javaをダウンロード

ダウンロードしたファイルはzip形式です。解凍して使ってください。Windowsの場合、ダウンロードしたzipファイルをマウスの右ボタンでクリックして表示されるポップアップメニューから「すべて展開(T)」で解凍できます。

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class Pattern_Radiation01 {
	// Math.atan2メソッドを利用し、角度の戻り値を0~2πにしたもの
	private static double atan3( double y, double x )
	{
		// yが0以上の場合
		if ( 0.0 <= y )
			return Math.atan2( y, x );

		// yが0未満の場合
		return Math.atan2( y, x ) + 2.0 * Math.PI;
	}


	// メイン
	public static void main( String[] args ) {
		// 変数宣言
		int    w, h;	// 画像サイズ
		int    l_num;	// 本数
		double l_deg;	// 線の角度
		double w_deg;	// 白部分の角度
		String outname;	// 出力ファイル名
		BufferedImage img = null;	// 画像格納クラス

		// 入力した引数が5以上かを調べる
		if ( 5 > args.length ) {
			// 入力した引数が5未満の場合、使用方法を表示する
			System.out.println( 
				"Pattern_Radiation01 [PNG名] [幅] [高] [線の本数] [線の角度]" );
			return;
		}

		try {
			// 引数を変換し、画像の幅と高さをwとhに代入
			w =  Integer.valueOf( args[ 1 ] );
			h =  Integer.valueOf( args[ 2 ] );

			// 引数を変換し、線の本数l_numに代入
			l_num = Integer.valueOf( args[ 3 ] );
			if ( 1 > l_num ) {
				System.out.println( "線の本数に1以上を指定!" );
				return;
			}

			// 引数を変換し、線の角度l_degに代入
			l_deg = Double.valueOf( args[ 4 ] );
			if ( 0.0 >= l_deg ) {
				System.out.println( "線の角度に0.0より大きい値を指定!" );
				return;
			}
		}
		catch( NumberFormatException ne )
		{
			System.out.println( "引数が不正です" );
			return;
		}
		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
		outname = args[ 0 ];

		// 新しい画像を作成
		// 24ビットカラーの画像を作成
		try {
			img = new BufferedImage( w, h,
						 BufferedImage.TYPE_INT_RGB );
		} catch ( Exception e ) {
			// 画像作成に失敗したときの処理
			e.printStackTrace();
			return;
		}

		// 放射状模様 画像作成
		int    x, y;
		int    color, r, g, b;	// 計算した色
		double mx, my;		// 画像の中心の座標
		double deg, rad;	// (mx,my)を原点とした(x,y)の角度

		// 画像の中心座標を計算		
		mx = (double)( w - 1 ) / 2.0;
		my = (double)( h - 1 ) / 2.0;

		// 白部分の角度
		w_deg = ( 360.0 - (double)l_num * l_deg ) / (double)l_num;

		// 画像作成
		for ( y = 0; y < h; ++ y ) {
			for ( x = 0; x < w; ++ x ) {
				// 角度(ラジアン)を計算
				rad = atan3( (double)y - my, (double)x - my );

				// ラジアンを度に変換
				deg = rad * 180.0 / Math.PI;

				// 判定式
				if ( l_deg >= ( deg % ( l_deg + w_deg  ) ) )
					r = g = b = 0;
				else
					r = g = b = 255;
					
				// rgbを合成
				color = ( r << 16 ) + ( g << 8 ) + b;
				// 色を設定
				img.setRGB( x, y, color );
			}
		}

		try {
			// imgをoutname(出力PNG)に保存
			boolean result;
			result = ImageIO.write( img, "PNG", new File( outname ) );
		} catch ( Exception e ) {
			// outname(出力PNG)の保存に失敗したときの処理
			e.printStackTrace();
			return;
		}

		// 正常に終了
		System.out.println( "正常に終了しました" );
	}
}

このソースについての記事はこちら「放射状模様」です。

 

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

Topへ