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クラスの機能拡張を検討してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません