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

2020/06/03 公開

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

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

以下は、塗りつぶし円をテキストで表現する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点間の距離計算
画像の中心座標 画像の中心座標は?
値のコンソール表示 print()、println()とは?
繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

for文の中にfor文-画像

多重ループ

for文などのループの中にループをいれたプログラムの構造、多重ループについて説明しています。

市松模様のテキスト表示方法を紹介-画像

市松模様(テキスト版)

和柄の一つである市松模様のテキスト文字で表現する方法を紹介しています。

三角形を描く(テキスト版) その1-画像

三角形を描く(テキスト版) その1

for文を使ってテキストの直角三角形を表現する方法を解説しています。底辺が下になる直角三角形です。

三角形を描く(テキスト版) その2-画像

三角形を描く(テキスト版) その2

for文を使ってテキストの直角三角形を表現する方法を解説しています。底辺が上になる直角三角形です。

■新着情報

2021.06.18 変数の初期値 変数に値を代入しないで計算
2021.05.28 短針と長針の角度 短針と長針の角度は?
2021.05.19 各位(くらい)を求める 1の位の値は?10の位は?

■広告

 

 

 

 

 

 

 

 

 

Topへ