C#におけるVector2構造体の算術演算子オーバーロード資料

以下の資料では、C#のVector2構造体に算術演算子(加算、減算、乗算、除算)をオーバーロードする方法について解説します。これにより、Vector2同士やスカラーとの演算を直感的に記述できるようになります。


1. はじめに

Vector2は2次元空間内の点またはベクトルを表現するための構造体です。
この資料では、以下の目的で演算子のオーバーロードを実装します。

  • 加算(+): 二つのVector2の各成分を加算する。
  • 減算(-): 二つのVector2の各成分を減算する。
  • 乗算(*): Vector2とスカラー(float)との乗算を行い、各成分を拡大・縮小する。
  • 除算(/): Vector2の各成分をスカラーで割る(ゼロ除算の対策を含む)。

2. サンプルコード

以下は、Vector2構造体に算術演算子をオーバーロードした実装例です。

public struct Vector2
{
    public float X { get; }
    public float Y { get; }

    public Vector2(float x, float y)
    {
        X = x;
        Y = y;
    }

    // 加算演算子のオーバーロード
    public static Vector2 operator +(Vector2 a, Vector2 b)
    {
        return new Vector2(a.X + b.X, a.Y + b.Y);
    }

    // 減算演算子のオーバーロード
    public static Vector2 operator -(Vector2 a, Vector2 b)
    {
        return new Vector2(a.X - b.X, a.Y - b.Y);
    }

    // スカラーとの乗算(左側が Vector2、右側が float)
    public static Vector2 operator *(Vector2 a, float scalar)
    {
        return new Vector2(a.X * scalar, a.Y * scalar);
    }

    // スカラーとの乗算(左側が float、右側が Vector2)
    public static Vector2 operator *(float scalar, Vector2 a)
    {
        return new Vector2(a.X * scalar, a.Y * scalar);
    }

    // スカラーでの除算
    public static Vector2 operator /(Vector2 a, float scalar)
    {
        if (scalar == 0)
        {
            throw new DivideByZeroException("Scalar cannot be zero.");
        }
        return new Vector2(a.X / scalar, a.Y / scalar);
    }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

3. 実装のポイント

3.1 演算子のオーバーロード

  • 加算 (+)
    二つのVector2インスタンスの各成分(XとY)を加算し、新たなVector2を返します。
  • 減算 (-)
    二つのVector2インスタンスの各成分(XとY)を減算し、新たなVector2を返します。
  • 乗算 (*)
    スカラー値(float)との乗算を実装することで、ベクトルの各成分を拡大または縮小します。
    両側(Vector2 * float, float * Vector2)のオーバーロードを提供しています。
  • 除算 (/)
    ベクトルの各成分をスカラー値で割ります。
    ゼロ除算が発生しないように例外処理(DivideByZeroException)を実装しています。

3.2 利用例

以下は、Vector2の演算子オーバーロードを利用した例です。

Vector2 startPos = new Vector2(1.0f, 2.0f);
Vector2 endPos = new Vector2(3.0f, 4.0f);

// 2点間の差を計算(ベクトルの引き算)
Vector2 distance2 = endPos - startPos;
Console.WriteLine(distance2); // 出力例: (2, 2)

// スカラー乗算の例
Vector2 scaledVector = distance2 * 2.0f;
Console.WriteLine(scaledVector); // 出力例: (4, 4)

4. おわりに

この資料で示したVector2構造体の算術演算子オーバーロードは、直感的で読みやすいコードの記述を促進し、2次元ベクトルの計算を簡略化します。
さらに、必要に応じて内積や外積などのメソッドも追加可能です。
この実装例を基に、アプリケーションで利用するVector2クラスの機能拡張を検討してみてください。

C#

Posted by hidepon