/// <summary> /// Угол, отсчитанный от первого вектора ко второму против часовой стрелки /// </summary> /// <param name="v1">первый вектор</param> /// <param name="v2">второй вектор</param> /// <returns>угол в радианах из интервала (-pi, +pi]</returns> public static double AngleBetween(Vector v1, Vector v2) { Vector vn1 = v1.Normalise(); Vector n1 = Vector.LeftNormal(vn1); Vector vn2 = v2.Normalise(); double sc = vn1 * vn2; double ht = n1 * vn2; return (ht >= 0) ? Math.Acos(sc) : -Math.Acos(sc); }
/// <summary> /// Угол, отсчитанный от первого вектора ко второму против часовой стрелки /// </summary> /// <param name="v1">первый вектор</param> /// <param name="v2">второй вектор</param> /// <returns>угол в радианах из интервала (-pi, +pi]</returns> public static double AngleBetween(Vector v1, Vector v2) { Vector vn1 = v1.Normalise(); Vector n1 = Vector.LeftNormal(vn1); Vector vn2 = v2.Normalise(); double sc = vn1 * vn2; double ht = n1 * vn2; return((ht >= 0) ? Math.Acos(sc) : -Math.Acos(sc)); }
/// <summary> /// Угол, отсчитанный от орта оси X к данному вектору против часовой стрелки /// </summary> /// <param name="v"> вектор</param> /// <returns>угол в радианах из интервала (-pi, +pi]</returns> public static double AngleFromXOrto(Vector v) { Vector vn = v.Normalise(); return((vn.Y >= 0) ? Math.Acos(vn.X) : -Math.Acos(vn.X)); }
/// <summary> /// Угол, отсчитанный от орта оси X к данному вектору против часовой стрелки /// </summary> /// <param name="v"> вектор</param> /// <returns>угол в радианах из интервала (-pi, +pi]</returns> public static double AngleFromXOrto(Vector v) { Vector vn = v.Normalise(); return (vn.Y >= 0) ? Math.Acos(vn.X) : -Math.Acos(vn.X); }