added method + tests

This commit is contained in:
2025-01-02 12:52:34 +03:00
parent b2db06a739
commit dc0bca14c5
2 changed files with 29 additions and 0 deletions

View File

@@ -7,9 +7,18 @@
#include <cstdint> #include <cstdint>
#include <functional> #include <functional>
#include "omath/Vector2.hpp" #include "omath/Vector2.hpp"
#include "omath/Angle.hpp"
#include <expected>
namespace omath namespace omath
{ {
enum class Vector3Error
{
IMPOSSIBLE_BETWEEN_ANGLE,
};
class Vector3 : public Vector2 class Vector3 : public Vector2
{ {
public: public:
@@ -208,6 +217,17 @@ namespace omath
return Sum2D() + z; return Sum2D() + z;
} }
[[nodiscard]] std::expected<Angle<float, 0.f, 180.f, AngleFlags::Clamped>, Vector3Error>
AngleBetween(const Vector3& other) const
{
const auto bottom = Length() * other.Length();
if (bottom == 0.f)
return std::unexpected(Vector3Error::IMPOSSIBLE_BETWEEN_ANGLE);
return Angle<float, 0.f, 180.f, AngleFlags::Clamped>::FromRadians(std::acos(Dot(other) / bottom));
}
[[nodiscard]] constexpr float Sum2D() const [[nodiscard]] constexpr float Sum2D() const
{ {
return Vector2::Sum(); return Vector2::Sum();

View File

@@ -387,6 +387,15 @@ TEST_F(UnitTestVector3, AsTuple)
EXPECT_FLOAT_EQ(std::get<2>(tuple), v1.z); EXPECT_FLOAT_EQ(std::get<2>(tuple), v1.z);
} }
// Test AsTuple method
TEST_F(UnitTestVector3, AngleBeatween)
{
EXPECT_EQ(Vector3(0.0f, 0.0f, 1.0f).AngleBetween({1, 0 ,0}).value().AsDegrees(), 90.0f);
EXPECT_EQ(Vector3(0.0f, 0.0f, 1.0f).AngleBetween({0.0f, 0.0f, 1.0f}).value().AsDegrees(), 0.0f);
EXPECT_FALSE(Vector3(0.0f, 0.0f, 0.0f).AngleBetween({0.0f, 0.0f, 1.0f}).has_value());
}
// Static assertions (compile-time checks) // Static assertions (compile-time checks)
static_assert(Vector3(1.0f, 2.0f, 3.0f).LengthSqr() == 14.0f, "LengthSqr should be 14"); static_assert(Vector3(1.0f, 2.0f, 3.0f).LengthSqr() == 14.0f, "LengthSqr should be 14");
static_assert(Vector3(1.0f, 2.0f, 3.0f).Dot(Vector3(4.0f, 5.0f, 6.0f)) == 32.0f, "Dot product should be 32"); static_assert(Vector3(1.0f, 2.0f, 3.0f).Dot(Vector3(4.0f, 5.0f, 6.0f)) == 32.0f, "Dot product should be 32");