我发现使用Eigen对象作为参数的函数设计很麻烦。虽然Eigen Documentation中的信息很有用,但它表明模板参数的方法很尴尬。假设,我们想要编写一个几何例程,如线 - 平面交点。一种简单而透明的方法是:
template<typename _Tp>
bool planeLineIntersect(const Eigen::Matrix<_Tp, 3, 1>& planePoint,
const Eigen::Matrix<_Tp, 3, 1>& planeNormal,
const Eigen::Matrix<_Tp, 3, 1>& linePoint,
const Eigen::Matrix<_Tp, 3, 1>& lineDir,
Eigen::Matrix<_Tp, 3, 1>& intersectionPoint)
这看起来相当令人愉悦,看到这个的人可以知道每个参数都应该是相同类型的3D矢量。但是,直接地,这不允许任何类型的特征表达式(我们必须为我们使用的每个表达式调用Eigen :: Matrix构造函数)。因此,如果表达式与此一起使用,我们需要创建不必要的临时值。
建议的解决方案是:
template<typename Derived1, typename Derived2, typename Derived3, typename Derived4, typename Derived5>
bool planeLineIntersect(const Eigen::MatrixBase<Derived1>& planePoint,
const Eigen::MatrixBase<Derived2>& planeNormal,
const Eigen::MatrixBase<Derived3>& linePoint,
const Eigen::MatrixBase<Derived4>& lineDir,
const Eigen::MatrixBase<Derived5>& intersectionPoint)
这并没有透露任何关于预期的矩阵,也没有揭示哪些参数用于输入和输出,因为我们必须常设交叉点以允许输出参数中的表达式。据我了解,这是允许所有函数参数中的特征表达式的唯一方法。尽管表达支持不雅,但第一个片段对我来说似乎更可爱。
我的问题:
答案 0 :(得分:1)
对于这样小的固定大小的物体,我不会打扰,并采用第一种解决方案。
拥有输出函数参数很少是一种好方法。在您的特定情况下,一种方法是创建一个PlaneLineIntersection类,其ctor将采用一个平面和一条线,存储交集的结果,然后提供访问器来查询计算结果(没有交集,是一个点,一行)。
顺便说一句,你注意到了特征/几何模块的HyperPlane和ParametrizedLine类吗? ParametrizedLine类有一个带有HyperPlane的intersectionPoint成员(尽管它有限,因为它假定交集确实存在并且它是一个点)。