コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【Unity】B-スプライン曲線のプログラム

using UnityEngine;

/// <summary>
/// Mathf クラスに関する汎用関数を管理するクラス
/// </summary>
public static class MathfUtils
{
    /// <summary>
    /// B-スプライン曲線における X 座標を返します
    /// </summary>
    /// <remarks>http://opentype.jp/fontguide_doc2.htm</remarks>
    /// <param name="x1">開始点の X 座標</param>
    /// <param name="x2">制御点の X 座標</param>
    /// <param name="x3">終点の X 座標</param>
    /// <param name="t">重み(0 から 1)</param>
    /// <returns>B-スプライン曲線における X 座標</returns>
    public static float B_SplineCurveX(float x1, float x2, float x3, float t)
    {
        return (1 - t) * (1 - t) * x1 + 2 * t * (1 - t) * x2 + t * t * x3;
    }

    /// <summary>
    /// B-スプライン曲線における Y 座標を返します
    /// </summary>
    /// <remarks>http://opentype.jp/fontguide_doc2.htm</remarks>
    /// <param name="y1">開始点の Y 座標</param>
    /// <param name="y2">制御点の Y 座標</param>
    /// <param name="y3">終点の Y 座標</param>
    /// <param name="t">重み(0 から 1)</param>
    /// <returns>B-スプライン曲線における Y 座標</returns>
    public static float B_SplineCurveY(float y1, float y2, float y3, float t)
    {
        return (1 - t) * (1 - t) * y1 + 2 * t * (1 - t) * y2 + t * t * y3;
    }
    
    /// <summary>
    /// B-スプライン曲線における 2 次元座標を返します
    /// </summary>
    /// <param name="p1">開始点の座標</param>
    /// <param name="p2">制御点の座標</param>
    /// <param name="p3">終点の座標</param>
    /// <param name="t">重み(0 から 1)</param>
    /// <returns>B-スプライン曲線における 2 次元座標</returns>
    public static Vector2 B_SplineCurveY(Vector2 p1, Vector2 p2, Vector2 p3, float t)
    {
        return new Vector2(
            B_SplineCurveX(p1.x, p2.x, p3.x, t), 
            B_SplineCurveY(p1.y, p2.y, p3.y, t));
    }
}