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

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

このソースについての記事はこちら「三角関数 計算方法」です。

TriFunction.javaをダウンロード

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

public class TriFunction {
	// 角度から象限を求める
	static int GetOrthant( double deg )
	{
		if ( (   0.0 < deg ) && (  90.0 > deg ) ) return 1;
		if ( (  90.0 < deg ) && ( 180.0 > deg ) ) return 2;
		if ( ( 180.0 < deg ) && ( 270.0 > deg ) ) return 3;
		if ( ( 270.0 < deg ) && ( 360.0 > deg ) ) return 4;
		return 0;
	}


	public static void main(String[] args) {
		int    orthant;		// 角度を含む象限
		int    loopnumber;	// ループ回数
		double delta;		// 処理終了条件(角度の差)
		// 計算に使用
		double deg, rad;
		double deg1, deg2, degm;
		double x1, y1;
		double x2, y2;
		double mx, my, d;
		double new_x, new_y;
		// 計算結果(sin,cos,tan)
		double ans_sin, ans_cos, ans_tan;

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

		// 1番目の引数の値をdegに代入
		try {
			// 引数を変換し、角度degに代入
			deg = Double.valueOf( args[ 0 ] );
		}
		catch( NumberFormatException ne )
		{
			System.out.println( "引数が不正です" );
			return;
		}

		// 角度degを0.0~359.999...の範囲に直す
		for ( ; ; ) {
			// degが0.0未満
			if ( 0.0 > deg ) {
				deg += 360.0;
				continue;
			}
			// degが360.0以上
			if ( 360.0 <= deg ) {
				deg -= 360.0;
				continue;
			}
			// ループを抜ける
			break;
		}

		// 結果の初期化
		ans_sin = ans_cos = ans_tan = 0.0;
		loopnumber = 0;

		// 角度から象限を求める
		orthant = GetOrthant( deg );
		x1 = y1 = x2 = y2 = 0.0;
		deg1 = deg2 = 0.0;
		switch ( orthant )
		{
			case 1:
				deg1 = 0.0;
				deg2 = 90.0;
				x1 =  1.0;
				y1 =  0.0;
				x2 =  0.0;
				y2 =  1.0;
				break;

			case 2:
				deg1 = 90.0;
				deg2 = 180.0;
				x1 =  0.0;
				y1 =  1.0;
				x2 = -1.0;
				y2 =  0.0;
				break;

			case 3:
				deg1 = 180.0;
				deg2 = 270.0;
				x1 = -1.0;
				y1 =  0.0;
				x2 =  0.0;
				y2 = -1.0;
				break;

			case 4:
				deg1 = 270.0;
				deg2 = 360.0;
				x1 =  0.0;
				y1 = -1.0;
				x2 =  1.0;
				y2 =  0.0;
				break;

			default:
				// 0°
				if ( 0.0 == deg ) {
					ans_sin = 0.0;
					ans_cos = 1.0;
					ans_tan = ans_sin / ans_cos;
					break;
				}
				// 90°
				if ( 90.0 == deg ) {
					ans_sin = 1.0;
					ans_cos = 0.0;
					ans_tan = ans_sin / ans_cos;
					break;
				}
				// 180°
				if ( 180.0 == deg ) {
					ans_sin = 0.0;
					ans_cos = -1.0;
					ans_tan = ans_sin / ans_cos;
					break;
				}
				// 270°
				if ( 270.0 == deg ) {
					ans_sin = -1.0;
					ans_cos = 0.0;
					ans_tan = ans_sin / ans_cos;
					break;
				}

				// 原因不明のエラー
				System.out.println( "原因不明のエラー" );
				return;
		}

		// 角度が0/90/180/270以外
		if ( 1 <= orthant ) {
			delta = 0.000000001;
			// 無限ループ
			for ( ; ; ) {
				// ループ回数
				++ loopnumber;

				// 角度の中間値を計算
				degm = ( deg1 + deg2 ) / 2.0;

				// 座標の中間点を計算
				mx = ( x1 + x2 ) / 2.0;
				my = ( y1 + y2 ) / 2.0;

				// 原点(0,0)と(mx,my)を結ぶ線の
				// 単位ベクトル(new_x, new_y)を計算
				d = Math.sqrt( mx * mx + my * my );
				new_x = mx / d;
				new_y = my / d;

				// 角度の差がdelta未満で終了
				if ( Math.abs( degm - deg ) < delta ) {
					ans_sin = new_y;
					ans_cos = new_x;
					ans_tan = ans_sin / ans_cos;
					break;
				}

				// 角度を狭める
				if ( deg > degm ) {
					x1 = new_x;
					y1 = new_y;
					deg1 = degm;
				}
				else {
					x2 = new_x;
					y2 = new_y;
					deg2 = degm;
				}
			}
		}

		// 結果の表示
		System.out.println( "■計算結果" );
		System.out.println( "sin(" + deg + ")=" + ans_sin );
		System.out.println( "cos(" + deg + ")=" + ans_cos );
		System.out.println( "tan(" + deg + ")=" + ans_tan );
		System.out.println( "ループ回数=" + loopnumber );

		System.out.println();

		System.out.println( "■Mathクラスでの計算結果" );
		rad = Math.toRadians( deg );
		System.out.println( "sin(" + deg + ")=" + Math.sin( rad ) );
		System.out.println( "cos(" + deg + ")=" + Math.cos( rad ) );
		System.out.println( "tan(" + deg + ")=" + Math.tan( rad ) );
	}
}

このソースについての記事はこちら「三角関数 計算方法」です。

 

■新着情報

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

■広告

 

 

 

 

Topへ