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:
King_DuckZ 2017-02-01 01:51:52 +00:00
parent fc7b666429
commit aaa8e75dc1
2 changed files with 51 additions and 1 deletions

View file

@ -26,6 +26,11 @@ namespace vwr {
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 );
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>
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();
@ -34,6 +39,19 @@ namespace vwr {
}
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
#endif