/// <summary> /// Adds two quaternions. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the sum.</returns> public static QuaternionD operator +(QuaternionD left, QuaternionD right) { return(QuaternionD.Add(left, right)); }
/// <summary> /// Multiplies quaternion <paramref name="a"/> by quaternion <paramref name="b"/>. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> containing the result.</returns> public static QuaternionD operator *(QuaternionD left, QuaternionD right) { return(QuaternionD.Multiply(left, right)); }
/// <summary> /// Divides a scalar by a quaternion. /// </summary> /// <param name="q">A <see cref="QuaternionD"/> instance.</param> /// <param name="s">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator /(double s, QuaternionD q) { return(QuaternionD.Multiply(q, 1 / s)); }
/// <summary> /// Subtracts a quaternion from a quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the difference.</returns> public static QuaternionD Subtract(QuaternionD left, QuaternionD right) { return(new QuaternionD(left.W - right.W, left.X - right.X, left.Y - right.Y, left.Z - right.Z)); }
/// <summary> /// Subtracts a quaternion from a quaternion. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the difference.</returns> public static QuaternionD operator -(QuaternionD a, QuaternionD b) { return(QuaternionD.Subtract(a, b)); }
/// <summary> /// Multiplies a quaternion by a scalar. /// </summary> /// <param name="q">A <see cref="QuaternionD"/> instance.</param> /// <param name="s">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator *(QuaternionD q, double s) { return(QuaternionD.Multiply(q, s)); }
/// <summary> /// Multiplies a quaternion by a scalar. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD Multiply(QuaternionD quaternion, double scalar) { QuaternionD result = new QuaternionD(quaternion); result.W *= scalar; result.X *= scalar; result.Y *= scalar; result.Z *= scalar; return result; }
/// <summary> /// Calculates the dot product of two quaternions. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>The dot product value.</returns> public static double DotProduct(QuaternionD a, QuaternionD b) { return(a.W * b.W + a.X * b.X + a.Y * b.Y + a.Z * b.Z); }
/// <summary> /// Multiplies quaternion <paramref name="a"/> by quaternion <paramref name="b"/>. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> containing the result.</returns> public static QuaternionD Multiply(QuaternionD left, QuaternionD right) { QuaternionD result = new QuaternionD(); result.W = left.W * right.W - left.X * right.X - left.Y * right.Y - left.Z * right.Z; result.X = left.W * right.X + left.X * right.W + left.Y * right.Z - left.Z * right.Y; result.Y = left.W * right.Y + left.Y * right.W + left.Z * right.X - left.X * right.Z; result.Z = left.W * right.Z + left.Z * right.W + left.X * right.Y - left.Y * right.X; return result; }
/// <summary> /// Multiplies quaternion <paramref name="a"/> by quaternion <paramref name="b"/> and put the result in a third quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <param name="result">A <see cref="QuaternionD"/> instance to hold the result.</param> public static void Multiply(QuaternionD left, QuaternionD right, ref QuaternionD result) { result.W = left.W * right.W - left.X * right.X - left.Y * right.Y - left.Z * right.Z; result.X = left.W * right.X + left.X * right.W + left.Y * right.Z - left.Z * right.Y; result.Y = left.W * right.Y + left.Y * right.W + left.Z * right.X - left.X * right.Z; result.Z = left.W * right.Z + left.Z * right.W + left.X * right.Y - left.Y * right.X; }
/// <summary> /// Subtracts a quaternion from a quaternion and puts the result into a third quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <param name="result">A <see cref="QuaternionD"/> instance to hold the result.</param> public static void Subtract(QuaternionD left, QuaternionD right, ref QuaternionD result) { result.W = left.W - right.W; result.X = left.X - right.X; result.Y = left.Y - right.Y; result.Z = left.Z - right.Z; }
/// <summary> /// Subtracts a quaternion from a quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the difference.</returns> public static QuaternionD Subtract(QuaternionD left, QuaternionD right) { return new QuaternionD(left.W - right.W, left.X - right.X, left.Y - right.Y, left.Z - right.Z); }
/// <summary> /// Adds two quaternions and put the result in the third quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <param name="result">A <see cref="QuaternionD"/> instance to hold the result.</param> public static void Add(QuaternionD left, QuaternionD right, ref QuaternionD result) { result.W = left.W + right.W; result.X = left.X + right.X; result.Y = left.Y + right.Y; result.Z = left.Z + right.Z; }
/// <summary> /// Divides a quaternion by a scalar. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator /(QuaternionD quaternion, double scalar) { return(QuaternionD.Divide(quaternion, scalar)); }
/// <summary> /// Multiplies a quaternion by a scalar and put the result in a third quaternion. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <param name="result">A <see cref="QuaternionD"/> instance to hold the result.</param> public static void Multiply(QuaternionD quaternion, double scalar, ref QuaternionD result) { result.W = quaternion.W * scalar; result.X = quaternion.X * scalar; result.Y = quaternion.Y * scalar; result.Z = quaternion.Z * scalar; }
/// <summary> /// Adds two quaternions. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the sum.</returns> public static QuaternionD Add(QuaternionD left, QuaternionD right) { return new QuaternionD(left.W + right.W, left.X + right.X, left.Y + right.Y, left.Z + right.Z); }
/// <summary> /// Divides a quaternion by a scalar. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD Divide(QuaternionD quaternion, double scalar) { if (scalar == 0) { throw new DivideByZeroException("Dividing quaternion by zero"); } QuaternionD result = new QuaternionD(quaternion); result.W /= scalar; result.X /= scalar; result.Y /= scalar; result.Z /= scalar; return result; }
/// <summary> /// Adds two quaternions. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the sum.</returns> public static QuaternionD operator +(QuaternionD a, QuaternionD b) { return(QuaternionD.Add(a, b)); }
/// <summary> /// Divides a quaternion by a scalar and put the result in a third quaternion. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <param name="result">A <see cref="QuaternionD"/> instance to hold the result.</param> public static void Divide(QuaternionD quaternion, double scalar, ref QuaternionD result) { if (scalar == 0) { throw new DivideByZeroException("Dividing quaternion by zero"); } result.W = quaternion.W / scalar; result.X = quaternion.X / scalar; result.Y = quaternion.Y / scalar; result.Z = quaternion.Z / scalar; }
/// <summary> /// Multiplies quaternion <paramref name="a"/> by quaternion <paramref name="b"/>. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> containing the result.</returns> public static QuaternionD operator *(QuaternionD a, QuaternionD b) { return(QuaternionD.Multiply(a, b)); }
/// <summary> /// Calculates the dot product of two quaternions. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>The dot product value.</returns> public static double DotProduct(QuaternionD left, QuaternionD right) { return left.W * right.W + left.X * right.X + left.Y * right.Y + left.Z * right.Z; }
/// <summary> /// Divides a quaternion by a scalar. /// </summary> /// <param name="q">A <see cref="QuaternionD"/> instance.</param> /// <param name="s">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator /(QuaternionD q, double s) { return(QuaternionD.Divide(q, s)); }
/// <summary> /// Calculates the logarithm of a given quaternion. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <returns>The quaternion's logarithm.</returns> public static QuaternionD Log(QuaternionD quaternion) { QuaternionD result = new QuaternionD(0, 0, 0, 0); if (MathFunctions.Abs(quaternion.W) < 1.0) { double angle = System.Math.Acos(quaternion.W); double sin = System.Math.Sin(angle); if (MathFunctions.Abs(sin) >= 0) { double coeff = angle / sin; result.X = coeff * quaternion.X; result.Y = coeff * quaternion.Y; result.Z = coeff * quaternion.Z; } else { result.X = quaternion.X; result.Y = quaternion.Y; result.Z = quaternion.Z; } } return result; }
/// <summary> /// Adds two quaternions. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the sum.</returns> public static QuaternionD Add(QuaternionD left, QuaternionD right) { return(new QuaternionD(left.W + right.W, left.X + right.X, left.Y + right.Y, left.Z + right.Z)); }
/// <summary> /// Calculates the exponent of a quaternion. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <returns>The quaternion's exponent.</returns> public QuaternionD Exp(QuaternionD quaternion) { QuaternionD result = new QuaternionD(0, 0, 0, 0); double angle = System.Math.Sqrt(quaternion.X * quaternion.X + quaternion.Y * quaternion.Y + quaternion.Z * quaternion.Z); double sin = System.Math.Sin(angle); if (MathFunctions.Abs(sin) > 0) { double coeff = angle / sin; result.X = coeff * quaternion.X; result.Y = coeff * quaternion.Y; result.Z = coeff * quaternion.Z; } else { result.X = quaternion.X; result.Y = quaternion.Y; result.Z = quaternion.Z; } return result; }
/// <summary> /// Calculates the dot product of two quaternions. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>The dot product value.</returns> public static double DotProduct(QuaternionD left, QuaternionD right) { return(left.W * right.W + left.X * right.X + left.Y * right.Y + left.Z * right.Z); }
/// <summary> /// Initializes a new instance of the <see cref="QuaternionD"/> class using coordinates from a given <see cref="QuaternionD"/> instance. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance to copy the coordinates from.</param> public QuaternionD(QuaternionD quaternion) { _w = quaternion.W; _x = quaternion.X; _y = quaternion.Y; _z = quaternion.Z; }
/// <summary> /// Subtracts a quaternion from a quaternion. /// </summary> /// <param name="left">A <see cref="QuaternionD"/> instance.</param> /// <param name="right">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the difference.</returns> public static QuaternionD operator -(QuaternionD left, QuaternionD right) { return(QuaternionD.Subtract(left, right)); }
/// <summary> /// Adds two quaternions. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the sum.</returns> public static QuaternionD Add(QuaternionD a, QuaternionD b) { return(new QuaternionD(a.W + b.W, a.X + b.X, a.Y + b.Y, a.Z + b.Z)); }
/// <summary> /// Multiplies a quaternion by a scalar. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator *(QuaternionD quaternion, double scalar) { return(QuaternionD.Multiply(quaternion, scalar)); }
/// <summary> /// Subtracts a quaternion from a quaternion. /// </summary> /// <param name="a">A <see cref="QuaternionD"/> instance.</param> /// <param name="b">A <see cref="QuaternionD"/> instance.</param> /// <returns>A new <see cref="QuaternionD"/> instance containing the difference.</returns> public static QuaternionD Subtract(QuaternionD a, QuaternionD b) { return(new QuaternionD(a.W - b.W, a.X - b.X, a.Y - b.Y, a.Z - b.Z)); }
/// <summary> /// Divides a scalar by a quaternion. /// </summary> /// <param name="quaternion">A <see cref="QuaternionD"/> instance.</param> /// <param name="scalar">A scalar.</param> /// <returns>A <see cref="QuaternionD"/> instance to hold the result.</returns> public static QuaternionD operator /(double scalar, QuaternionD quaternion) { return(QuaternionD.Multiply(quaternion, (1.0 / scalar))); }
/// <summary> /// Converts the specified string to its <see cref="QuaternionD"/> equivalent. /// A return value indicates whether the conversion succeeded or failed. /// </summary> /// <param name="value">A string representation of a <see cref="QuaternionD"/>.</param> /// <param name="result"> /// When this method returns, if the conversion succeeded, /// contains a <see cref="QuaternionD"/> representing the vector specified by <paramref name="value"/>. /// </param> /// <returns><see langword="true"/> if value was converted successfully; otherwise, <see langword="false"/>.</returns> public static bool TryParse(string value, out QuaternionD result) { Regex r = new Regex(@"\((?<w>.*),(?<x>.*),(?<y>.*),(?<z>.*)\)", RegexOptions.None); Match m = r.Match(value); if (m.Success) { result = new QuaternionD( double.Parse(m.Result("${x}")), double.Parse(m.Result("${y}")), double.Parse(m.Result("${z}")), double.Parse(m.Result("${w}")) ); return true; } result = QuaternionD.Zero; return false; }