Previous: text Up: ../slides.html Next: unitsinches-centimeters-cm
<LIST | NOLIST> <IMAGE | WORLD> <ROTATE (X-axis|Y-axis|Z-axis) degrees> | <SCALE sx sy sz> | <SHEAR (sxy syx) | (sxy sxz syx syz szx szy)> | <TRANSLATE tx ty tz> In some applications, such as plotting of digitized data, it may be desirable to transform the input coordinates implicitly before they are sent to a plot routine. This command provides a powerful and convenient way of defining a general 3-D transformation on the (x,y,z) coordinates. The order of the subcommands from left to right defines the order in which the various transformations are to be applied. The transformation matrix constructed may be either a world coordinate modelling matrix, or an image transformation matrix, as selected by the WORLD and IMAGE subcommands. Since use of an image transformation matrix is extremely rare (it is applied in device coordinate space after all other transformations have been done), the default if neither keyword is specified is a world modelling matrix. If desired, these matrices may be specified directly with the VIEW IMAGE-TRANSFORMATION-MATRIX and VIEW WORLD-MODELLING-MATRIX commands described elsewhere. The transformation matrix so constructed post-multiplies the current world coordinate modelling matrix or image transformation matrix (which are initially unit matrices) in the CORE system and then replaces it. The post-multiplication allows the various subcommands to be issued in one TRANSFORMATION command, or on several consecutive TRANSFORMATION commands, with the same overall effect. The modelling matrix is included internally in the total transformation matrix mapping world coordinates to normalized device coordinates, the use of this option entails no overhead whatever. An image transformation matrix is applied at the device level, and in the current <PLOT79> implementation, does introduce additional run-time overhead on most devices. If the command parse fails because of errors, the old matrix remains in effect. Otherwise, the matrix is replaced by the newly computed one. If the LIST option is specified, and the top-level LIST OFF command has not been issued, the old and new matrices are printed. Thus, specification of each subcommand on separate "TRANSFORMATION LIST" commands will display the matrix at each step, which is often useful for debugging purposes. The subcommand NONE causes the current transformation matrix to be reset to a unit matrix, effectively cancelling a previous TRANSFORMATION command. The subcommand POP causes the previous transformation to be popped from the transformation stack, replacing the current one which is discarded. The subcommand PUSH saves the current transformation matrix on the stack, and leaves it as the current matrix. Together, they provide a way to make a temporary modification of the current transformation matrix without knowing what it is, then to restore the original. For example, a "TRANSFORMATION PUSH ROTATE Z-axis 45" command could precede a sequence of plotting commands to draw an object. The object would be rotated 45 degrees about the Z-axis. Following this, a TRANSFORMATION POP command would revert to the situation before the PUSH subcommand was issued. The stack depth is of course fixed, but the limit of 10 levels set at compile time should be ample. An error message is issued if a POP subcommand is encountered with an empty stack, or if a PUSH command would cause a stack overflow. In either case, the current transformation matrix remains unchanged. The ROTATE subcommand specifies a rotation angle in degrees about the axis specified by the following keyword. The angle is positive counterclockwise looking down the positive axis to the origin. For example, for a Z-axis rotation, the rotated coordinates are given by xnew = x*cos(angle) - y*sin(angle) ynew = x*sin(angle) + y*cos(angle) znew = z The SCALE subcommand may be followed by independent multiplicative scale factors for the x, y, and z coordinates. If fewer than three values are given, the omitted ones default to the same value as the last one. The new coordinates are given by xnew = x*sx ynew = y*sy znew = z*sz The SHEAR subcommand specifies either two shear factors for a 2-D shear, or six shear factors for a 3-D shear. For example, 'sxy' is the change in x for a unit change in y, and 'syx' is the change in y for a unit change in x. That is, the new coordinates are xnew = x + y*sxy ynew = x*syx + y znew = z with a 2-D shear, or xnew = x + y*sxy + z*sxz ynew = x*syx + y + z*syz znew = x*szx + y*szy + z with a 3-D shear. They may be used to obtain a skewed coordinate system. The TRANSLATE subcommand is used to move the origin (0,0,0) to a new point (tx,ty,tz). The new coordinates are given by xnew = x - tx ynew = y - ty znew = z - tz For example, suppose we have an object defined in coordinates in the range 0..100, and we wish to rotate it by 180 degrees about the Z-axis passing through the point (50,50,0) before plotting it. The command to effect this is TRANSFORM TRANSLATE 50 50 ROTATE Z-axis 180 TRANSLATE -50 -50 As a second example, suppose we want to plot the mirror image of the same object, where the reflection is about the yz plane passing through the center point (50,50,0). The necessary command is TRANSFORM TRANSLATE 50 50 SCALE -1 1 TRANSLATE -50 -50