Re: [eigen] RotationBase times DiagonalMatrix |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
On 24.09.2011 13:38, Hauke Heibel wrote:
OTOH, one might argue that with such an implicit conversion the memory
requirements increase from Dim to 2*(Dim+1) for translations as well
as scaling types.
I guess you meant Dim*(Dim+1). Besides the memory maybe also important
is the increased number of flops: 2n²+n for Transform, vs. n for
Translate/Scale.
Maybe introducing a
template<class Derived>
class TransformBase;
is the solution. This would describe all Transformations -- affine or
pure linear.
Then one can pass arbitrary Transformations as templated class, ensuring
best performance and avoiding type conversions, but still the current
Transform class could be constructed from anything which inherits from
TransformBase. If then someone does:
Transform a = Translation(...);
he'll get a performance/memory penalty, but that's exactly the same for
Matrix<..> m = Diagonal<...>(...);
I.e. one can decide oneself, if one knows that a is always a
translation, or want to permit things such as:
Transform a;
if(...)
a = Translation(...);
else
a = Rotation(...);
etc...
We could add a non explicit one from DiagonalMatrix then.
And here is the only point where I am not sure. In my eyes the only
reason is the increased memory requirement but that's the same as for
Translations. Following the *is a* reasoning of Christoph, the
conversion is fine as long the Transform is not an Isometry and I
think we could prevent this conversion once again with a
static_assert.
As I said before, if you allow
Transform a;
a = Diagonal(...);
I see no reason, why implicit conversions should be prohibited.
Christoph
--
----------------------------------------------
Dipl.-Inf. Christoph Hertzberg
Cartesium 0.051
Universität Bremen
Enrique-Schmidt-Straße 5
28359 Bremen
Tel: (+49) 421-218-64252
----------------------------------------------