1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
/* ----------------------------------------------------------------------------
@COPYRIGHT :
Copyright 1993,1994,1995 David MacDonald,
McConnell Brain Imaging Centre,
Montreal Neurological Institute, McGill University.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies. The author and McGill University
make no representations about the suitability of this
software for any purpose. It is provided "as is" without
express or implied warranty.
---------------------------------------------------------------------------- */
#include <internal_volume_io.h>
/* ----------------------------- MNI Header -----------------------------------
@NAME : compute_transform_inverse
@INPUT : transform
@OUTPUT : inverse
@RETURNS : TRUE if successful
@DESCRIPTION: Computes the inverse of the given transformation matrix.
@METHOD :
@GLOBALS :
@CALLS :
@CREATED : 1993 David MacDonald
@MODIFIED :
---------------------------------------------------------------------------- */
VIOAPI BOOLEAN compute_transform_inverse(
Transform *transform,
Transform *inverse )
{
int i, j;
Real **t, **inv;
BOOLEAN success;
/* --- copy the transform to a numerical recipes type matrix */
ALLOC2D( t, 4, 4 );
ALLOC2D( inv, 4, 4 );
for_less( i, 0, 4 )
{
for_less( j, 0, 4 )
t[i][j] = Transform_elem(*transform,i,j);
}
success = invert_square_matrix( 4, t, inv );
if( success )
{
/* --- copy the resulting numerical recipes matrix to the
output argument */
for_less( i, 0, 4 )
{
for_less( j, 0, 4 )
{
Transform_elem(*inverse,i,j) = inv[i][j];
}
}
#ifdef DEBUG
/* --- check if this really is an inverse, by multiplying */
{
Transform ident;
concat_transforms( &ident, transform, inverse );
if( !close_to_identity(&ident) )
{
print_error( "Error in compute_transform_inverse\n" );
}
}
#endif
}
else
make_identity_transform( inverse );
FREE2D( t );
FREE2D( inv );
return( success );
}
|