diff --git a/src/Avalonia.Visuals/Vector.cs b/src/Avalonia.Visuals/Vector.cs
index 2f1690184d..f185682dc0 100644
--- a/src/Avalonia.Visuals/Vector.cs
+++ b/src/Avalonia.Visuals/Vector.cs
@@ -65,9 +65,7 @@ namespace Avalonia
/// Second vector
/// The dot product
public static double operator *(Vector a, Vector b)
- {
- return a.X * b.X + a.Y * b.Y;
- }
+ => Dot(a, b);
///
/// Scales a vector.
@@ -76,9 +74,7 @@ namespace Avalonia
/// The scaling factor.
/// The scaled vector.
public static Vector operator *(Vector vector, double scale)
- {
- return new Vector(vector._x * scale, vector._y * scale);
- }
+ => Multiply(vector, scale);
///
/// Scales a vector.
@@ -87,9 +83,7 @@ namespace Avalonia
/// The divisor.
/// The scaled vector.
public static Vector operator /(Vector vector, double scale)
- {
- return new Vector(vector._x / scale, vector._y / scale);
- }
+ => Divide(vector, scale);
///
/// Length of the vector
@@ -102,9 +96,7 @@ namespace Avalonia
/// The vector.
/// The negated vector.
public static Vector operator -(Vector a)
- {
- return new Vector(-a._x, -a._y);
- }
+ => Negate(a);
///
/// Adds two vectors.
@@ -113,9 +105,7 @@ namespace Avalonia
/// The second vector.
/// A vector that is the result of the addition.
public static Vector operator +(Vector a, Vector b)
- {
- return new Vector(a._x + b._x, a._y + b._y);
- }
+ => Add(a, b);
///
/// Subtracts two vectors.
@@ -124,9 +114,7 @@ namespace Avalonia
/// The second vector.
/// A vector that is the result of the subtraction.
public static Vector operator -(Vector a, Vector b)
- {
- return new Vector(a._x - b._x, a._y - b._y);
- }
+ => Subtract(a, b);
///
/// Check if two vectors are equal (bitwise).
@@ -155,7 +143,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 +195,93 @@ namespace Avalonia
{
return new Vector(_x, y);
}
+
+ ///
+ /// Returns the dot product of two vectors.
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The dot product.
+ public static double Dot(Vector a, Vector b)
+ => a._x * b._x + a._y * b._y;
+
+ ///
+ /// Returns the cross product of two vectors.
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The cross product.
+ public static double Cross(Vector a, Vector b)
+ => a._x * b._y - a._y * b._x;
+
+ ///
+ /// Normalizes the given vector.
+ ///
+ /// The vector
+ /// The normalized vector.
+ public static Vector Normalize(Vector vector)
+ => Divide(vector, vector.Length);
+
+ ///
+ /// Divides the first vector by the second.
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The scaled vector.
+ public static Vector Divide(Vector a, Vector b)
+ => new Vector(a._x / b._x, a._y / b._y);
+
+ ///
+ /// Divides the vector by the given scalar.
+ ///
+ /// The vector
+ /// The scalar value
+ /// The scaled vector.
+ public static Vector Divide(Vector vector, double scalar)
+ => new Vector(vector._x / scalar, vector._y / scalar);
+
+ ///
+ /// Multiplies the first vector by the second.
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The scaled vector.
+ public static Vector Multiply(Vector a, Vector b)
+ => new Vector(a._x * b._x, a._y * b._y);
+
+ ///
+ /// Multiplies the vector by the given scalar.
+ ///
+ /// The vector
+ /// The scalar value
+ /// The scaled vector.
+ public static Vector Multiply(Vector vector, double scalar)
+ => new Vector(vector._x * scalar, vector._y * scalar);
+
+ ///
+ /// Adds the second to the first vector
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The summed vector.
+ public static Vector Add(Vector a, Vector b)
+ => new Vector(a._x + b._x, a._y + b._y);
+
+ ///
+ /// Subtracts the second from the first vector
+ ///
+ /// The first vector.
+ /// The second vector.
+ /// The difference vector.
+ public static Vector Subtract(Vector a, Vector b)
+ => new Vector(a._x - b._x, a._y - b._y);
+
+ ///
+ /// Negates the vector
+ ///
+ /// The vector to negate.
+ /// The scaled vector.
+ public static Vector Negate(Vector vector)
+ => new Vector(-vector._x, -vector._y);
}
}