From 267ae3ecf6b778c870e99c57215eebd8f2945768 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 18 Jun 2024 13:20:07 +0900 Subject: [PATCH] Impl. UnitTest for LogMap, fix LogMapAxis --- src/sc_sacd.cpp | 2 +- src/test.cpp | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/sc_sacd.cpp b/src/sc_sacd.cpp index d882ecb..c5c24c5 100644 --- a/src/sc_sacd.cpp +++ b/src/sc_sacd.cpp @@ -853,6 +853,6 @@ float SC_SACD_LogMap_Angle(SC_SACD_Mat3 mat3) { } SC_SACD_Vec3 SC_SACD_LogMap_Axis(SC_SACD_Mat3 mat3, float angle) { - return SC_SACD_Vec3{mat3.y2 - mat3.z1, mat3.z0 - mat3.x2, mat3.x1 - mat3.y0} * + return SC_SACD_Vec3{mat3.z1 - mat3.y2, mat3.x2 - mat3.z0, mat3.y0 - mat3.x1} * (1.0F / (2.0F * std::sin(angle))); } diff --git a/src/test.cpp b/src/test.cpp index de93344..b4c3c7a 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -949,7 +949,39 @@ int main() { // Test rotation matrix to axis-angle. { - // TODO: implement rotating Vec3 with axis-angle so that this can be tested. + // X-axis. + float angle = std::numbers::pi_v / 2.0F; + SC_SACD_Mat3 rot_mat = SC_SACD_Rotation_Mat3_XAxis(angle); + + float derived_angle = SC_SACD_LogMap_Angle(rot_mat); + CHECK_FLOAT(derived_angle, angle); + + SC_SACD_Vec3 derived_axis = SC_SACD_LogMap_Axis(rot_mat, angle); + CHECK_FLOAT(derived_axis.x, 1.0F); + CHECK_FLOAT(derived_axis.y, 0.0F); + CHECK_FLOAT(derived_axis.z, 0.0F); + + // Y-axis. + rot_mat = SC_SACD_Rotation_Mat3_YAxis(angle); + + derived_angle = SC_SACD_LogMap_Angle(rot_mat); + CHECK_FLOAT(derived_angle, angle); + + derived_axis = SC_SACD_LogMap_Axis(rot_mat, angle); + CHECK_FLOAT(derived_axis.x, 0.0F); + CHECK_FLOAT(derived_axis.y, 1.0F); + CHECK_FLOAT(derived_axis.z, 0.0F); + + // Z-axis. + rot_mat = SC_SACD_Rotation_Mat3_ZAxis(angle); + + derived_angle = SC_SACD_LogMap_Angle(rot_mat); + CHECK_FLOAT(derived_angle, angle); + + derived_axis = SC_SACD_LogMap_Axis(rot_mat, angle); + CHECK_FLOAT(derived_axis.x, 0.0F); + CHECK_FLOAT(derived_axis.y, 0.0F); + CHECK_FLOAT(derived_axis.z, 1.0F); } std::cout << "Checks checked: " << checks_checked << '\n'