/// <summary> /// 2点間の距離を取得する。 /// </summary> /// <param name="v1">値1</param> /// <param name="v2">値2</param> /// <returns>距離</returns> static float Distance(ref Vector4DF v1, ref Vector4DF v2) { float dx = v1.X - v2.X; float dy = v1.Y - v2.Y; float dz = v1.Z - v2.Z; float dw = v1.W - v2.W; return((float)Math.Sqrt(dx * dx + dy * dy + dz * dz + dw * dw)); }
/// <summary> /// 行列でベクトルを変形させる。 /// </summary> /// <param name="in_">変形前ベクトル</param> /// <returns>変形後ベクトル</returns> Vector4DF Transform4D(ref Vector4DF in_) { float *values = stackalloc float[4]; fixed(float *v = Values) { for (int i = 0; i < 4; i++) { values[i] = 0; values[i] += in_.X * v[i * 4 + 0]; values[i] += in_.Y * v[i * 4 + 1]; values[i] += in_.Z * v[i * 4 + 2]; values[i] += in_.W * v[i * 4 + 3]; } } Vector4DF o; o.X = values[0]; o.Y = values[1]; o.Z = values[2]; o.W = values[3]; return(o); }
/// <summary> /// 内積を取得する。 /// </summary> /// <param name="v1">値1</param> /// <param name="v2">値2</param> /// <returns>内積</returns> static float Dot(ref Vector4DF v1, ref Vector4DF v2) { return(v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z + v1.W * v2.W); }