Cross product for vectors of size 2. Fixes #1037

This commit is contained in:
Gabriele Buondonno
2022-11-15 22:39:42 +00:00
committed by Antonio Sánchez
parent 8588d8c74b
commit 6431dfdb50
7 changed files with 108 additions and 34 deletions

View File

@@ -78,6 +78,36 @@ template<typename Scalar> void orthomethods_3()
VERIFY_IS_APPROX(v2.cross(v1), rv1.cross(v1));
}
template<typename Scalar> void orthomethods_2()
{
typedef typename NumTraits<Scalar>::Real RealScalar;
typedef Matrix<Scalar,2,1> Vector2;
typedef Matrix<Scalar,3,1> Vector3;
Vector3 v30 = Vector3::Random(),
v31 = Vector3::Random();
Vector2 v20 = v30.template head<2>();
Vector2 v21 = v31.template head<2>();
VERIFY_IS_MUCH_SMALLER_THAN(v20.cross(v20), Scalar(1));
VERIFY_IS_MUCH_SMALLER_THAN(v21.cross(v21), Scalar(1));
VERIFY_IS_APPROX(v20.cross(v21), v30.cross(v31).z());
Vector2 v20Rot90(numext::conj(-v20.y()), numext::conj(v20.x()));
VERIFY_IS_APPROX(v20.cross( v20Rot90), v20.squaredNorm());
VERIFY_IS_APPROX(v20.cross(-v20Rot90), -v20.squaredNorm());
Vector2 v21Rot90(numext::conj(-v21.y()), numext::conj(v21.x()));
VERIFY_IS_APPROX(v21.cross( v21Rot90), v21.squaredNorm());
VERIFY_IS_APPROX(v21.cross(-v21Rot90), -v21.squaredNorm());
// check mixed product
typedef Matrix<RealScalar, 2, 1> RealVector2;
RealVector2 rv21 = RealVector2::Random();
v21 = rv21.template cast<Scalar>();
VERIFY_IS_APPROX(v20.cross(v21), v20.cross(rv21));
VERIFY_IS_APPROX(v21.cross(v20), rv21.cross(v20));
}
template<typename Scalar, int Size> void orthomethods(int size=Size)
{
typedef typename NumTraits<Scalar>::Real RealScalar;
@@ -119,6 +149,9 @@ template<typename Scalar, int Size> void orthomethods(int size=Size)
EIGEN_DECLARE_TEST(geo_orthomethods)
{
for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( orthomethods_2<float>() );
CALL_SUBTEST_2( orthomethods_2<double>() );
CALL_SUBTEST_4( orthomethods_2<std::complex<double> >() );
CALL_SUBTEST_1( orthomethods_3<float>() );
CALL_SUBTEST_2( orthomethods_3<double>() );
CALL_SUBTEST_4( orthomethods_3<std::complex<double> >() );