Implement 2D and 3D cross product.
2D cross product is defined as equivalent to: res = cross(a.xy0(), b.xy0()).z()
This commit is contained in:
parent
fc7b666429
commit
aaa8e75dc1
2 changed files with 51 additions and 1 deletions
|
@ -26,6 +26,11 @@ namespace vwr {
|
||||||
template <typename V1, typename V2, size_type S>
|
template <typename V1, typename V2, size_type S>
|
||||||
typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type dot ( const Vec<V1, S>& parLeft, const Vec<V2, S>& parRight );
|
typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type dot ( const Vec<V1, S>& parLeft, const Vec<V2, S>& parRight );
|
||||||
|
|
||||||
|
template <typename V1, typename V2>
|
||||||
|
typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type cross ( const Vec<V1, 2>& parLeft, const Vec<V2, 2>& parRight );
|
||||||
|
template <typename V1, typename V2>
|
||||||
|
Vec<typename std::common_type<V1, V2>::type> cross ( const Vec<V1, 3>& parLeft, const Vec<V2, 3>& parRight );
|
||||||
|
|
||||||
template <typename V1, typename V2, size_type S>
|
template <typename V1, typename V2, size_type S>
|
||||||
inline typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type dot (const Vec<V1, S>& parLeft, const Vec<V2, S>& parRight) {
|
inline typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type dot (const Vec<V1, S>& parLeft, const Vec<V2, S>& parRight) {
|
||||||
auto retval = parLeft.x() * parRight.x();
|
auto retval = parLeft.x() * parRight.x();
|
||||||
|
@ -34,6 +39,19 @@ namespace vwr {
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename V1, typename V2>
|
||||||
|
inline typename std::common_type<typename Vec<V1>::scalar_type, typename Vec<V2>::scalar_type>::type cross (const Vec<V1, 2>& parLeft, const Vec<V2, 2>& parRight) {
|
||||||
|
return parLeft.x() * parRight.y() - parLeft.y() * parRight.x();
|
||||||
|
}
|
||||||
|
template <typename V1, typename V2>
|
||||||
|
inline Vec<typename std::common_type<V1, V2>::type> cross (const Vec<V1, 3>& parLeft, const Vec<V2, 3>& parRight) {
|
||||||
|
return Vec<typename std::common_type<V1, V2>::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
|
} //namespace vwr
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace vwr {
|
||||||
|
|
||||||
typedef vwr::Vec<UnorderedVector> uvec3i;
|
typedef vwr::Vec<UnorderedVector> uvec3i;
|
||||||
|
|
||||||
TEST(vwr, ops) {
|
TEST(vwr, dot) {
|
||||||
using namespace vwr;
|
using namespace vwr;
|
||||||
|
|
||||||
ivec3 a(1);
|
ivec3 a(1);
|
||||||
|
@ -43,3 +43,35 @@ TEST(vwr, ops) {
|
||||||
EXPECT_EQ(7*5+2*2+9*8, dot(a, c));
|
EXPECT_EQ(7*5+2*2+9*8, dot(a, c));
|
||||||
EXPECT_EQ(7*6+2*9+9*3, dot(b, 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));
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue