うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【C#】ベジェ曲線の長さを計算する

以前ベジェ曲線を計算するクラスを作成しました

ここで全体の距離がほしかったので処理を追加しました

以前の処理をクラスに追加すれば取得できます

計算自体もこれで正しいのかわかりませんが、曲線を分割して
分割した距離を合計しています

LOOP_VALUE の値が小さいほど正確な値が取得できますが
計算量が増えてしまうため注意が必要です

   /// <summary>
    /// 距離を取得
    /// </summary>
    public float Length => GetLength(_positions);
 
    public static float GetLength(Vector3[] pos)
    {
        const float LOOP_VALUE = 0.05f;
 
        var total = 0f;
        var prev = Eval(pos, 0f);
        var c = Vector3.zero;
        var diff = Vector3.zero;
        for (var t = LOOP_VALUE; t < 1f; t += LOOP_VALUE)
        {
            c = Eval(pos, t);
            diff = prev - c;
            total += (float)Math.Sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z);
            prev = c;
        }
        c = Eval(pos, 1f);
        diff = prev - c;
        total += (float)Math.Sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z);
 
        return total;
    }