SUBROUTINE LINEAR( SCALE, ZERO, ELOC, NAME, LOCTR, STATUS )
* Declare variables.
INCLUDE 'SAE_PAR'
INTEGER STATUS, NSUBS
REAL SCALE, ZERO, INVSCL
CHARACTER * ( * ) ELOC, NAME, LOCTR
CHARACTER FOR( 1 ) * 80, INV( 1 ) * 80
* Check STATUS.
IF ( STATUS .NE. SAI__OK ) RETURN
* Formulate the forward transformation function.
FOR( 1 ) = 'out = ( in - zero ) * scale' [1]
CALL TRN_STOKR( 'zero', ZERO, FOR( 1 ), NSUBS, STATUS )
CALL TRN_STOKR( 'scale', SCALE, FOR( 1 ), NSUBS, STATUS )
* If possible, formulate the inverse transformation function.
IF( SCALE .NE. 0.0 ) THEN
INVSCL = 1.0 / SCALE
INV( 1 ) = 'in = ( out * inv_scale ) + zero' [2]
CALL TRN_STOKR( 'zero', ZERO, INV( 1 ), NSUBS, STATUS )
CALL TRN_STOKR( 'inv_scale', INVSCL, INV( 1 ), NSUBS, STATUS )
* Inverse is undefined...
ELSE
INV( 1 ) = 'in' [3]
ENDIF
* Create the transformation.
CALL TRN_NEW( 1, 1, FOR, INV, '_REAL:', [4]
: 'Shift and linear scaling: in --> out',
: ELOC, NAME, LOCTR, STATUS )
END
Programming notes:
TRANSFORM Coordinate Transformation Facility