【Java】Mathクラスの利用

2018年3月11日

本稿は、数学関数が多数定義されているMathクラスの一部の機能を紹介します。

Mathクラスには数学関数を利用するためのstaticメソッドが多数存在します。

皆さんが大好きな、サインコサイン等ですね。

私は、偏差値30台の底辺校に通っていましたが、当時サインコサインのテストで30点台だったのは今でも覚えています。

私も数学は得意ではないですが、わかる範囲でゲーム制作に必要そうな機能のみ説明していきます。

PI定数

Math.PIでアクセス可能で、円周率を取得できます。

public class Test{
	public static void main(String[] args){
		System.out.println(Math.PI);
	}
}
実行結果

3.141592653589793

toRadiansメソッド

私たち一般人がわかる角度を引数に指定することで、ラジアンに変換します。

ラジアンとは角度の単位です。

だからどうしたって感じですが、基本的に数学関数には、このラジアンの値で引数に指定するので角度とラジアンの相互変換はできるようにしておきましょう。

基本的に同じものを表すと思って貰って構いません。

public class Test{
	public static void main(String[] args){
		System.out.println(Math.toRadians(90));
	}
}
実行結果

1.5707963267948966

90度のラジアン値は1.5707963・・・ということがわかります。

toDegreesメソッド

ラジアン値を私たち一般人がわかる角度に変換します。

例えば、円周率は180度を表すラジアン値なのですが、円周率をこのメソッドに指定すると180が取得できます。

public class Test{
	public static void main(String[] args){
		System.out.println(Math.toDegrees(Math.PI));
	}
}
実行結果

180.0

sinメソッド

sinメソッドは引数に角度を表すラジアン値を指定することで、円の中心点から指定した角度へ移動させる時のy座標の移動比率を-1(-100%)~1(100%)の間で取得できます。

これを利用すれば、シューティングゲームなどで特定の角度に弾を発射したい場合に、移動量*比率を計算するとその角度へ移動させるy座標量が計算できます。

public class Test{
	public static void main(String[] args){
		double kakudo = Math.toRadians(87);
		System.out.println(Math.sin(kakudo));
	}
}
実行結果

0.9986295347545738

角度が87度の時のy座標の移動比率は0.99862・・・・になるようですね。

cosメソッド

cosメソッドは引数に角度を表すラジアン値を指定することで、円の中心点から指定した角度へ移動させる時のx座標の移動比率を-1(-100%)~1(100%)の間で取得できます。

sinと同じように、移動量*比率を計算するとその角度へ移動させるx座標量が計算できます。

public class Test{
	public static void main(String[] args){
		double kakudo = Math.toRadians(87);
		System.out.println(Math.cos(kakudo));
	}
}
実行結果

0.052335956242943966

角度が87度の時のx座標の移動比率は0.05233・・・・になるようですね。

atan2メソッド

atan2メソッドは二点間のx座標距離と、y座標距離を指定することで、その角度のラジアン値を取得できます。

これをsin、cosメソッドと一緒に使用すれば、シューティングゲームなどで特定のキャラを狙って弾を移動させることができます。

ホーミング弾もここまでのメソッドのみで作成可能になってしまいます。

引数は第一引数にy座標の距離、第二引数にx座標距離を指定します。

よく間違えますので気を付けましょう。

public class Test{
	public static void main(String[] args){
		double kakudo = Math.atan2(100-0,100-0);
		System.out.println(Math.toDegrees(kakudo));
	}
}
実行結果

45.0

このサンプルでは、座標[x1=0,y1=0]と座標[x2=100,y2=100]の二点間を想定し、その角度を求めています。

恐らく想像もしやすいかもしれないですが、ちょうど45度になります。

ちゃんと結果も45度になりました。

atan2ではラジアン値を取得するのですが、表示はtoDegreesメソッドを使用してわかりやすくしておきました。

randomメソッド

乱数を0~1未満で取得できます。

RPGなどでたまにクリティカルを出せるように実装したい場合などに使用できます。

public class Test{
	public static void main(String[] args){
		System.out.println(Math.random());
	}
}
実行結果

0.18737128135247938

実行するたび結果が変わるはずです。


int型で指定範囲内のランダム値を出したい場合はRandomクラスを使用したほうが簡単なのですが、この稿ではrandomメソッドで算出する方法を紹介しておきます。

public class Test{
	public static void main(String[] args){
		//-50~50の間のランダム数値を算出
		int rand = (int)(Math.random() * 101 - 50);
		System.out.println(rand);
	}
}
実行結果

-48

sqrtメソッド

引数に指定した数の平方根を取得します。

ピタゴラスの定理を利用し、二点間の距離を計算するために使用できます。

二点間の距離の出し方は円の当たり判定の稿で説明します。

public class Test{
	public static void main(String[] args){
		System.out.println(Math.sqrt(9));
	}
}
実行結果

3.0

Java

Posted by nompor