Skip to content

Commit

Permalink
Added multiply/multiplied/divide/divided methods to Vector3D
Browse files Browse the repository at this point in the history
  • Loading branch information
benkuper committed Oct 28, 2024
1 parent ed80adb commit 3e0bb82
Showing 1 changed file with 59 additions and 53 deletions.
112 changes: 59 additions & 53 deletions modules/juce_opengl/geometry/juce_Vector3D.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,58 +35,64 @@
namespace juce
{

//==============================================================================
/**
A three-coordinate vector.
@tags{OpenGL}
*/
template <typename Type>
class Vector3D
{
public:
Vector3D() noexcept : x(), y(), z() {}
Vector3D (Type xValue, Type yValue, Type zValue) noexcept : x (xValue), y (yValue), z (zValue) {}
Vector3D (const Vector3D& other) noexcept : x (other.x), y (other.y), z (other.z) {}
Vector3D& operator= (Vector3D other) noexcept { x = other.x; y = other.y; z = other.z; return *this; }

/** Returns a vector that lies along the X axis. */
static Vector3D xAxis() noexcept { return { (Type) 1, 0, 0 }; }
/** Returns a vector that lies along the Y axis. */
static Vector3D yAxis() noexcept { return { 0, (Type) 1, 0 }; }
/** Returns a vector that lies along the Z axis. */
static Vector3D zAxis() noexcept { return { 0, 0, (Type) 1 }; }

Vector3D& operator+= (Vector3D other) noexcept { x += other.x; y += other.y; z += other.z; return *this; }
Vector3D& operator-= (Vector3D other) noexcept { x -= other.x; y -= other.y; z -= other.z; return *this; }
Vector3D& operator*= (Type scaleFactor) noexcept { x *= scaleFactor; y *= scaleFactor; z *= scaleFactor; return *this; }
Vector3D& operator/= (Type scaleFactor) noexcept { x /= scaleFactor; y /= scaleFactor; z /= scaleFactor; return *this; }

Vector3D operator+ (Vector3D other) const noexcept { return { x + other.x, y + other.y, z + other.z }; }
Vector3D operator- (Vector3D other) const noexcept { return { x - other.x, y - other.y, z - other.z }; }
Vector3D operator* (Type scaleFactor) const noexcept { return { x * scaleFactor, y * scaleFactor, z * scaleFactor }; }
Vector3D operator/ (Type scaleFactor) const noexcept { return { x / scaleFactor, y / scaleFactor, z / scaleFactor }; }
Vector3D operator-() const noexcept { return { -x, -y, -z }; }

/** Returns the dot-product of these two vectors. */
Type operator* (Vector3D other) const noexcept { return x * other.x + y * other.y + z * other.z; }

/** Returns the cross-product of these two vectors. */
Vector3D operator^ (Vector3D other) const noexcept { return { y * other.z - z * other.y, z * other.x - x * other.z, x * other.y - y * other.x }; }

Type length() const noexcept { return std::sqrt (lengthSquared()); }
Type lengthSquared() const noexcept { return x * x + y * y + z * z; }

Vector3D normalised() const noexcept { return *this / length(); }

/** Returns true if the vector is practically equal to the origin. */
bool lengthIsBelowEpsilon() const noexcept
{
auto epsilon = std::numeric_limits<Type>::epsilon();
return ! (x < -epsilon || x > epsilon || y < -epsilon || y > epsilon || z < -epsilon || z > epsilon);
}

Type x, y, z;
};
//==============================================================================
/**
A three-coordinate vector.
@tags{OpenGL}
*/
template <typename Type>
class Vector3D
{
public:
Vector3D() noexcept : x(), y(), z() {}
Vector3D(Type xValue, Type yValue, Type zValue) noexcept : x(xValue), y(yValue), z(zValue) {}
Vector3D(const Vector3D& other) noexcept : x(other.x), y(other.y), z(other.z) {}
Vector3D& operator= (Vector3D other) noexcept { x = other.x; y = other.y; z = other.z; return *this; }

/** Returns a vector that lies along the X axis. */
static Vector3D xAxis() noexcept { return { (Type)1, 0, 0 }; }
/** Returns a vector that lies along the Y axis. */
static Vector3D yAxis() noexcept { return { 0, (Type)1, 0 }; }
/** Returns a vector that lies along the Z axis. */
static Vector3D zAxis() noexcept { return { 0, 0, (Type)1 }; }

Vector3D& operator+= (Vector3D other) noexcept { x += other.x; y += other.y; z += other.z; return *this; }
Vector3D& operator-= (Vector3D other) noexcept { x -= other.x; y -= other.y; z -= other.z; return *this; }
Vector3D& operator*= (Type scaleFactor) noexcept { x *= scaleFactor; y *= scaleFactor; z *= scaleFactor; return *this; }
Vector3D& operator/= (Type scaleFactor) noexcept { x /= scaleFactor; y /= scaleFactor; z /= scaleFactor; return *this; }

Vector3D operator+ (Vector3D other) const noexcept { return { x + other.x, y + other.y, z + other.z }; }
Vector3D operator- (Vector3D other) const noexcept { return { x - other.x, y - other.y, z - other.z }; }
Vector3D operator* (Type scaleFactor) const noexcept { return { x * scaleFactor, y * scaleFactor, z * scaleFactor }; }
Vector3D operator/ (Type scaleFactor) const noexcept { return { x / scaleFactor, y / scaleFactor, z / scaleFactor }; }
Vector3D operator-() const noexcept { return { -x, -y, -z }; }

/*Multiply and divide in method to avoid using * and / operators (* is used for dot product) */
void multiply(Vector3D other) const noexcept { x *= other.x; y *= other.y, z *= other.z; }
Vector3D multiplied(Vector3D other) const noexcept { return { x * other.x, y * other.y, z * other.z }; }
void divide(Vector3D other) const noexcept { x /= other.x; y /= other.y; z /= other.z };
Vector3D divided(Vector3D other) const noexcept { return { x / other.x, y / other.y, z / other.z }; }

/** Returns the dot-product of these two vectors. */
Type operator* (Vector3D other) const noexcept { return x * other.x + y * other.y + z * other.z; }

/** Returns the cross-product of these two vectors. */
Vector3D operator^ (Vector3D other) const noexcept { return { y * other.z - z * other.y, z * other.x - x * other.z, x * other.y - y * other.x }; }

Type length() const noexcept { return std::sqrt(lengthSquared()); }
Type lengthSquared() const noexcept { return x * x + y * y + z * z; }

Vector3D normalised() const noexcept { return *this / length(); }

/** Returns true if the vector is practically equal to the origin. */
bool lengthIsBelowEpsilon() const noexcept
{
auto epsilon = std::numeric_limits<Type>::epsilon();
return !(x < -epsilon || x > epsilon || y < -epsilon || y > epsilon || z < -epsilon || z > epsilon);
}

Type x, y, z;
};

} // namespace juce

0 comments on commit 3e0bb82

Please sign in to comment.