/// <summary> /// 他のvectorで初期化するためのコンストラクタ。 /// </summary> /// <param name="v"></param> public Vector3D(Vector3D v) { X = v.X; Y = v.Y; Z = v.Z; }
/// <summary> /// 他のベクトルを減算する。 /// </summary> /// <param name="v"></param> public void Sub(Vector3D v) { X -= v.X; Y -= v.Y; Z -= v.Z; }
/// <summary> /// 外積を求める(3次元の外積の結果はベクトル)。 /// </summary> /// <param name="v"></param> public void OuterProduct(Vector3D v) { double x_,y_,z_; x_ = Y * v.Z - Z * v.Y; y_ = Z * v.X - X * v.Z; z_ = X * v.Y - Y * v.X; SetVector(x_,y_,z_); }
/// <summary> /// 内積を求める。 /// </summary> /// <param name="v"></param> /// <returns></returns> public double InnerProduct(Vector3D v) { return X * v.X + Y * v.Y + Z * v.Z; }
/// <summary> /// 近似による距離(絶対値)の算出。sqrtを使っていない分だけ速い。 /// </summary> /// <param name="v"></param> /// <returns></returns> public double Distance(Vector3D v) { double ax = global::System.Math.Abs(X - v.X); double ay = global::System.Math.Abs(Y - v.Y); double az = global::System.Math.Abs(Z - v.Z); // 一番長い距離 + 二つ目の/2 + 3つ目の/2ぐらいでいいんじゃ? if ( ax > ay ) { if ( ax > az ) return ax + ay / 2 + az / 2; } else { if ( ay > az ) return ay + ax / 2 + az / 2; } return az + ax / 2 + ay / 2; }
/// <summary> /// 他のベクトルを加算する。 /// </summary> /// <param name="v"></param> public void Add(Vector3D v) { X += v.X; Y += v.Y; Z += v.Z; }