LoginSignup
2

More than 5 years have passed since last update.

libGDXの基礎16 MathUtils

Posted at

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倍以上速いですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2