libGDXにはシンプルでわかりやすい単体クラスも多いです。今回はMathUtilsを紹介します。
#MathUtilsとは
mathUtilsは数値計算系の便利なメソッドを持つクラスです。staticクラスなので気軽に使えます。沢山ありますが、一部を紹介していきます。
#浮動小数点のイコール判定
浮動小数点はイコールで判定してはいけません。しかし、判定はしたいことはあります。
import com.badlogic.gdx.math.MathUtils;
public class MathUtilTest1 {
public static void main(String[] args) {
//どちらも同じ0.1のつもり
float a = 0.1f;
float b = 1 - 0.9f;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("==:" + (a == b));
System.out.println("EQ:" + MathUtils.isEqual(a, b));
}
}
実行結果
a=0.1
b=0.100000024
==:false
EQ:true
#2のべき乗
特定の数値が収まる2のべき乗を返すメソッドです。主にロードするテクスチャサイズの計算で利用します。
import com.badlogic.gdx.math.MathUtils;
public class MathUtilTest2 {
public static void main(String[] args) {
System.out.println("10 => " + MathUtils.nextPowerOfTwo(10));
System.out.println("100 => " + MathUtils.nextPowerOfTwo(100));
System.out.println("1000 => " + MathUtils.nextPowerOfTwo(1000));
System.out.println("128 => " + MathUtils.nextPowerOfTwo(128));
}
}
実行結果
10 => 16
100 => 128
1000 => 1024
128 => 128
#乱数
random系の命令はたくさんあります。
今回は特定の範囲の乱数を取得する命令を紹介します。
int hoge = MathUtils.random(1, 100);
これは1~100のランダムな数値を取得します。確率計算系でよく使いますね。
乱数はアプリによってアルゴリズムなどを変えたい場合もありますが、MathUtilsクラス内でstaticでRandomクラスを保持しているので、これを変えることによって自由な乱数を利用できます。
実際、libGDXでのデフォルトはRandomクラスをそのまま利用していません。拡張していて高速化したアルゴリズムとなっています。
時間を計測してみます。
public static void main(String[] args) {
long start = System.nanoTime();
for (int i = 0; i < 100_000_000; i++) {
MathUtils.random(1, 100);
}
long end = System.nanoTime();
System.out.println((end - start) / 1000 / 1000 + "ms");
}
デフォルト実装で約260ms。
public static void main(String[] args) {
MathUtils.random = new Random();//差し替え
long start = System.nanoTime();
for (int i = 0; i < 100_000_000; i++) {
MathUtils.random(1, 100);
}
long end = System.nanoTime();
System.out.println((end - start) / 1000 / 1000 + "ms");
}
JavaSEのデフォルト実装に差し替えたものは約1120ms。
4倍以上速いですね。