幾何学幾何学
平面ベクトル; 2D Vector

概要
平面ベクトルは平面上の向きと大きさを表現する量である。

\( \quad \boldsymbol{v} = (x, y)^T \quad x, y \in \mathbb{R} \)


ソースコード

namespace Geometry.Geometry2D {

    /// <summary>2次元ベクトル</summary>
    public struct Vector2D {

        /// <summary>コンストラクタ</summary>
        public Vector2D(double x, double y) {
            this.X = x;
            this.Y = y;
        }

        /// <summary>X成分</summary>
        public double X { get; set; }

        /// <summary>Y成分</summary>
        public double Y { get; set; }

        /// <summary>ノルム</summary>
        public double Norm => Math.Sqrt(X * X + Y * Y);

        /// <summary>ノルム二乗</summary>
        public double SquareNorm => X * X + Y * Y;

        /// <summary>正規化ベクトル</summary>
        public Vector2D Normal => this / Norm;

        /// <summary>単項プラス</summary>
        public static Vector2D operator +(Vector2D v) {
            return new Vector2D(v.X, v.Y);
        }

        /// <summary>単項マイナス</summary>
        public static Vector2D operator -(Vector2D v) {
            return new Vector2D(-v.X, -v.Y);
        }

        /// <summary>ベクトル和</summary>
        public static Vector2D operator +(Vector2D v1, Vector2D v2) {
            return new Vector2D(v1.X + v2.X, v1.Y + v2.Y);
        }

        /// <summary>ベクトル差</summary>
        public static Vector2D operator -(Vector2D v1, Vector2D v2) {
            return new Vector2D(v1.X - v2.X, v1.Y - v2.Y);
        }

        /// <summary>スカラー倍</summary>
        public static Vector2D operator *(double r, Vector2D v) {
            return new Vector2D(v.X * r, v.Y * r);
        }

        /// <summary>スカラー倍</summary>
        public static Vector2D operator *(Vector2D v, double r) {
            return r * v;
        }

        /// <summary>行列ベクトル積</summary>
        public static Vector2D operator *(Matrix2D m, Vector2D v) {
            Vector2D ret = new Vector2D(v.X * m.E11 + v.Y * m.E12 + m.E13,
                                        v.X * m.E21 + v.Y * m.E22 + m.E23);

            double w = v.X * m.E31 + v.Y * m.E32 + m.E33;

            return (w == 1) ? (ret) : (ret / w);
        }

        /// <summary>スカラー逆数倍</summary>
        public static Vector2D operator /(Vector2D v, double r) {
            return new Vector2D(v.X / r, v.Y / r);
        }

        /// <summary>等しいか判定</summary>
        public static bool operator ==(Vector2D v1, Vector2D v2) {
            return (v1.X == v2.X) && (v1.Y == v2.Y);
        }

        /// <summary>異なるか判定</summary>
        public static bool operator !=(Vector2D v1, Vector2D v2) {
            return (v1.X != v2.X) || (v1.Y != v2.Y);
        }

        /// <summary>等しいか判定</summary>
        public override bool Equals(object obj) {
            return obj is Vector2D ? (Vector2D)obj == this : false;
        }

        /// <summary>ハッシュ値</summary>
        public override int GetHashCode() {
            return X.GetHashCode() ^ Y.GetHashCode();
        }

        /// <summary>ベクトル間距離</summary>
        public static double Distance(Vector2D v1, Vector2D v2) {
            return (v1 - v2).Norm;
        }

        /// <summary>ベクトル間距離二乗</summary>
        public static double SquareDistance(Vector2D v1, Vector2D v2) {
            return (v1 - v2).SquareNorm;
        }

        /// <summary>内積</summary>
        public static double InnerProduct(Vector2D v1, Vector2D v2) {
            return v1.X * v2.X + v1.Y * v2.Y;
        }

        /// <summary>ゼロベクトルか判定</summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static bool IsZero(Vector2D v) {
            return (v.X == 0) && (v.Y == 0);
        }

        /// <summary>有効なベクトルか判定</summary>
        public static bool IsValid(Vector2D v) {
            return !double.IsNaN(v.X) && !double.IsInfinity(v.X) && !double.IsNaN(v.Y) && !double.IsInfinity(v.Y);
        }

        /// <summary>ゼロベクトル</summary>
        public static Vector2D Zero => new Vector2D(0, 0);

        /// <summary>不正なベクトル</summary>
        public static Vector2D Invalid => new Vector2D(double.NaN, double.NaN);

        /// <summary>文字列化</summary>
        public override string ToString() {
            return $"{X},{Y}";
        }
    }
}

関連項目
平面上の同次変換行列
平面上の線分
平面上の直線
平面上の三角形
平面上の円
平面上の交差
平面ベクトル 単体テスト

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類