From 45f1c07f6b53be2ae957c8339b8f67d5dcf0f588 Mon Sep 17 00:00:00 2001 From: Arnaud Botella Date: Wed, 3 Jun 2026 09:22:52 +0200 Subject: [PATCH] fix(Angle): missing angle from vectors --- include/geode/geometry/angle.hpp | 10 +++++++++- src/geode/geometry/angle.cpp | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/geode/geometry/angle.hpp b/include/geode/geometry/angle.hpp index 2b5957301..73f7f3223 100644 --- a/include/geode/geometry/angle.hpp +++ b/include/geode/geometry/angle.hpp @@ -25,6 +25,12 @@ #include +namespace geode +{ + FORWARD_DECLARATION_DIMENSION_CLASS( Vector ); + ALIAS_3D( Vector ); +} // namespace geode + namespace geode { class opengeode_geometry_api Angle @@ -32,6 +38,8 @@ namespace geode public: [[nodiscard]] static Angle create_from_radians( double radians ); [[nodiscard]] static Angle create_from_degrees( double degrees ); + [[nodiscard]] static Angle create_from_vectors( + const Vector3D& vector1, const Vector3D& vector2 ); [[nodiscard]] double radians() const; [[nodiscard]] double degrees() const; @@ -57,7 +65,7 @@ namespace geode [[nodiscard]] Angle normalized_between_0_and_pi() const; private: - explicit Angle( double radians ) : radians_( radians ) {} + explicit Angle( double radians ); private: double radians_; diff --git a/src/geode/geometry/angle.cpp b/src/geode/geometry/angle.cpp index 3ab180c22..988654243 100644 --- a/src/geode/geometry/angle.cpp +++ b/src/geode/geometry/angle.cpp @@ -23,6 +23,8 @@ #include +#include + namespace { double radians_to_degrees( double radians ) @@ -38,14 +40,29 @@ namespace namespace geode { + Angle::Angle( double radians ) + : radians_( std::isnan( radians ) ? 0 : radians ) + { + } + Angle Angle::create_from_radians( double radians ) { - return Angle( radians ); + return Angle{ radians }; } Angle Angle::create_from_degrees( double degrees ) { - return Angle( degrees_to_radians( degrees ) ); + return Angle{ degrees_to_radians( degrees ) }; + } + + Angle Angle::create_from_vectors( + const Vector3D& vector1, const Vector3D& vector2 ) + { + const auto prev = vector1.normalize(); + const auto next = vector2.normalize(); + const auto dot = std::clamp( prev.dot( next ), -1.0, 1.0 ); + const auto angle = std::acos( dot ); + return Angle{ angle }; } double Angle::radians() const