An alternative to changing the number of Frame axes, which is not
allowed, is to create a new Frame by selecting axes from an existing
one. The method of doing this is very similar to the way astPermAxes
is used (), in that we supply an integer
array filled with the numbers of the axes we want, in their new
order. In this case, however, the number of array elements need not
equal the number of Frame axes.
For example, we could select axes 3 and 2 (in that order) from a 3-dimensional Frame as follows:
astFrame *frame1, *frame2; astMapping *mapping; int pick[ 2 ] = { 3, 2 }; ... frame2 = astPickAxes( frame1, 2, pick, &mapping );
This would return a pointer to a 2-dimensional Frame (``frame2'')
which contains the information associated with axes 3 and 2, in that
order, from the original Frame (``frame1''). The original Frame is not
altered by this process. Beware, however, that the axis information
may still be shared by both Frames, so if you wish to alter either of
them independently you may first need to use astCopy
() to make an independent copy.
In addition to the new Frame pointer, astPickAxes will also return a
pointer to a new Mapping via its fourth argument (you may supply a
NULL pointer as an argument if you do not want this Mapping). This
Mapping will inter-relate the two Frames. By this we mean that its
forward transformation will convert coordinates originally in the
coordinate system represented by ``frame1'' into that represented by
``frame2'', while its inverse transformation will convert in the
opposite direction. In this particular case, the Mapping would be a
PermMap () and would implement the following
transformations:
Forward: (1, 2, 3) --> (3, 2) (2, 4, 6) --> (6, 4) (3, 6, 9) --> (9, 6) (4, 8, 12) --> (12, 8) (5, 10, 15) --> (15, 10) Inverse: (3, 2) --> (<bad>, 2, 3) (6, 4) --> (<bad>, 4, 6) (9, 6) --> (<bad>, 6, 9) (12, 8) --> (<bad>, 8, 12) (15, 10) --> (<bad>, 10, 15)
This is our first introduction to the idea of inter-relating pairs of Frames via a Mapping, but this will assume a central role later on.
Note that when using astPickAxes, it is also possible to request more
axes than there were in the original Frame. This will involve
selecting axes from the original Frame that do not exist. To do this,
the corresponding axis number (in the ``pick'' array) should be set to
zero and the effect is to introduce an additional new axis which is
not derived from the original Frame. This axis will have default
values for all its attributes. You will need to do this because
astPickAxes does not allow you to select any of the original axes more
than once.14
AST A Library for Handling World Coordinate Systems in Astronomy