|
|
@@ -65,9 +65,7 @@ namespace Avalonia
|
|
|
/// <param name="b">Second vector</param>
|
|
|
/// <returns>The dot product</returns>
|
|
|
public static double operator *(Vector a, Vector b)
|
|
|
- {
|
|
|
- return a.X * b.X + a.Y * b.Y;
|
|
|
- }
|
|
|
+ => Dot(a, b);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Scales a vector.
|
|
|
@@ -76,9 +74,7 @@ namespace Avalonia
|
|
|
/// <param name="scale">The scaling factor.</param>
|
|
|
/// <returns>The scaled vector.</returns>
|
|
|
public static Vector operator *(Vector vector, double scale)
|
|
|
- {
|
|
|
- return new Vector(vector._x * scale, vector._y * scale);
|
|
|
- }
|
|
|
+ => Multiply(vector, scale);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Scales a vector.
|
|
|
@@ -87,14 +83,17 @@ namespace Avalonia
|
|
|
/// <param name="scale">The divisor.</param>
|
|
|
/// <returns>The scaled vector.</returns>
|
|
|
public static Vector operator /(Vector vector, double scale)
|
|
|
- {
|
|
|
- return new Vector(vector._x / scale, vector._y / scale);
|
|
|
- }
|
|
|
+ => Divide(vector, scale);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Length of the vector
|
|
|
/// </summary>
|
|
|
- public double Length => Math.Sqrt(X * X + Y * Y);
|
|
|
+ public double Length => Math.Sqrt(SquaredLength);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Squared Length of the vector
|
|
|
+ /// </summary>
|
|
|
+ public double SquaredLength => _x * _x + _y * _y;
|
|
|
|
|
|
/// <summary>
|
|
|
/// Negates a vector.
|
|
|
@@ -102,9 +101,7 @@ namespace Avalonia
|
|
|
/// <param name="a">The vector.</param>
|
|
|
/// <returns>The negated vector.</returns>
|
|
|
public static Vector operator -(Vector a)
|
|
|
- {
|
|
|
- return new Vector(-a._x, -a._y);
|
|
|
- }
|
|
|
+ => Negate(a);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Adds two vectors.
|
|
|
@@ -113,9 +110,7 @@ namespace Avalonia
|
|
|
/// <param name="b">The second vector.</param>
|
|
|
/// <returns>A vector that is the result of the addition.</returns>
|
|
|
public static Vector operator +(Vector a, Vector b)
|
|
|
- {
|
|
|
- return new Vector(a._x + b._x, a._y + b._y);
|
|
|
- }
|
|
|
+ => Add(a, b);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Subtracts two vectors.
|
|
|
@@ -124,9 +119,7 @@ namespace Avalonia
|
|
|
/// <param name="b">The second vector.</param>
|
|
|
/// <returns>A vector that is the result of the subtraction.</returns>
|
|
|
public static Vector operator -(Vector a, Vector b)
|
|
|
- {
|
|
|
- return new Vector(a._x - b._x, a._y - b._y);
|
|
|
- }
|
|
|
+ => Subtract(a, b);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Check if two vectors are equal (bitwise).
|
|
|
@@ -155,7 +148,8 @@ namespace Avalonia
|
|
|
|
|
|
public override bool Equals(object obj)
|
|
|
{
|
|
|
- if (ReferenceEquals(null, obj)) return false;
|
|
|
+ if (ReferenceEquals(null, obj))
|
|
|
+ return false;
|
|
|
|
|
|
return obj is Vector vector && Equals(vector);
|
|
|
}
|
|
|
@@ -206,5 +200,131 @@ namespace Avalonia
|
|
|
{
|
|
|
return new Vector(_x, y);
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returns a normalized version of this vector.
|
|
|
+ /// </summary>
|
|
|
+ /// <returns>The normalized vector.</returns>
|
|
|
+ public Vector Normalize()
|
|
|
+ => Normalize(this);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returns a negated version of this vector.
|
|
|
+ /// </summary>
|
|
|
+ /// <returns>The negated vector.</returns>
|
|
|
+ public Vector Negate()
|
|
|
+ => Negate(this);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returns the dot product of two vectors.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The dot product.</returns>
|
|
|
+ public static double Dot(Vector a, Vector b)
|
|
|
+ => a._x * b._x + a._y * b._y;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returns the cross product of two vectors.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The cross product.</returns>
|
|
|
+ public static double Cross(Vector a, Vector b)
|
|
|
+ => a._x * b._y - a._y * b._x;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Normalizes the given vector.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="vector">The vector</param>
|
|
|
+ /// <returns>The normalized vector.</returns>
|
|
|
+ public static Vector Normalize(Vector vector)
|
|
|
+ => Divide(vector, vector.Length);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Divides the first vector by the second.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The scaled vector.</returns>
|
|
|
+ public static Vector Divide(Vector a, Vector b)
|
|
|
+ => new Vector(a._x / b._x, a._y / b._y);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Divides the vector by the given scalar.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="vector">The vector</param>
|
|
|
+ /// <param name="scalar">The scalar value</param>
|
|
|
+ /// <returns>The scaled vector.</returns>
|
|
|
+ public static Vector Divide(Vector vector, double scalar)
|
|
|
+ => new Vector(vector._x / scalar, vector._y / scalar);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Multiplies the first vector by the second.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The scaled vector.</returns>
|
|
|
+ public static Vector Multiply(Vector a, Vector b)
|
|
|
+ => new Vector(a._x * b._x, a._y * b._y);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Multiplies the vector by the given scalar.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="vector">The vector</param>
|
|
|
+ /// <param name="scalar">The scalar value</param>
|
|
|
+ /// <returns>The scaled vector.</returns>
|
|
|
+ public static Vector Multiply(Vector vector, double scalar)
|
|
|
+ => new Vector(vector._x * scalar, vector._y * scalar);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Adds the second to the first vector
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The summed vector.</returns>
|
|
|
+ public static Vector Add(Vector a, Vector b)
|
|
|
+ => new Vector(a._x + b._x, a._y + b._y);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Subtracts the second from the first vector
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a">The first vector.</param>
|
|
|
+ /// <param name="b">The second vector.</param>
|
|
|
+ /// <returns>The difference vector.</returns>
|
|
|
+ public static Vector Subtract(Vector a, Vector b)
|
|
|
+ => new Vector(a._x - b._x, a._y - b._y);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Negates the vector
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="vector">The vector to negate.</param>
|
|
|
+ /// <returns>The scaled vector.</returns>
|
|
|
+ public static Vector Negate(Vector vector)
|
|
|
+ => new Vector(-vector._x, -vector._y);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returnes the vector (0.0, 0.0)
|
|
|
+ /// </summary>
|
|
|
+ public static Vector Zero
|
|
|
+ => new Vector(0, 0);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returnes the vector (1.0, 1.0)
|
|
|
+ /// </summary>
|
|
|
+ public static Vector One
|
|
|
+ => new Vector(1, 1);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returnes the vector (1.0, 0.0)
|
|
|
+ /// </summary>
|
|
|
+ public static Vector UnitX
|
|
|
+ => new Vector(1, 0);
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Returnes the vector (0.0, 1.0)
|
|
|
+ /// </summary>
|
|
|
+ public static Vector UnitY
|
|
|
+ => new Vector(0, 1);
|
|
|
}
|
|
|
}
|