Hi Yannick and Gilles,

Le 27/07/2011 00:37, Gilles Sadowski a écrit :
Hello.

In project SIRIUS (CNES), we would like to slightly modify the Rotation
class so it can fit our needs, and to create an independant Quaternion
class.

- Quaternion : We need to separate these two notions : the quaternion
and the rotation representation, because we have to be able to access
directly to a quaternion as a mathematical object, not only as a
rotation quaternion.

Fine.


- Rotation :
  - We would like to base the rotation upon the new Quaternion object.

Why ? A rotation quaternion is a special case of a quaternion. It is normalized and it has the property that Q and -Q represent the same quaternion, but from a pure quaternion point of view they are different quaternions. These assumptions are used throughout the Rotation class (see for example the constructors that add some specific parameters to deal with normalization.

The fact that Rotation uses quaternion formalism (but for now not an independent class Quaternion) is an implementation detail and should not be visible from outside. This is shown by the getters in the class. There are getters for quaternion components, of course, but there are also getters for Cardan angles, for Euler angles, for vector and axis and for matrix, none of them are stored in the instance, they are recomputed on the fly. We could provide another getQ() getter that would build the Quaternion on the fly when it is needed.

Adding the Quaternion as the storage part of the Rotation class would also add another layer, with two different memory handling (which is significant for very small objects) and two levels of method delegations. If you look at your other proposal about 3x3 matrices, it seems rather inconsistent. In this second proposal, you ask for a specialization to improve performances. Here you already have a highly performing and validated implementation and you want to add a layer that is only an implementation detail without user changes (except drop in performance and need to validate again).

  - We would like to use the CCSDS convention (the same as ESA projects)
for the rotation quaternion :
        if Q represents a rotation, applied to a vector X giving the
vector X', we have : X' = Q.X.Qt (Qt =  conjugate(Q) ).
  ->  As the actual rotation (based upon 4 double q1/2/3/4) does not use
this convention, we propose to modify the getters/setters (getQi /
setQi) to preserve compatibility and to add a getQ that returns a
quaternion compliant with CCSDS convention.

I would strongly propose to build the quaternion on the fly by simply adding the Quaternion class and build an instance on the fly when getQ is called.

Calling getQ is a very rare need and most users directly use the specialized Rotation operation to deal with rotation, and not with extra Quaternion only operations, as general quaternion operations are not Rotation oriented. So it does make sense to build the extra object only for the very few uses where it is needed (i.e. your uses) and not to always have this secondary object buried inside the Rotation class where most users don't need it.


This feature can be summed up in 3 points :
- create a Quaternion class (mathematical object)

Yes.

- modify the Rotation class to use this quaternion, with the CCSDS
convention

Non.

- modify the actual methods in Rotation class to preserve compatibility

Should not be necessary.


The Quaternionn class should be placed in the geometry.euclidian.threed
package.

I'd propose to put it in the "complex" package. It would thus stand out as a
mathematical concept of its own, as you suggest above.

I agree with Gilles here. If you intend to have a quaternion that is the mathematical object, it should not be in threed. Quaternions in 3D are only rotation quaternions. General quaternions are much closer to Complex as Gilles said or to 4th dimension space, which is probably not widespread enough to set up a specific package, so they should be elsewhere.

best regards,
Luc


Thanks in advance for your advice about this feature. Please also tell
us the best way to communicate on such features (mailing list or/and bug
tracker ?).


Regards,
Gilles

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to