EFONT $RSI/efont.pro
[Previous] [Next]
 NAME:
	EFONT

 PURPOSE:
	This widget provides a vector font editor and display.

 CATEGORY:
	Fonts.

 CALLING SEQUENCE:
	EFONT, Init_font

 INPUTS:
	Init_font: The initial font index, from 3 to 29.  Default = 3.

 KEYWORD PARAMETERS:
	GROUP:  The widget group, if part of a hierarchy.
	FILE:	alternate font file name/path.  Use this if you don't want
		to modify the standard font file.
	BLOCK:  Set this keyword to have XMANAGER block when this
		application is registered.  By default the Xmanager
               keyword NO_BLOCK is set to 1 to provide access to the
               command line if active command 	line processing is available.
               Note that setting BLOCK for this application will cause
		all widget applications to block, not only this
		application.  For more information see the NO_BLOCK keyword
		to XMANAGER.

 OUTPUTS:
	No explicit outputs.

 CALLS: ***
	EFONT_ADD_VECTOR, EFONT_CLOAD_PROC, EFONT_CMODE_EVENT, EFONT_DRAW_CHAR
	EFONT_DRAW_FONT, EFONT_DRAW_GRID, EFONT_EVENT, EFONT_ORDER_VECTORS
	EFONT_PNT_LINE, EFONT_READ_FONT, EFONT_REDRAW, EFONT_REMOVE_VECTOR
	EFONT_RW_FONT_CHAR, EFONT_SAVE_CHAR, EFONT_SAVE_FONT, EFONT_STR_TO_CCODE
	EFONT_TRANSLATE_VECTS, EFONT_VIEW_EVENT, FILEPATH, REVERSE, TEK_COLOR
	XDISPLAYFILE, XMANAGER, XREGISTERED
 COMMON BLOCKS:
	efont_com.

 SIDE EFFECTS:
	Reads and modifies the vector font file, which is normally
	hersh1.chr in the IDL resource/fonts directory.

 RESTRICTIONS:
	A basic editor.

 PROCEDURE:
	Call EFONT and press the HELP button for instructions.

 MODIFICATION HISTORY:
	DMS	Nov, 1992.
	WSO, 1/95, Updated for new directory structure
	DMS, May, 1996.  Removed device dependencies, updated to newer widgets.


EIGENQL $RSI/eigenql.pro
[Previous] [Next]
 NAME:
       EIGENQL

 PURPOSE:
       This function computes the eigenvalues and eigenvectors of an 
       N by N real, symmetric array using Householder reductions and 
       the QL method with implicit shifts. The result is a vector
	containing the eigenvalues.  The eigenvectors are returned
	in a separate keyword parameter.

 CATEGORY:
       Linear Algebra / Eigensystems

 CALLING SEQUENCE:
       Eigenvalues = Eigenql(A)

 INPUTS:
       A:    An N by N symmetric array of type float or double.

 OUTPUTS:
	Function value = Eigenvalues = the computed eigenvalues, ordered
		as specified, stored in an N element vector.

 KEYWORD PARAMETERS:
    ABSOLUTE:   If set, order eigenvalues by their absolute value (magnitude),
		 otherwise sort by signed value.
    ASCENDING:  If set to a non-zero value, eigenvalues are returned in
                ascending order (smallest to largest). If not
                set or set to zero, eigenvalues are returned in descending
                order (largest to smallest). The eigenvectors are
                correspondingly reordered. 

       DOUBLE:  If set to a non-zero value, computations are done in
                double precision arithmetic.

 EIGENVECTORS:  The computed eigenvectors, an N x N array.  The ith
		 row, (*,i), corresponds to the ith eigenvalue. If this named
                variable is not supplied, eigenvectors are not computed.

    OVERWRITE:  If set to a non-zero value, the input array is used for
                internal storage and its previous contents are overwritten,
		 saving memory if the original array values are no longer
		 required.

     RESIDUAL:  Use this keyword to specify a named variable which returns
                the residuals for each eigenvalue/eigenvector(lambda/x) pair.
                The residual is based on the definition Ax - (lambda)x = 0
                and is an array of the same size as A and the same type as 
                RESULT. The rows of this array correspond to the residuals 
                for each eigenvalue/eigenvector pair.
                NOTE: If the OVERWRITE keyword is set to a non-zero value,
                      this keyword has no effect.

 CALLED BY:
	PCOMP
 EXAMPLE:
       Define an N by N real, symmetric array.
         a = [[ 5.0,  4.0,  0.0, -3.0], $
              [ 4.0,  5.0,  0.0, -3.0], $
              [ 0.0,  0.0,  5.0, -3.0], $
              [-3.0, -3.0, -3.0,  5.0]]

       Compute the eigenvalue/eigenvector pairs. 
       The resulting array has 5 columns and 4 rows. 
         Eigenvalues = EIGENQL(a, EIGENVECTORS=evecs, RESIDUAL = residual)

	  PRINT, Eigenvalues
	12.0915       6.18661      1.0000       0.721870 
	  PRINT, evecs
        -0.554531    -0.554531    -0.241745     0.571446
         0.342981     0.342981    -0.813186     0.321646
         0.707107    -0.707107 -2.58096e-08      0.00000
         0.273605     0.273605     0.529422     0.754979

       The accuracy of each eigenvalue/eigenvector (lamda/x) pair may be 
       checked by printing the residual array. This array is the same size 
       as A and the same type as RESULT. All residual values should be 
       floating-point zeros.
         print, residual

 MODIFICATION HISTORY:
           Written by:  GGS, RSI, January 1996
	    Modified:    DMS, RSI, August 1996
                        Added ABSOLUTE, and reorganized calling sequence.
           


EIGENVEC $RSI/eigenvec.pro
[Previous] [Next]
 NAME:
       EIGENVEC

 PURPOSE:
       This function computes the eigenvectors of an N by N real, non-
       symmetric array using inverse subspace iteration. The result is 
       a complex array with a column dimension equal to N and a row 
       dimension equal to the number of eigenvalues.

 CATEGORY:
       Linear Algebra / Eigensystems

 CALLING SEQUENCE:
       Result = Eigenvec(A, Eval)

 INPUTS:
       A:    An N by N nonsymmetric array of type float or double.

    EVAL:    An N-element complex vector of eigenvalues.

 KEYWORD PARAMETERS:
       DOUBLE:  If set to a non-zero value, computations are done in
                double precision arithmetic.

        ITMAX:  The number of iterations performed in the computation
                of each eigenvector. The default value is 4.

     RESIDUAL:  Use this keyword to specify a named variable which returns
                the residuals for each eigenvalue/eigenvector(lambda/x) pair.
                The residual is based on the definition Ax - (lambda)x = 0
                and is an array of the same size and type as RESULT. The rows
                this array correspond to the residuals for each eigenvalue/
                eigenvector pair. 

 EXAMPLE:
       Define an N by N real, nonsymmetric array.
         a = [[1.0, -2.0, -4.0,  1.0], $
              [0.0, -2.0,  3.0,  4.0], $
              [2.0, -6.0, -1.0,  4.0], $
              [3.0, -3.0,  1.0, -2.0]]

       Compute the eigenvalues of A using double-precision complex arithmetic.
         eval = HQR(ELMHES(a), /double)

       Print the eigenvalues. The correct solution should be:
       (0.26366259, -6.1925899), (0.26366259, 6.1925899), $
       (-4.9384492,  0.0000000), (0.41112397, 0.0000000)
         print, eval

       Compute the eigenvectors of A. The eigenvectors are returned in the 
       rows of EVEC.
         result = EIGENVEC(a, eval, residual = residual)

       Print the eigenvectors.
         print, evec(*,0), evec(*,1), evec(*,2), evec(*,3)

       The accuracy of each eigenvalue/eigenvector (lamda/x) 
       pair may be checked by printing the residual array. This array is the
       same size and type as RESULT and returns the residuals as its rows.
       The residual is based on the mathematical definition of an eigenvector,
       Ax - (lambda)x = 0.

 PROCEDURE:
       EIGENVEC computes the set of eigenvectors that correspond to a given 
       set of eigenvalues using Inverse Subspace Iteration. The eigenvectors 
       are computed up to a scale factor and are of Euclidean length. The
       existence and uniqueness of eigenvectors are not guaranteed.

 MODIFICATION HISTORY:
       Written by:  GGS, RSI, December 1994
       Modified:    GGS, RSI, April 1996
                    Modified keyword checking and use of double precision. 


EOS_EXISTS $RSI/eos_exists.pro
[Previous] [Next]
 NAME:
	EOS_EXISTS

 PURPOSE:
	Test for the existence of the HDF EOS library

 CATEGORY:
	File Formats

 CALLING SEQUENCE:
	Result = EOS_EXISTS()

 INPUTS:
	None.

 KEYWORD PARAMETERS:
	None.

 OUTPUTS:
	Returns TRUE (1) if the HDF EOS data format library is
	supported. Returns FALSE(0) if it is not.

 EXAMPLE:
	IF eos_exists() EQ 0 THEN Fail,"HDF not supported on this machine"

 MODIFICATION HISTORY
	Written by:	Scott Lasica,  10/30/98


EOS_GD_QUERY $RSI/eos_gd_query.pro
[Previous] [Next]
 NAME:
   EOS_GD_QUERY

 PURPOSE:
   Read the grid header of an HDF file and report on the EOS grid
   extensions.

 CATEGORY:
   Input/Output.

 CALLING SEQUENCE:
   Result = EOS_GD_QUERY(Filename, GridName [, Info])

 INPUTS:
	Filename:  The filename of the HDF-EOS file.

   GridName:   The EOS Grid Name.

 Keyword Inputs:
   None.

 OUTPUTS:
   Result is a long with the value of 1 if the file contains grid extentions,
	0 otherwise.

   Info: (optional)  An anonymous structure containing information about
		the file.  This structure is valid only when the return value of
       the function is 1.  The Info structure has the following fields:

           Field       IDL data type   Description
           -----       -------------   -----------
           ATTRIBUTES	String array	Array of attribute names
			DIMENSION_NAMES	String array	Names of dimensions
			DIMENSION_SIZES	Long array	Sizes of dimensions
			FIELD_NAMES	String array	Names of fields
			FIELD_RANKS	Long array	Ranks (dimensions) of fields
			FIELD_TYPES	Long array	IDL types of fields
			GCTP_PROJECTION	Long	GCTP projection code
			GCTP_PROJECTION_PARM	Double array	GCTP projection parameters
			GCTP_SPHEROID	Long	GCTP spheroid code
			GCTP_ZONE	Long	GCTP zone code (for UTM projection)
			GRID_INDEX	Long	Grid index for which this structure is valid
			GRID_NAME	String	Name of grid
			IMAGE_LOWRIGHT	Double[2]	Location of lower right corner (meters)
			IMAGE_UPLEFT	Double[2]	Location of upper left corner (meters)
			IMAGE_X_DIM	Long	Number of columns in grid image
			IMAGE_Y_DIM	Long	Number of rows in grid image
			NUM_ATTRIBUTES	Long	Number of attributes
			NUM_DIMS	Long	Number of dimensions
			NUM_IDX_MAPS	Long	Number of indexed dimension mapping entries
			NUM_MAPS	Long	Number of dimension mapping entries
			NUM_FIELDS	Long	Number of fields
			NUM_GEO_FIELDS	Long	Number of geolocation field entries
			ORIGIN_CODE	Long	Origin code
			PIX_REG_CODE	Long	Pixel registration code

 CALLS: ***
	EOS_QUERY
 RESTRICTIONS:
   None.

 EXAMPLE:
   To retrieve information from the HDF-EOS grid name myGrid enter:

       result = EOS_GD_QUERY("foo.hdf", 'myGrid', info)
       IF (result GT 0) THEN BEGIN
           HELP, /STRUCT, info
       ENDIF ELSE BEGIN
           PRINT, 'HDF file not found or file does not contain EOS GD extensions.'
       ENDELSE

 MODIFICATION HISTORY:
   Written December 1998, Scott J. Lasica


EOS_PT_QUERY $RSI/eos_pt_query.pro
[Previous] [Next]
 NAME:
   EOS_PT_QUERY

 PURPOSE:
   Read the point header of an HDF file and report on the EOS point
   extensions.

 CATEGORY:
   Input/Output.

 CALLING SEQUENCE:
   Result = EOS_PT_QUERY(Filename, PointName [, Info])

 INPUTS:
	Filename:  The filename of the HDF-EOS file.

   PointName:   The EOS Point Name.

 Keyword Inputs:
   None.

 OUTPUTS:
   Result is a long with the value of 1 if the file contains point extentions,
	0 otherwise.

   Info: (optional)  An anonymous structure containing information about
		the file.  This structure is valid only when the return value of
       the function is 1.  The Info structure has the following fields:

           Field       IDL data type   Description
           -----       -------------   -----------
           ATTRIBUTES	String Array	Array of attribute names
			NUM_ATTRIBUTES	Long		Number of attributes
			NUM_LEVELS	Long			Number of levels

 CALLS: ***
	EOS_QUERY
 RESTRICTIONS:
   None.

 EXAMPLE:
   To retrieve information from the HDF-EOS point name myPoint enter:

       result = EOS_PT_QUERY("foo.hdf", 'myPoint', info)
       IF (result GT 0) THEN BEGIN
           HELP, /STRUCT, info
       ENDIF ELSE BEGIN
           PRINT, 'HDF file not found or file does not contain EOS PT extensions.'
       ENDELSE

 MODIFICATION HISTORY:
   Written December 1998, Scott J. Lasica


EOS_SW_QUERY $RSI/eos_sw_query.pro
[Previous] [Next]
 NAME:
   EOS_SW_QUERY

 PURPOSE:
   Read the header of an HDF file and report on the EOS swath
   extensions.

 CATEGORY:
   Input/Output.

 CALLING SEQUENCE:
   Result = EOS_SW_QUERY(Filename, SwathName [, Info])

 INPUTS:
	Filename:  The filename of the HDF-EOS file.

   SwathName:   The EOS Swath Name.

 Keyword Inputs:
   None.

 OUTPUTS:
   Result is a long with the value of 1 if the file contains swath extentions,
	0 otherwise.

   Info: (optional)  An anonymous structure containing information about
		the file.  This structure is valid only when the return value of
       the function is 1.  The Info structure has the following fields:

           Field       IDL data type   Description
           -----       -------------   -----------
		ATTRIBUTES	String array	Array of attribute names
		DIMENSION_NAMES	String array	Names of dimensions
		DIMENSION_SIZES	Long array	Sizes of dimensions
		FIELD_NAMES	String array	Names of fields
		FIELD_RANKS	Long array	Ranks (dimensions) of fields
		FIELD_TYPES	Long array	IDL types of fields
		GEO_FIELD_NAMES	String array	Names of geolocation fields
		GEO_FIELD_RANKS	Long array	Ranks (dimensions) of geolocation fields
		GEO_FIELD_TYPES	Long array	IDL types of geolocation fields
		IDX_MAP_NAMES	String array	Names of index maps
		IDX_MAP_SIZES	Long array	Sizes of index map arrays
		NUM_ATTRIBUTES	Long	Number of attributes
		NUM_DIMS	Long	Number of dimensions
		NUM_FIELDS	Long	Number of fields
		NUM_GEO_FIELDS	Long	Number of geolocation fields
		NUM_IDX_MAPS	Long	Number of indexed dimension mapping entries
		NUM_MAPS	Long	Number of mapping entries
		MAP_INCREMENTS	Long array	Increment of each geolocation relation
		MAP_NAMES	String array	Names of maps
		MAP_OFFSETS	Long array	Offset of each geolocation relation
		MAP_SIZES	Long array	Sizes of index map arrays

 CALLS: ***
	EOS_QUERY
 RESTRICTIONS:
   None.

 EXAMPLE:
   To retrieve information from the HDF-EOS swath name mySwath enter:

       result = EOS_SW_QUERY("foo.hdf", 'mySwath', info)
       IF (result GT 0) THEN BEGIN
           HELP, /STRUCT, info
       ENDIF ELSE BEGIN
           PRINT, 'HDF file not found or file does not contain EOS SW extensions.'
       ENDELSE

 MODIFICATION HISTORY:
   Written February 1999, Scott J. Lasica


ERRPLOT $RSI/errplot.pro
[Previous] [Next]
 NAME:
   ERRPLOT

 PURPOSE:
   Plot error bars over a previously drawn plot.

 CATEGORY:
   J6 - plotting, graphics, one dimensional.

 CALLING SEQUENCE:
   ERRPLOT, Low, High  ;X axis = point number.

   ERRPLOT, X, Low, High   ;To explicitly specify abscissae.

 INPUTS:
   Low:    A vector of lower estimates, equal to data - error.
   High:   A vector of upper estimates, equal to data + error.

 OPTIONAL INPUT PARAMETERS:
   X:  A vector containing the abscissae.

 KEYWORD Parameters:
   WIDTH:  The width of the error bars, in units of the width of
   the plot area.  The default is 1% of plot width.

   All keywords to PLOTS are also accepted.

 OUTPUTS:
   None.

 COMMON BLOCKS:
   None.

 SIDE EFFECTS:
   An overplot is produced.

 RESTRICTIONS:
   Logarithmic restriction removed.

 PROCEDURE:
   Error bars are drawn for each element.

 EXAMPLES:
   To plot symmetrical error bars where Y = data values and
   ERR = symmetrical error estimates, enter:

       PLOT, Y         ;Plot data
       ERRPLOT, Y-ERR, Y+ERR   ;Overplot error bars.

   If error estimates are non-symetrical, enter:

       PLOT,Y
       ERRPLOT, Upper, Lower   ;Where Upper & Lower are bounds.

   To plot versus a vector of abscissae:

       PLOT, X, Y        ;Plot data (X versus Y).
       ERRPLOT, X, Y-ERR, Y+ERR  ;Overplot error estimates.

 MODIFICATION HISTORY:
   DMS, RSI, June, 1983.

   Joe Zawodney, LASP, Univ of Colo., March, 1986. Removed logarithmic
   restriction.

   DMS, March, 1989.  Modified for Unix IDL.
       KDB, March, 1997.  Modified to used !p.noclip
       RJF, Nov, 1997.    Removed unnecessary print statement
              Disable and re-enable the symbols for the bars
   DMS, Dec, 1998.    Use device coordinates.  Cleaned up logic.
   CT, RSI, Jan 2001: Add _REF_EXTRA to pass keywords to PLOTS.
   CT, RSI, Oct 2004: Add compile_opt idl2 to allow > 32767 error bars.
   CT, RSI, Oct 2005: Force PSYM=0 in PLOTS, so we ignore !p.psym.


EXPAND $RSI/expand.pro
[Previous] [Next]
 NAME:
	EXPAND
 PURPOSE:
	Array magnification  (CONGRIDI like except that this really works!)
 CATEGORY:
	Z4 - IMAGE PROCESSING
 CALLING SEQUENCE:
	EXPAND,A,NX,NY,RESULT [,MAXVAL=MAXVAL,FILLVAL=FILLVAL]
 INPUTS:
	A	Array to be magnified
	NX	Desired size of X Dimension
	NY	Desired size of Y Dimension
 Keywords:
	MAXVAL	Largest good value. Elements greater than this are ignored
	FILLVAL	Value to use when elements larger than MAXVAL are encountered.
		Defaults to -1.
 OUTPUTS:
	RESULT	Magnified Floating point image of A array (NX by NY)
 COMMON BLOCKS:
	NONE
 SIDE EFFECTS:
	NONE
 RESTRICTIONS:
	A must be two Dimensional
 PROCEDURE:
	Bilinear interpolation.
	Not really fast if you have to swap memory (eg. NX*NY is a big number).
	OK Postscript users don't forget that postscript pixels are scaleable!
 MODIFICATION HISTORY:
	Aug 15, 1989	J. M. Zawodny, NASA/LaRC, MS 475, Hampton VA, 23665.
	Aug 26, 1992	JMZ, Added maxval and fillval keywords.
	Sep 30, 1992	DMS, RSI, Rewrote to use INTERPOLATE function.
 Please send suggestions and bugreports to zawodny@arbd0.larc.nasa.gov


EXTRAC $RSI/extrac.pro
[Previous] [Next]
 NAME:
	EXTRAC

 PURPOSE:
	The EXTRAC function returns as its result any rectangular sub-matrix
	or portion of the parameter array.  When parts of the specified
	subsection lie outside the bounds of the array, zeros are
	entered into these outlying elements.

	EXTRAC was originally a built-in system procedure in the PDP-11
	version of IDL, and was retained in that form in the original VAX/VMS
	IDL for compatibility.  Most applications of the EXTRAC function
	are more concisely written using subscript ranges (e.g., X(10:15)).  In
	the current release of IDL, EXTRAC has been rewritten as a User Library
	function that provides the same interface as the previous versions.

 CATEGORY:
	Array Manipulation.

 CALLING SEQUENCE:
	Result = EXTRAC(Array, C1, C2, ..., Cn, S1, S2, ..., Sn)

 INPUTS:                 
	Array:	The array from which the subarray will be copied.

	Ci:	The starting subscript in Array for the subarray. There
		should be one Ci for each dimension of Array.

	Si:	The size of each dimension.  The result will have dimensions
		of (S1, S2, ..., Sn). There should be one Si for each
		dimension of Array.

 OUTPUTS:
	This function returns a two-dimensional, floating-point,
	interpolated array.

 RESTRICTIONS:
	In order to make the most typical cases run quickly, little error 
	checking is done on the input.  In particular, the Ci and Si arguments
	must all be scalar integers, and the Si must be non-negative.

	If you know that the subarray will never lie beyond the edges of
	the array, it is more efficient to use array subscript ranges
	to extract the data instead of EXTRAC. 

 PROCEDURE:
	If the subarray lies entirely inside the Array argument, the
	standard array subscript-range mechanism is used to do the work.
	Otherwise, a zeroed array of the correct type and size is
	created, and the overlapping subarray is copied into it.

 EXAMPLES:
	EXAMPLE 1:
	Define a 1000 point vector with each element initialized to
	its subscript.  Extract a 300 pt. vector, starting at A(200) and
	going to A(499).  B(0) will be equal to A(200), B(299) will be
	equal to A(499).  Enter:

	    A = FINDGEN(1000)
	    B = EXTRAC(A, 200, 300)

	EXAMPLE 2:
	Here, the first 49 points extracted (B(0) to B(49)) lie outside
	the bounds of the vector and are set to 0.  B(50) is set to A(0),
	B(51) is set to A(1) which is 1, ... Enter:

	    A = FINDGEN(1000)
	    B = EXTRAC(A, -50, 100)

	EXAMPLE 3:
	The following commands illustrate the use of EXTRAC with multi-
	dimensional arrays.  Enter:

	    A = INTARR(64,64)	;Make a 64X64 matrix to play with

	Take out a 32X32 portion starting at A(20,30) by entering:

	    B = EXTRAC(A, 20, 30, 32, 32)

	A better way to perform the same operation as the previous line is:

	    B = A(20:51, 30:61)

	Extract the 20th column and 32nd row of A:

	    B = EXTRAC(A, 19, 0, 1, 64)	; Extract 20th column of A
	    B = EXTRAC(A, 0, 31, 64, 1)	; Extract 32nd row of A

	Take a 32X32 matrix from A starting at A(40,50).

	    B = EXTRAC(A, 40, 50, 32, 32)

	NOTE: Those points beyond the boundaries of A are set to 0.

 REVISION HISTORY:
	July 18, 1989	Written AB, RSI
	October 15, 1997, AB, RSI, Made correction provided by Eric Deutsch
		(deutsch@dione.astro.washington.edu)in clipping size of
		subarray so results that overlap on all sides can be
		properly handled. Added tests for the completely overlapping
		case.


EXTRACT_SLICE $RSI/extract_slice.pro
[Previous] [Next]
 NAME:
   EXTRACT_SLICE

 PURPOSE:
   This function returns a 2-D planar slice extracted from
       3-D volumetric data. The slicing plane may be oriented at
       any angle, and may pass through any desired location in the
       volume.

 CATEGORY:
   Volume Rendering.

 CALLING SEQUENCE:
       Slice = EXTRACT_SLICE(Vol, X_size, Y_size, X_center, Y_center, $
                             Z_center, X_rot, Y_rot, Z_rot)
   OR
   Slice = EXTRACT_SLICE(Vol, X_size, Y_size, X_center, Y_center, $
                             Z_center, Plane_Normal, Xvec

 INPUTS:
       Vol:        The three dimensional volume of data to slice.
                   Data type : Any 3-D array except string or structure.
       X_size:     The size of the returned slice in X (The returned
                   slice will have the dimensions X_size by Y_size).
                   Data type : Long.
       Y_size:     The size of the returned slice in Y. To preserve
                   the correct aspect ratio of the data, Y_size should
                   equal X_size. For optimal results, set X_size and
                   Y_size to be greater than or equal to the largest of
                   the three dimensions of Vol.
                   Data type : Long.
       X_center:   The X coordinate (index) within the volume that the
                   slicing plane passes through. The center of the
                   slicing plane passes through Vol at the coordinate
                   (X_center, Y_Center, Z_center).
                   Data type : Any scalar numeric value (usually Long).
       Y_center:   The Y coordinate (index) within the volume that the
                   slicing plane passes through.
                   Data type : Any scalar numeric value (usually Long).
       Z_center:   The Z coordinate (index) within the volume that the
                   slicing plane passes through.
                   Data type : Any scalar numeric value (usually Long).
       X_rot:      The orientation (X rotation) of the slicing plane.
                   Before transformation, the slicing plane is parallel
                   to the X-Y plane. The slicing plane transformations
                   are performed in the following order :
                      1. Rotate Z_rot degrees about the Z axis.
                      2. Rotate Y_rot degrees about the Y axis.
                      3. Rotate X_rot degrees about the X axis.
                      4. Translate the center of the plane to
                         X_center, Y_center, Z_center.
                   Data type : Float.
       Y_rot:      The orientation (Y rotation) of the slicing plane.
                   Data type : Float.
       Z_rot:      The orientation (Z rotation) of the slicing plane.
                   Data type : Float.

   Plane_Normal: 3D normal vector of slicing plane
                   Data type : Float[3].
   Xvec:       3D vector representing X direction for slicing plane.
           This vector will be projected onto slicing plane before
           use.
                   Data type : Float[3].

 KEYWORD PARAMETERS:
       OUT_VAL:    If OUT_VAL is set, then the portions of the returned
                   slice that lie outside the original volume are set to
                   the value passed to OUT_VAL.
                   Data type : Any scalar numeric value (usually the same
                               type as Vol).
       RADIANS:    Set this keyword to a non-zero value to indicate that
                   X_rot, Y_rot, and Z_rot are in radians. The default
                   is degrees. Ignored for Plane_Normal,Xvec usage.
                   Data type : Int.
       SAMPLE:     If SAMPLE is set to a non-zero value then nearest
                   neighbor sampling is used to compute the slice.
                   Otherwise, tri-linear (or cubic) interpolation is used.
                   A small reduction in execution time will result if
                   SAMPLE mode is set and the OUT_VAL keyword is NOT
                   used.


       ANISOTROPY: Set this input keyword to a three element array.  This
           array specifies the spacing between the planes of the
           input volume in grid units of the (isotropic) output image.

   VERTICES:   Set this output keyword to a named variable in which to
           return a [3,Xsize,Ysize] floating point array.  This is an
           array of the x,y,z sample locations for each pixel in the
           normal output.

 OUTPUTS:
       This function returns the planar slice as a two dimensional
       array with the same data type as Vol. The dimensions of the
       returned array are X_size by Y_size.

 CALLS: ***
	CROSSP, NORM, T3D
 CALLED BY:
	idlitvisimageplane__define [10], idlitvisimageplane__define [11]
	idlitvisimageplane__define [1], idlitvisimageplane__define [2]
	idlitvisimageplane__define [3], idlitvisimageplane__define [4]
	idlitvisimageplane__define [5], idlitvisimageplane__define [6]
	idlitvisimageplane__define [7], idlitvisimageplane__define [8]
	idlitvisimageplane__define [9]
 EXAMPLE:
       Display an oblique slice through volumetric data.

       ; Create some data.
          vol = RANDOMU(s, 40, 40, 40)
          FOR i=0, 10 DO vol = SMOOTH(vol, 3)
          vol = BYTSCL(vol(3:37, 3:37, 3:37))

       ; Extract and display a slice using angles to specify slice.
          slice = EXTRACT_SLICE(vol, 40, 40, 17, 17, 17, 0, 0, 45, $
                   OUT_VAL=0B)
          TVSCL, REBIN(slice, 400, 400)

       ; Extract and display same slice using vector form.
       slice = EXTRACT_SLICE(vol, 40,40, 17, 17, 17, $
           [0,0,1],[1,1,0],OUT_VAL=0B,ANISOTROPY=[2,1,1])

 MODIFICATION HISTORY:
       Written by:     Daniel Carr. Wed Sep  2 14:47:07 MDT 1992
   Modified by:
       Daniel Carr. Mon Nov 21 14:59:45 MST 1994
           Improved speed and added the CUBIC keyword.
       Karthik B.  March 1999
           Added vector form of plane specification, ANISOTROPY,
           and VERTICES keywords.
       CT, RSI, July 2002
           Corrected the scaling/rotation transform order.
           Allow ANISOTROPY to work with X_rot, Y_rot, Z_rot args.
           Removed CUBIC keyword since INTERPOLATE cannot do 3D cubic.