/// <summary> /// Obtains the angle between two vectors. /// </summary> /// <param name="u">Vector2d.</param> /// <param name="v">Vector2d.</param> /// <returns>Angle in radians.</returns> public static double AngleBetween(Vector2d u, Vector2d v) { double cos = DotProduct(u, v) / (u.Modulus() * v.Modulus()); if (MathHelper.IsOne(cos)) { return(0); } if (MathHelper.IsOne(-cos)) { return(Math.PI); } return(Math.Acos(cos)); //if (AreParallel(u, v)) //{ // if (Math.Sign(u.X) == Math.Sign(v.X) && Math.Sign(u.Y) == Math.Sign(v.Y)) // { // return 0; // } // return (double)Math.PI; //} //Vector3d normal = Vector3d.CrossProduct(new Vector3d(u.X, u.Y, 0), new Vector3d(v.X, v.Y, 0)); //if (normal.Z < 0) //{ // return (double)(2 * Math.PI - Math.Acos(DotProduct(u, v) / (u.Modulus() * v.Modulus()))); //} //return (double)(Math.Acos(DotProduct(u, v) / (u.Modulus() * v.Modulus()))); }
/// <summary> /// Obtains the angle between two vectors. /// </summary> /// <param name="u">Vector2d.</param> /// <param name="v">Vector2d.</param> /// <returns>Angle in radians.</returns> public static double AngleBetween(Vector2d u, Vector2d v) { double cos = DotProduct(u, v)/(u.Modulus()*v.Modulus()); if (MathHelper.IsOne(cos)) { return 0; } if (MathHelper.IsOne(-cos)) { return Math.PI; } return Math.Acos(cos); //if (AreParallel(u, v)) //{ // if (Math.Sign(u.X) == Math.Sign(v.X) && Math.Sign(u.Y) == Math.Sign(v.Y)) // { // return 0; // } // return (double)Math.PI; //} //Vector3d normal = Vector3d.CrossProduct(new Vector3d(u.X, u.Y, 0), new Vector3d(v.X, v.Y, 0)); //if (normal.Z < 0) //{ // return (double)(2 * Math.PI - Math.Acos(DotProduct(u, v) / (u.Modulus() * v.Modulus()))); //} //return (double)(Math.Acos(DotProduct(u, v) / (u.Modulus() * v.Modulus()))); }