ゆるゆるプログラミング

・円を描く(テキスト版)

テキストで塗りつぶし円を表現する方法を紹介します。ここで紹介するプログラムで出力するテキストの表示は、黒色は'●'、白色は'○'で表現します。

以下は、塗りつぶし円をテキストで表現するJavaソースコードで、半径の文字数を指定して円を表示します。

TextCircle1.java ← クリックしてダウンロードページに移動
001:    public class TextCircle1 {
002:    	public static void main( String[] args ) {
003:    		// 変数宣言
004:    
005:    		// 半径
006:    		int r;
007:    		// xy座標
008:    		int x, y;
009:    		// 幅
010:    		int width;
011:    		// 円の中心座標
012:    		double mx, my;
013:    		// 円の中心座標から(x,y)の距離計算用
014:    		double l, dx, dy;
015:    
016:    
017:    		// 入力した引数が1以上かを調べる
018:    		if ( 1 > args.length ) {
019:    			// 入力した引数が1未満の場合、使用方法を表示する
020:    			System.out.println( "TextCircle1 [半径]" );
021:    			return;
022:    		}
023:    
024:    		try {
025:    			// 引数を変換し、半径をrに代入
026:    			r =  Integer.valueOf( args[ 0 ] );
027:    		}
028:    		catch( NumberFormatException ne )
029:    		{
030:    			System.out.println( "引数が不正です" );
031:    			return;
032:    		}
033:    
034:    		// 入力した半径は1未満であれば処理を実行しない
035:    		if ( 1 > r ) {
036:    			System.out.println( "半径に1以上を指定してください!" );
037:    			return;
038:    		}
039:    
040:    		// 幅を計算
041:    		width = r * 2;
042:    
043:    		// 円の中心座標
044:    		mx = (double)( width - 1 ) / 2.0;
045:    		my = (double)( width - 1 ) / 2.0;
046:    
047:    		// 円模様テキストの作成
048:    		for ( y = 0; y < width; ++ y ) {
049:    			dy = (double)y - my;
050:    			for ( x = 0; x < width; ++ x ) {
051:    				dx = (double)x - mx;
052:    				// 中心座標からの距離を計算
053:    				l = Math.sqrt( dx * dx + dy * dy );
054:    				if ( l <= (double)r )
055:    					System.out.print( "●" );
056:    				else
057:    					System.out.print( "○" );
058:    			}
059:    			// 改行
060:    			System.out.println();
061:    		}
062:    	}
063:    }

TextCircle1の実行例

java TextCircle1 10

出力結果

テキスト円描画

半径10文字(直径20文字)の塗り潰し円です。

ここからは、このJavaソースコードを上から順番に解説していきます。

001:    public class TextCircle1 {

クラス名を、TextCircle1としています。

002:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

003:    		// 変数宣言
004:    
005:    		// 半径
006:    		int r;
007:    		// xy座標
008:    		int x, y;
009:    		// 幅
010:    		int width;
011:    		// 円の中心座標
012:    		double mx, my;
013:    		// 円の中心座標から(x,y)の距離計算用
014:    		double l, dx, dy;

このプログラムで使う変数を宣言しています。

017:    		// 入力した引数が1以上かを調べる
018:    		if ( 1 > args.length ) {
019:    			// 入力した引数が1未満の場合、使用方法を表示する
020:    			System.out.println( "TextCircle1 [半径]" );
021:    			return;
022:    		}

1つ以上の引数が与えられたかをチェックし、1つ未満の場合に、使い方のメッセージを表示し、returnによってmainメソッドを抜けています。

024:    		try {
025:    			// 引数を変換し、半径をrに代入
026:    			r =  Integer.valueOf( args[ 0 ] );
027:    		}
028:    		catch( NumberFormatException ne )
029:    		{
030:    			System.out.println( "引数が不正です" );
031:    			return;
032:    		}

与えられた引数を、作成する円の半径を格納する変数rに代入しています。引数はString型なので、Integerクラスを使ってint型に変換しています。

034:    		// 入力した半径は1未満であれば処理を実行しない
035:    		if ( 1 > r ) {
036:    			System.out.println( "半径に1以上を指定してください!" );
037:    			return;
038:    		}

半径rが1未満の場合に、メッセージを表示し、returnによってmainメソッドを抜けています。

040:    		// 幅を計算
041:    		width = r * 2;

テキスト全体の幅widthを計算しています。半径rを2倍した値をwidthに代入しています。

043:    		// 円の中心座標
044:    		mx = (double)( width - 1 ) / 2.0;
045:    		my = (double)( width - 1 ) / 2.0;

円の中心座標(mx,my)を計算しています。mxとmyに(double)(width-1)/2.0を格納しています。テキスト座標の範囲はxとyそれぞれ0~width-1なので中心座標はwidthから1を引いた値を2で割ります。

047:    		// 円模様テキストの作成
048:    		for ( y = 0; y < width; ++ y ) {
049:    			dy = (double)y - my;
050:    			for ( x = 0; x < width; ++ x ) {
051:    				dx = (double)x - mx;

for文でxとyとループを作成し、xと中心座標mx、yと円の中心座標中心座標myとの差をdxとdyに代入しています。

052:    				// 中心座標からの距離を計算
053:    				l = Math.sqrt( dx * dx + dy * dy );

変数lに円の中心座標(mx,my)と(x,y)の距離を計算した値を代入しています。これはピタゴラスの定理を使って計算しています。

054:    				if ( l <= (double)r )
055:    					System.out.print( "●" );
056:    				else
057:    					System.out.print( "○" );

変数lが半径r以下の場合に'●'、半径rを超える場合に'○'を出力しています。

059:    			// 改行
060:    			System.out.println();

1行の出力が終了したら、println()で改行しています。

■関連コンテンツ

模様の描画 いろいろな模様の描画方法を紹介
2点間の距離 2点間の距離計算
for文 繰り返し処理に使用するfor文について解説

■新着情報

2020.07.08 公約数 公約数
2020.07.08 最大公約数 1番大きい約数は?
2020.06.18 3つの値の最大最小 3つの値の最大/最小値
2020.06.03 円を描く(テキスト版) テキストを円を描く
2020.06.02 文字の間違い探し どの文字が違う?

■広告

フィギュア予約最大25%OFF+ポイント5%還元!ホビーサーチ

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

 

Topへ