Re: [eigen] Euler-angles and partial reductions API design

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi again,

I thought a bit further about all this in the shower:

- about the cast to scalar for 1x1 size: the danger is if it will make certain 
exprs ambiguous, making compilation fail. For example:

2 * some_1x1_xpr

this could be interpreted as product of matrixbase by scalar, or as first 
casting some_1x1_xpr to scalar and then doing plain old multiplication. I'm 
afraid the compiler will stop there saying it's ambiguous.

- about the rotationX() name: i forgot you proposed the good idea that static 
functions should start with capital, so indeed RotationX(). Then I'm not a 
fan of the Rot abbreviation.

- about the rowWise() / colWise() names: since -wise is just a suffix there's 
not need for capital, like in cwise(). So: rowwise().

Cheers,

Benoit

On Thursday 17 July 2008 15:11:03 Gael Guennebaud wrote:
> Hi list,
>
> I have a couple of questions regarding function names and API design,
> all suggestions are welcome.
>
>
> Let's start with the EulerAngles class of the geometry module. An
> EulerAngles aims to represent a rotation as a sequence for 3
> elementary rotations around the X, Y or Z axes. However there exist as
> many conventions as orders for the axes: since an axis can be used
> twice and 2 consecutive axes must be different then we have a total of
> 12 possibilities: XYZ, XYX, ZXY, ZXZ, etc...
>
> Moreover, the represented rotation depends on whether we consider the
> rotation of an object around fixed axes (left multiply) or whether we
> consider the rotation of a local frame (right multiply). Currently the
> EulerAngles class supports only the XYZ-left-multiply convention,
> however with only little extra code it is possible to handle all
> conventions making it much more useful. How to to specify the desired
> convention ? Let's first consider the axis order, we can imagine the
> following possibilities:
>
>  * define 12 XYZ-like constants:
>    EulerAngles<float, ZXZ>(a0, a1, a2);
>
>  * define the three X, Y, and Z constants:
>    EulerAngles<float, Z, X, Z>(a0, a1, a2);
>    but they might easily conflict
>
>  * simply name the axes 1, 2, 3:
>    EulerAngles<float, 3, 1, 3>(a0, a1, a2);
>
> I prefer the first option but maybe someone has a better idea. About
> the the right/left multiply choice, I would make it right-multiply by
> default for many reasons, one of them being to be consistent with
> OpenGL. Maybe we could even only allow this convention ? (otherwise it
> would be specified as an additional (and optional) template
> parameter).
>
> In the same vein, in order to tackle degree vs radian mistakes, we
> could define two very small classes Degree and Radian providing
> automatic conversion from one type to the other. So a function which
> requires a radian would be declared: void foo(Radian angle) and
> called:
> foo(Degree(180)) or foo(Radian(3.14)), (and we do the same for the
> returned type). This is a really safe solution (I saw that in the
> rendering engine Ogre3D), but maybe it is a bit overkill and heavy to
> use. So I mention it for the record, but I'm not sure at all to like
> it. (btw, in eigen all angles are of course assumed to be in radian
> but the confusion is easy as soon as you mix it with OpenGL code).
>
>
> For the second point I'll try to be more concise ;), so what about the
> partial-redux proposal which is on the Todo page, section Array
> module:
> http://eigen.tuxfamily.org/index.php?title=Todo#Array_module
>
> The idea to make partial-reduction usable by adding .columnWise() and
> .rowWise() members to MatrixBase giving access to partial-reduction
> shortcuts.
> I suggested columnWise/rowWise because I think they are much less
> ambiguous than "horizontal/vertical reduction".
> Also, the current templated functions verticalRedux/horizontalRedux
> would be moved to the generic "PartialRedux proxy", and named "redux":
>   m.columnWise().redux(myfunctor());
>
>
> Even shorter, what about an automatic cast to scalar operator for 1x1
> fixed size matrix ? I see 2 use cases:
> - you can write: float a = vector1.transpose() * vector2;
> - you can write generic multimensionnal algorithms without the the
> pain of writing [0] for the 1D case.
> In practice the cast operator would be protected by a static assert.
>
>
> That's it for now,
> cheers,
> Gael.


Attachment: signature.asc
Description: This is a digitally signed message part.



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/