Функция для применения собственного преобразования к векторам с использованием чисел с плавающей точкой или двойных - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть собственное преобразование t, определенное с помощью double. Следующие примеры работают:

Vector3d d_point, t_d_point, d_vector, t_d_vector;  // Initialization not shown
Vector3f f_point, t_f_point, f_vector, t_f_vector;

// Transforming points
t_d_point = t * d_point;                                 
t_f_point = t.template cast<float>() * f_point;          

// Transforming vectors
t_d_vector = t.linear() * d_vector;                      
t_f_vector = t.template cast<float>().linear() * f_vector;

Если я объявляю функцию

template <typename Transform, typename Derived>
inline auto transformPoint(const Transform & t, const Eigen::MatrixBase<Derived> & point) {
    return t.template cast<typename Derived::Scalar>() * point;
}

, работают следующие функции:

t_d_point = transformPoint(t, d_point);
t_f_point = transformPoint(t, f_point); 

Однако, векторная версия

template <typename Transform, typename Derived>
inline auto transformVector(const Transform & t, const Eigen::MatrixBase<Derived> & vector) {
    return t.template cast<typename Derived::Scalar>().linear() * vector;
}

работает, когда приведение не требуется (преобразование и вектор определяются с помощью двойных чисел):

t_d_vector = transformVector(t * d_vector);

, но завершается неудачно, когда приведение необходимо, возвращая в результате мусор:

t_f_vector = transformVector(t * f_vector);

Учитывая, что t.template cast<float>().linear() * f_vector работает, что такое правильное объявление для функции transformVector()?

...