From aaa8e75dc125e4116bed76ed14cbfc028bf6e9c7 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Wed, 1 Feb 2017 01:51:52 +0000 Subject: [PATCH] Implement 2D and 3D cross product. 2D cross product is defined as equivalent to: res = cross(a.xy0(), b.xy0()).z() --- include/vectorwrapper/vectorops.hpp | 18 +++++++++++++++ test/unit/test_ops.cpp | 34 ++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/vectorwrapper/vectorops.hpp b/include/vectorwrapper/vectorops.hpp index 1e59495..50c9c60 100644 --- a/include/vectorwrapper/vectorops.hpp +++ b/include/vectorwrapper/vectorops.hpp @@ -26,6 +26,11 @@ namespace vwr { template typename std::common_type::scalar_type, typename Vec::scalar_type>::type dot ( const Vec& parLeft, const Vec& parRight ); + template + typename std::common_type::scalar_type, typename Vec::scalar_type>::type cross ( const Vec& parLeft, const Vec& parRight ); + template + Vec::type> cross ( const Vec& parLeft, const Vec& parRight ); + template inline typename std::common_type::scalar_type, typename Vec::scalar_type>::type dot (const Vec& parLeft, const Vec& parRight) { auto retval = parLeft.x() * parRight.x(); @@ -34,6 +39,19 @@ namespace vwr { } return retval; } + + template + inline typename std::common_type::scalar_type, typename Vec::scalar_type>::type cross (const Vec& parLeft, const Vec& parRight) { + return parLeft.x() * parRight.y() - parLeft.y() * parRight.x(); + } + template + inline Vec::type> cross (const Vec& parLeft, const Vec& parRight) { + return Vec::type>( + parLeft.y() * parRight.z() - parLeft.z() * parRight.y(), + parLeft.z() * parRight.x() - parLeft.x() * parRight.z(), + parLeft.x() * parRight.y() - parLeft.y() * parRight.x() + ); + } } //namespace vwr #endif diff --git a/test/unit/test_ops.cpp b/test/unit/test_ops.cpp index 157089e..4fa0b85 100644 --- a/test/unit/test_ops.cpp +++ b/test/unit/test_ops.cpp @@ -23,7 +23,7 @@ namespace vwr { typedef vwr::Vec uvec3i; -TEST(vwr, ops) { +TEST(vwr, dot) { using namespace vwr; ivec3 a(1); @@ -43,3 +43,35 @@ TEST(vwr, ops) { EXPECT_EQ(7*5+2*2+9*8, dot(a, c)); EXPECT_EQ(7*6+2*9+9*3, dot(b, c)); } + +TEST(vwr, cross2D) { + using namespace vwr; + + ivec2 a(53, 97); + ivec2 b(71, -30); + + EXPECT_EQ(-8477, cross(a, b)); + + a /= 4; + b /= -2; + EXPECT_EQ(1035, cross(a, b)); +} + +TEST(vwr, cross3D) { + using namespace vwr; + + ivec3 a(5, 7, 13); + ivec3 b(17, 19, 23); + + ivec3 res(-86, 106, -24); + EXPECT_EQ(res, cross(a, b)); + + a.x() *= 10; + a.y() *= -8; + a.z() *= 37; + b *= -99; + res.x() = 1032273; + res.y() = -695673; + res.z() = -188298; + EXPECT_EQ(res, cross(a, b)); +}