2

プロジェクトに Vector2 構造体が必要でしたが、数学があまり得意ではありません。このクラスは機能しているようですが、コードを最適化する方法やエラーが発生した場合のポインタをいただければ幸いです。また、Math.Sqrt よりも距離計算を行う安価な方法はありますか?

    private struct Vector2
    {
        public float X;
        public float Y;

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

        public static Vector2 operator +(Vector2 v1, Vector2 v2)
        {
            return new Vector2(v1.X + v2.X, v1.Y + v2.Y);
        }

        public static Vector2 operator -(Vector2 v1, Vector2 v2)
        {
            return new Vector2(v1.X - v2.X, v1.Y - v2.Y);
        }

        public static Vector2 operator *(Vector2 v1, float m)
        {
            return new Vector2(v1.X * m, v1.Y * m);
        }

        public static float operator *(Vector2 v1, Vector2 v2)
        {
            return v1.X * v2.X + v1.Y * v2.Y;
        }

        public static Vector2 operator /(Vector2 v1, float m)
        {
            return new Vector2(v1.X / m, v1.Y / m);
        }

        public static float Distance(Vector2 v1, Vector2 v2)
        {
            return (float)Math.Sqrt(Math.Pow(v1.X - v2.X, 2) + Math.Pow(v1.Y - v2.Y, 2));
        }

        public float Length()
        {
            return (float)Math.Sqrt(X * X + Y * Y);
        }
    }
4

1 に答える 1

9

わずか 3 コメント:

1) C# では、通常、フィールドではなくプロパティを公開します。あれは、

    public float X {get; private set;}
    public float Y {get; private set;}

2) double 型は float よりも精度が高いため、float の代わりに double を使用することをお勧めします。

3) 演算子の 1 つを次のようにオーバーロードしました。

    public static float operator *(Vector2 v1, Vector2 v2)
    {
        return v1.X * v2.X + v1.Y * v2.Y;
    }

これを 2 つの 2D 実数ベクトルのドット (内積) とします。プログラミングでは、演算子をオーバーロードするとき、オーバーロードは演算子が行うことを行う必要があります。つまり、演算子 *(Vector2 v1, Vector2 v2) をオーバーロードする場合、オーバーロードはこれら 2 つのベクトルを乗算する必要があります。ただし、2 つのベクトルの「乗算」の明確な定義はありません。線形代数で「乗算」という用語を使用することは、非常にあいまいです。テンソル積、外積、内積、クロス積、スカラー積などを参照できます。したがって、コードの混乱を少なくするために、内積演算子を次のように実装することをお勧めします。

public static float InnerProduct(Vector2 v1, Vector v2)

代わりは。

平方根関数のより良い実装については、Math.Sqrt がおそらく (.NET フレームワークで) 最も高速な実装の 1 つです。クラスの速度を改善することを考えている場合は、ネイティブ C/C++ で記述してからマネージド ラッパーを記述すると、おそらく最も改善されます。

于 2013-06-22T11:08:53.560 に答える