reman3/Rayman_X/cpa/public/MTH/MTH2d.h

904 lines
50 KiB
C

/* ##H_FILE#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FILE : MTH2d.h
MODULE : MTH (Common Mathematic Library)
DESCRIPTION : 2D Vectorial implementation
VERSION : MTH V5.0.13 / Alexandre LANGER [ALX] Ubi R&D / Add Comments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
#ifndef MTH2D_H
#define MTH2D_H
#include "MTH_Real.h"
/* ##TYPEDEF#----------------------------------------------------------------------------
Types definition
---------------------------------------------------------------------------------------*/
/* 2D Vector : */
typedef struct MTH2D_tdstVector_
{
MTH_tdxReal xX;
MTH_tdxReal xY;
} MTH2D_tdstVector;
/* 2D Matrix */
typedef struct MTH2D_tdstMatrix_
{
MTH2D_tdstVector stCol_0;
MTH2D_tdstVector stCol_1;
} MTH2D_tdstMatrix;
/* ##MACRO#----------------------------------------------------------------------------
MACRO definition
---------------------------------------------------------------------------------------*/
/* ##-######################################
## MACRO AND FUNCTION FOR 2D MATHEMATICS
######################################### */
/* ##-###########################
## Vector Operations
############################## */
/* ##M==================================================================================
NAME : MTH2D_M_vAddVector
DESCRIPTION : Add two vectors : VectDest= VectA + VectB
INPUT : VectDest, VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vAddVector( VectDest, VectA, VectB) \
{ (VectDest)->xX = MTH_M_xAdd((VectA)->xX, (VectB)->xX); \
(VectDest)->xY = MTH_M_xAdd((VectA)->xY, (VectB)->xY); }
/* ##M==================================================================================
NAME : MTH2D_M_vSubVector
DESCRIPTION : Sub two vectors : VectDest= VectA - VectB
INPUT : VectDest, VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSubVector( VectDest, VectA, VectB) \
{ (VectDest)->xX = MTH_M_xSub((VectA)->xX, (VectB)->xX); \
(VectDest)->xY = MTH_M_xSub((VectA)->xY, (VectB)->xY); }
/* ##M==================================================================================
NAME : MTH2D_M_vNegVector
DESCRIPTION : Negation of a vector : VectDest= - VectA
INPUT : VectDest, VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vNegVector( VectDest, VectA) \
{ (VectDest)->xX = MTH_M_xNeg( (VectA)->xX ); \
(VectDest)->xY = MTH_M_xNeg( (VectA)->xY ); }
/* ##M==================================================================================
NAME : MTH2D_M_bEqualVector
DESCRIPTION : Test if two vectors are equal
INPUT : VectA, VectB : address of MTH2D_tdstVector
OUTPUT : VectA==VectB : Boolean
=======================================================================================*/
#define MTH2D_M_bEqualVector( VectA, VectB) \
( \
(MTH_M_bEqual((VectA)->xX, (VectB)->xX)) && \
(MTH_M_bEqual((VectA)->xY, (VectB)->xY)) \
)
/* ##M==================================================================================
NAME : MTH2D_M_vAddScalarVector
DESCRIPTION : Add a scalare with a vector : VectDest= a.Id + VectA
INPUT : VectDest: address of MTH2D_tdstVector,
a: MTH_tdxReal, VectA: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vAddScalarVector( VectDest, a, VectA) \
{ \
(VectDest)->xX = MTH_M_xAdd((VectA)->xX, (a)); \
(VectDest)->xY = MTH_M_xAdd((VectA)->xY, (a)); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vSubScalarVector
DESCRIPTION : Add a scalare with a vector : VectDest= VectA - a.Id
INPUT : VectDest: address of MTH2D_tdstVector,
a: MTH_tdxReal, VectA: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSubScalarVector( VectDest, a, VectA) \
{ \
(VectDest)->xX = MTH_M_xSub((VectA)->xX, (a)); \
(VectDest)->xY = MTH_M_xSub((VectA)->xY, (a)); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vMulScalarVector
DESCRIPTION : Multiplicate a scalare with a vector : VectDest= a*VectA
INPUT : VectDest: address of MTH2D_tdstVector,
a: MTH_tdxReal, VectA: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulScalarVector( VectDest, a, VectA) \
{ (VectDest)->xX = MTH_M_xMul((a), (VectA)->xX); \
(VectDest)->xY = MTH_M_xMul((a), (VectA)->xY); }
/* ##M==================================================================================
NAME : MTH2D_M_vDivScalarVector
DESCRIPTION : Divide a vector by a scalare : VectDest= VectA/a
INPUT : VectDest, VectA: address of MTH2D_tdstVector, a: MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vDivScalarVector( VectDest, VectA, a) \
{ (VectDest)->xX = MTH_M_xDiv((VectA)->xX, (a)); \
(VectDest)->xY = MTH_M_xDiv((VectA)->xY, (a)); }
/* ##M==================================================================================
NAME : MTH2D_M_xDotProductVector
DESCRIPTION : Return the Dot Product of two vectors
INPUT : VectA, VectB : address of MTH2D_tdstVector
OUTPUT : VectA.VectB : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xDotProductVector( VectA, VectB) \
MTH_M_xAdd( \
MTH_M_xMul((VectA)->xX, (VectB)->xX), \
MTH_M_xMul((VectA)->xY, (VectB)->xY) \
)
/* ##M==================================================================================
NAME : MTH2D_M_xSqrVector
DESCRIPTION : Return the square of a vector
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : VectA.VectA : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xSqrVector( VectA) \
MTH_M_xAdd( \
MTH_M_xSqr((VectA)->xX), \
MTH_M_xSqr((VectA)->xY) \
)
/* ##M==================================================================================
NAME : MTH2D_M_xNormVector
DESCRIPTION : Return the norm of a vector
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : ||VectA|| : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xNormVector( VectA ) \
MTH_M_xSqrt( MTH2D_M_xSqrVector( VectA ) )
/* ##M==================================================================================
NAME : MTH2D_M_xInvNormVector
DESCRIPTION : Return the inverse of the norm of a vector
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : 1/||VectA|| : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xInvNormVector( VectA ) \
MTH_M_xInvSqrt( MTH2D_M_xSqrVector( VectA ) )
/* ##M==================================================================================
NAME : MTH2D_M_xVectorGapSqr
DESCRIPTION : Return the square Gap between two vectors
INPUT : VectA, VectB : address of MTH2D_tdstVector
OUTPUT : Sqr(||VectA-VectB||) : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xVectorGapSqr(VectA, VectB) \
(MTH_M_xSqrAddSqr( \
MTH_M_xSub( (VectA)->xX, (VectB)->xX), \
MTH_M_xSub( (VectA)->xY, (VectB)->xY) ) )
/* ##M==================================================================================
NAME : MTH2D_M_xVectorGap
DESCRIPTION : Return the Gap between two vectors
INPUT : VectA, VectB : address of MTH2D_tdstVector
OUTPUT : ||VectA-VectB|| : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xVectorGap(VectA, VectB) \
(MTH_M_xSqrt( MTH2D_M_xVectorGapSqr(VectA, VectB) ))
/* ##M==================================================================================
NAME : MTH2D_M_vFillVector
DESCRIPTION : Fill each vector element with a value
INPUT : VectA: address of MTH2D_tdstVector, a: MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vFillVector( VectDest, a) \
{ (VectDest)->xX = (a); \
(VectDest)->xY = (a); }
/* ##M==================================================================================
NAME : MTH2D_M_vNormalizeVector
DESCRIPTION : Normalize a vector : VectDest= VectA/||VectA||
INPUT : VectDest, VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vNormalizeVector(VectDest, VectA) \
{ \
MTH_tdxReal inv_norm; \
inv_norm= MTH2D_M_xInvNormVector( VectA); \
MTH2D_M_vMulScalarVector(VectDest, inv_norm, VectA ); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vGetVectorElements
DESCRIPTION : Get x, y values of a vector
INPUT : x, y : address of MTH_tdxReal, VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetVectorElements( Vx, Vy, VectA) \
{ *Vx = (VectA)->xX; \
*Vy = (VectA)->xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetVectorElements
DESCRIPTION : Set a vector with x, y values
INPUT : VectDest : address of MTH2D_tdstVector, x, y : address of MTH_tdxReal,
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetVectorElements( VectDest, Vx, Vy) \
{ (VectDest)->xX = (Vx); \
(VectDest)->xY = (Vy); }
/* ##M==================================================================================
NAME : MTH2D_M_xGetXofVector
DESCRIPTION : Return x element of a vector
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : x : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xGetXofVector( VectA ) \
(VectA)->xX
/* ##M==================================================================================
NAME : MTH2D_M_vSetXofVector
DESCRIPTION : Set x element of a vector
INPUT : VectDest : address of MTH2D_tdstVector, Vx : MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetXofVector( VectDest, Vx) \
{ (VectDest)->xX = (Vx); }
/* ##M==================================================================================
NAME : MTH2D_M_xGetYofVector
DESCRIPTION : Return y element of a vector
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : y : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xGetYofVector( VectA ) \
(VectA)->xY
/* ##M==================================================================================
NAME : MTH2D_M_vSetYofVector
DESCRIPTION : Set y element of a vector
INPUT : VectDest : address of MTH2D_tdstVector, Vy : MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetYofVector( VectDest, Vy) \
{ (VectDest)->xY = (Vy); }
/* ##M==================================================================================
NAME : MTH2D_M_vCopyVector
DESCRIPTION : Copy a vector : VectDest=VectA
INPUT : VectDest, VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vCopyVector( VectDest, VectA) \
{ memcpy(VectDest, VectA, sizeof(MTH2D_tdstVector)); }
/* ##M==================================================================================
NAME : MTH2D_M_vNullVector
DESCRIPTION : Set all elements of a vector to zero
INPUT : VectDest : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vNullVector( VectDest) \
{ (VectDest)->xX = MTH_C_ZERO; \
(VectDest)->xY = MTH_C_ZERO; }
/* ##M==================================================================================
NAME : MTH2D_M_vScaleVector
DESCRIPTION : Set each element of VectDest with the multiplication of element of VectA by element of VectB
INPUT : VectDest, VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vScaleVector( VectDest, VectA, VectB ) \
{ (VectDest)->xX = MTH_M_xMul( (VectA)->xX, (VectB)->xX); \
(VectDest)->xY = MTH_M_xMul( (VectA)->xY, (VectB)->xY); }
/* ##M==================================================================================
NAME : MTH2D_M_vMiddleVector
DESCRIPTION : Calculate the middle of two vectors : VectDest= (VectA+VectB)/2
INPUT : VectDest, VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMiddleVector( VectDest, VectA, VectB ) \
{ MTH2D_M_vAddVector( VectDest, VectA, VectB ); \
MTH2D_M_vMulScalarVector( VectDest, MTH_C_Inv2 , VectDest); }
/* ##M==================================================================================
NAME : MTH2D_M_vLinearInterpolVector
DESCRIPTION : Calculate the lineat interpolation of two vectors : VectDest= VectA + t.(VectB-VectA)
INPUT : VectDest, VectA, VectB: address of MTH2D_tdstVector, t: MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vLinearInterpolVector( VectDest, VectA, VectB, t) \
{ (VectDest)->xX= MTH_M_xLinearInterpol( (VectA)->xX, (VectB)->xX, (t) ); \
(VectDest)->xY= MTH_M_xLinearInterpol( (VectA)->xY, (VectB)->xY, (t) ); }
/* ##M==================================================================================
NAME : MTH2D_M_vMaxVector
DESCRIPTION : Make a vector with max elements of two other vectors
INPUT : VectDest, VectA, VectB: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMaxVector( VectDest, VectA, VectB) \
{ (VectDest)->xX= MTH_M_xMax( (VectA)->xX, (VectB)->xX ); \
(VectDest)->xY= MTH_M_xMax( (VectA)->xY, (VectB)->xY ); }
/* ##M==================================================================================
NAME : MTH2D_M_vMinVector
DESCRIPTION : Make a vector with min elements of two other vectors
INPUT : VectDest, VectA, VectB: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMinVector( VectDest, VectA, VectB) \
{ (VectDest)->xX= MTH_M_xMin( (VectA)->xX, (VectB)->xX ); \
(VectDest)->xY= MTH_M_xMin( (VectA)->xY, (VectB)->xY ); }
/* ##M==================================================================================
NAME : MTH2D_M_bIsNullVector
DESCRIPTION : Test if a vector is null
INPUT : VectA : address of MTH2D_tdstVector
OUTPUT : VectA==Null vector : Boolean
=======================================================================================*/
#define MTH2D_M_bIsNullVector( VectA ) \
( MTH_M_bEqualZero((VectA)->xX) && MTH_M_bEqualZero((VectA)->xY) )
/* ##M==================================================================================
NAME : MTH2D_M_vMulAddVector
DESCRIPTION : Multiply a scalar to a vector, and add it to a other vector: VectDest = x.VectA + VectB
INPUT : VectDest: address of MTH2D_tdstVector,
x: MTH_tdxReal, VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulAddVector( VectDest, x, VectA, VectB) \
{ (VectDest)->xX = MTH_M_xAdd(MTH_M_xMul((x),(VectA)->xX) , (VectB)->xX); \
(VectDest)->xY = MTH_M_xAdd(MTH_M_xMul((x),(VectA)->xY), (VectB)->xY); }
/* MTH2D_M_vMullAddVector( VectDest, x, VectA, VectB) : VectDest = x.VectA + VectB */
/* WARNING : THIS MUST DESAPEAR !!! */
#define MTH2D_M_vMullAddVector MTH2D_M_vMulAddVector
/* ##M==================================================================================
NAME : MTH2D_M_vSetBaseIVector
DESCRIPTION : Set a vector to Ox base vector : VectDest = ( 1, 0 )
INPUT : VectDest: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetBaseIVector( VectDest ) \
{ (VectDest)->xX = MTH_C_ONE; \
(VectDest)->xY = MTH_C_ZERO; \
}
/* ##M==================================================================================
NAME : MTH2D_M_vSetBaseJVector
DESCRIPTION : Set a vector to Oy base vector : VectDest = ( 0, 1 )
INPUT : VectDest: address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetBaseJVector( VectDest ) \
{ (VectDest)->xX = MTH_C_ZERO; \
(VectDest)->xY = MTH_C_ONE; \
}
/* ##-###########################
## Matrix operations
############################## */
/* ##M==================================================================================
NAME : MTH2D_M_vCopyMatrix
DESCRIPTION : Copy MatA in MatDest
INPUT : MatDest, MatA: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vCopyMatrix( MatDest, MatA) \
{ memcpy(MatDest, MatA, sizeof(MTH2D_tdstMatrix)); }
/* ##M==================================================================================
NAME : MTH2D_M_vAddMatrix
DESCRIPTION : Add two matrix : MatDest= MatA + MatB
INPUT : MatDest, MatA, MatB: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vAddMatrix( MatDest, MatA, MatB) \
{ MTH2D_M_vAddVector( &((MatDest)->stCol_0), \
&((MatA)->stCol_0), &((MatB)->stCol_0)); \
MTH2D_M_vAddVector( &((MatDest)->stCol_1), \
&((MatA)->stCol_1), &((MatB)->stCol_1)); }
/* ##M==================================================================================
NAME : MTH2D_M_vSubMatrix
DESCRIPTION : Sub two matrix : MatDest= MatA - MatB
INPUT : MatDest, MatA, MatB: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSubMatrix( MatDest, MatA, MatB) \
{ MTH2D_M_vSubVector( &((MatDest)->stCol_0), \
&((MatA)->stCol_0), &((MatB)->stCol_0)); \
MTH2D_M_vSubVector( &((MatDest)->stCol_1), \
&((MatA)->stCol_1), &((MatB)->stCol_1)); }
/* ##M==================================================================================
NAME : MTH2D_M_vNegMatrix
DESCRIPTION : Make the Nagation of a matrix : MatDest= -MatA
INPUT : MatDest, MatA: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vNegMatrix( MatDest, MatA) \
{ MTH2D_M_vNegVector( &((MatDest)->stCol_0), \
&((MatA)->stCol_0)); \
MTH2D_M_vNegVector( &((MatDest)->stCol_1), \
&((MatA)->stCol_1)); }
/* ##M==================================================================================
NAME : MTH2D_M_vMulMatrixMatrixWithoutBuffer
DESCRIPTION : Multiply two matrix : MatDest= MatA*MatB, MatDest must be a other matrix
INPUT : MatDest, MatA, MatB: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulMatrixMatrixWithoutBuffer(MatDest, MatA, MatB) \
{ (MatDest)->stCol_0.xX = MTH_M_xMulAddMul( \
(MatA)->stCol_0.xX, (MatB)->stCol_0.xX, \
(MatA)->stCol_1.xX, (MatB)->stCol_0.xY ); \
(MatDest)->stCol_0.xY = MTH_M_xMulAddMul( \
(MatA)->stCol_0.xY, (MatB)->stCol_0.xX, \
(MatA)->stCol_1.xY, (MatB)->stCol_0.xY ); \
(MatDest)->stCol_1.xX = MTH_M_xMulAddMul( \
(MatA)->stCol_0.xX, (MatB)->stCol_1.xX, \
(MatA)->stCol_1.xX, (MatB)->stCol_1.xY ); \
(MatDest)->stCol_1.xY = MTH_M_xMulAddMul( \
(MatA)->stCol_0.xY, (MatB)->stCol_1.xX, \
(MatA)->stCol_1.xY, (MatB)->stCol_1.xY ); }
/* ##M==================================================================================
NAME : MTH2D_M_vMulMatrixMatrix
DESCRIPTION : Multiply two matrix : MatDest= MatA*MatB
INPUT : MatDest, MatA, MatB: address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulMatrixMatrix(Mat_Dest, Mat_A, Mat_B) \
if( (Mat_Dest==Mat_A) || (Mat_Dest==Mat_B) ) \
{ \
MTH2D_tdstMatrix Mtemp; \
\
MTH2D_M_vMulMatrixMatrixWithoutBuffer( \
&Mtemp, Mat_A, Mat_B); \
MTH2D_M_vCopyMatrix( Mat_Dest, &Mtemp); \
} \
else \
{ \
MTH2D_M_vMulMatrixMatrixWithoutBuffer(Mat_Dest, \
Mat_A, Mat_B); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vMulScalarMatrix
DESCRIPTION : Multiply a scalar with a matrix : MatDest= a*MatA
INPUT : MatDest : address of MTH2D_tdstMatrix
a: MTH_tdxReal, MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulScalarMatrix(MatDest, a, MatA) \
{ MTH2D_M_vMulScalarVector( &((MatDest)->stCol_0), \
(a), &((MatA)->stCol_0)); \
MTH2D_M_vMulScalarVector( &((MatDest)->stCol_1), \
(a), &((MatA)->stCol_1)); }
/* ##M==================================================================================
NAME : MTH2D_M_vDivScalarMatrix
DESCRIPTION : Divide a matrix by a scalar : MatDest= MatA/a
INPUT : MatDest : address of MTH2D_tdstMatrix
MatA : address of MTH2D_tdstMatrix, a: MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vDivScalarMatrix(MatDest, MatA, a) \
{ MTH2D_M_vDivScalarVector( &((MatDest)->stCol_0), \
&((MatA)->stCol_0), (a)); \
MTH2D_M_vDivScalarVector( &((MatDest)->stCol_1), \
&((MatA)->stCol_1), (a)); }
/* ##M==================================================================================
NAME : MTH2D_M_vSqrMatrix
DESCRIPTION : Square a matrix : MatDest= MatA*MatA
INPUT : MatDest : address of MTH2D_tdstMatrix
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSqrMatrix(MatDest, MatA) \
{ MTH2D_M_vMulMatrixMatrix( MatDest, MatA, MatA); }
/* ##M==================================================================================
NAME : MTH2D_M_vTranspMatrixWithoutBuffer
DESCRIPTION : Transpose a matrix : MatDest= transp MatA, Matdest must be a other matrix
INPUT : MatDest : address of MTH2D_tdstMatrix
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vTranspMatrixWithoutBuffer(MatDest, MatA) \
{ (MatDest)->stCol_0.xX = (MatA)->stCol_0.xX; \
(MatDest)->stCol_0.xY = (MatA)->stCol_1.xX; \
(MatDest)->stCol_1.xX = (MatA)->stCol_0.xY; \
(MatDest)->stCol_1.xY = (MatA)->stCol_1.xY; }
/* MTH2D_M_vTranpMatrixWithoutBuffer(MatDest, MatA): MatDest= transp MatA */
/* WARNING : THIS MUST DESAPEAR !!! */
#define MTH2D_M_vTranpMatrixWithoutBuffer MTH2D_M_vTranspMatrixWithoutBuffer
/* ##M==================================================================================
NAME : MTH2D_M_vTranspMatrix
DESCRIPTION : Transpose a matrix : MatDest= transp MatA
INPUT : MatDest : address of MTH2D_tdstMatrix
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vTranspMatrix(Mat_Dest, Mat_A) \
if( Mat_Dest==Mat_A ) \
{ \
MTH2D_tdstMatrix Mtemp; \
\
MTH2D_M_vTranspMatrixWithoutBuffer(&Mtemp, Mat_A); \
MTH2D_M_vCopyMatrix( Mat_Dest, &Mtemp); \
} \
else \
{ \
MTH2D_M_vTranspMatrixWithoutBuffer(Mat_Dest, Mat_A); \
}
/* MTH2D_M_vTranpMatrix(MatDest, MatA) : MatDest= transp MatA */
/* WARNING : THIS MUST DESAPEAR !!! */
#define MTH2D_M_vTranpMatrix MTH2D_M_vTranspMatrix
/* ##M==================================================================================
NAME : MTH2D_M_xTraceMatrix
DESCRIPTION : Return the trace of a matrix
INPUT : MatA : address of MTH2D_tdstMatrix
OUTPUT : trace MatA : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xTraceMatrix(MatA) \
MTH_M_xAdd((MatA)->stCol_0.xX, (MatA)->stCol_1.xY)
/* ##M==================================================================================
NAME : MTH2D_M_vSetIdentityMatrix
DESCRIPTION : Set a matrix to the Identity matrix : MatDest= Id
INPUT : MatDest : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetIdentityMatrix(MatDest) \
{ (MatDest)->stCol_0.xX = MTH_C_ONE; \
(MatDest)->stCol_0.xY = MTH_C_ZERO; \
(MatDest)->stCol_1.xX = MTH_C_ZERO; \
(MatDest)->stCol_1.xY = MTH_C_ONE; }
/* ##M==================================================================================
NAME : MTH2D_M_bEqualMatrix
DESCRIPTION : Test if two matrix are equal
INPUT : MatA, MatB : address of MTH2D_tdstMatrix
OUTPUT : MatA==MatB : Boolean
=======================================================================================*/
#define MTH2D_M_bEqualMatrix(MatA, MatB) \
( \
MTH_M_bEqual( (MatA)->stCol_0.xX, (MatB)->stCol_0.xX) && \
MTH_M_bEqual( (MatA)->stCol_0.xY, (MatB)->stCol_0.xY) && \
MTH_M_bEqual( (MatA)->stCol_1.xX, (MatB)->stCol_1.xX) && \
MTH_M_bEqual( (MatA)->stCol_1.xY, (MatB)->stCol_1.xY) \
)
/* ##M==================================================================================
NAME : MTH2D_M_bMatchMatrix
DESCRIPTION : Test if two matrix are neary equal
INPUT : MatA, MatB : address of MTH2D_tdstMatrix
eps : MTH_tdxReal
OUTPUT : (MatA match MatB to within about eps) : Boolean
=======================================================================================*/
#define MTH2D_M_bMatchMatrix(MatA, MatB, eps) \
( \
MTH_M_bEqualWithEpsilon( (MatA)->stCol_0.xX, (MatB)->stCol_0.xX, eps) && \
MTH_M_bEqualWithEpsilon( (MatA)->stCol_0.xY, (MatB)->stCol_0.xY, eps) && \
MTH_M_bEqualWithEpsilon( (MatA)->stCol_1.xX, (MatB)->stCol_1.xX, eps) && \
MTH_M_bEqualWithEpsilon( (MatA)->stCol_1.xY, (MatB)->stCol_1.xY, eps) && \
)
/* ##M==================================================================================
NAME : MTH2D_M_vFillMatrix
DESCRIPTION : Fill each matrix element with "a" value
INPUT : MatDest : address of MTH2D_tdstMatrix
a : MTH_tdxReal
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vFillMatrix(MatDest, a) \
{ (MatDest)->stCol_0.xX = (a); \
(MatDest)->stCol_0.xY = (a); \
(MatDest)->stCol_1.xX = (a); \
(MatDest)->stCol_1.xY = (a); }
/* ##M==================================================================================
NAME : MTH2D_M_xDetMatrix
DESCRIPTION : Return the determinant of a matrix
INPUT : MatA : address of MTH2D_tdstMatrix
OUTPUT : det MatA : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xDetMatrix(MatA) \
MTH_M_xSub( \
MTH_M_xMul( (MatA)->stCol_0.xX, (MatA)->stCol_1.xY ), \
MTH_M_xMul( (MatA)->stCol_0.xY, (MatA)->stCol_1.xX ))
/* ##M==================================================================================
NAME : MTH2D_M_vInverMatrix
DESCRIPTION : Invert a matrix : MatDest= Inv MatA
INPUT : Matdest, MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vInverMatrix(MatDest, MatA) \
{ \
MTH2D_tdstMatrix MatTmp; \
MTH_tdxReal det; \
MatTmp.stCol_0.xX = (MatA)->stCol_1.xY; \
MatTmp.stCol_0.xY = MTH_M_xNeg( (MatA)->stCol_0.xY ); \
MatTmp.stCol_1.xX = MTH_M_xNeg( (MatA)->stCol_1.xX ); \
MatTmp.stCol_1.xY = (MatA)->stCol_0.xX; \
det=MTH2D_M_xDetMatrix( MatA ); \
MTH2D_M_vDivScalarMatrix(MatDest, &(MatTmp), det ); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vGetMatrixColumnElements
DESCRIPTION : Get x, y column col values in MatA
INPUT : x, y : MTH_tdxReal
col : int
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetMatrixColumnElements( Vx, Vy, col, MatA) \
if( col==0 ) \
{ *Vx= (MatA)->stCol_0.xX; *Vy= (MatA)->stCol_0.xY; } \
else \
{ *Vx= (MatA)->stCol_1.xX; *Vy= (MatA)->stCol_1.xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetMatrixColumnElements
DESCRIPTION : Set column col x, y values in MatDest
INPUT : MatDest : address of MTH2D_tdstMatrix
x, y : MTH_tdxReal
col : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetMatrixColumnElements( MatDest, Vx, Vy, col) \
if( col==0 ) \
{(MatDest)->stCol_0.xX= (Vx); (MatDest)->stCol_0.xY= (Vy); } \
else \
{(MatDest)->stCol_1.xX= (Vx); (MatDest)->stCol_1.xY= (Vy); }
/* ##M==================================================================================
NAME : MTH2D_M_xGetMatrixElement
DESCRIPTION : Return element at (lin, col) in MatASet
INPUT : MatA : address of MTH2D_tdstMatrix
lin, col : int
OUTPUT : a : MTH_tdxReal
=======================================================================================*/
#define MTH2D_M_xGetMatrixElement( lin, col, MatA) \
( col==0 ) ? \
( lin==0 ? (MatA)->stCol_0.xX : (MatA)->stCol_0.xY) : \
( lin==0 ? (MatA)->stCol_1.xX : (MatA)->stCol_1.xY)
/* ##M==================================================================================
NAME : MTH2D_M_vSetMatrixElement
DESCRIPTION : Set a element in MatDest at (lin, col)
INPUT : MatDest : address of MTH2D_tdstMatrix
a : MTH_tdxReal
lin, col : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetMatrixElement( MatDest, a, lin, col) \
if( col==0 ) \
{ if(lin==0){(MatDest)->stCol_0.xX=(a);}else{(MatDest)->stCol_0.xY=(a);}} \
else \
{ if(lin==0){(MatDest)->stCol_1.xX=(a);}else{(MatDest)->stCol_1.xY=(a);}}
/* ##-###########################
## Matrix-Vector operations
############################## */
/* ##M==================================================================================
NAME : MTH2D_M_vMulMatrixVectorWithoutBuffer
DESCRIPTION : Multiply a Matrix to a Vector : VectDest= MatA*VectA, VectDest must be
a other vector
INPUT : VectDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulMatrixVectorWithoutBuffer( VectDest, MatA, VectA) \
{ (VectDest)->xX = MTH_M_xAdd( \
MTH_M_xMul( (MatA)->stCol_0.xX, (VectA)->xX), \
MTH_M_xMul( (MatA)->stCol_1.xX, (VectA)->xY)); \
(VectDest)->xY = MTH_M_xAdd( \
MTH_M_xMul( (MatA)->stCol_0.xY, (VectA)->xX), \
MTH_M_xMul( (MatA)->stCol_1.xY, (VectA)->xY)); }
/* ##M==================================================================================
NAME : MTH2D_M_vMulMatrixVector
DESCRIPTION : Multiply a Matrix to a Vector : VectDest= MatA*VectA
INPUT : VectDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vMulMatrixVector( VectDest, MatA, VectA) \
if( VectA==VectDest ) \
{ \
MTH2D_tdstVector Vtmp; \
\
MTH2D_M_vCopyVector( &Vtmp, VectA); \
MTH2D_M_vMulMatrixVectorWithoutBuffer( VectDest, MatA, &Vtmp); \
} \
else \
{ \
MTH2D_M_vMulMatrixVectorWithoutBuffer( VectDest, MatA, VectA); \
}
/* ##M==================================================================================
NAME : MTH2D_M_vGetColumnInMatrix
DESCRIPTION : Get a Vector column of a Matrix to a Vector : VectDest= columm col of MatA
INPUT : VectDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
col : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetColumnInMatrix( VectDest, MatA, col ) \
if( col==0 ) \
{ (VectDest)->xX=(MatA)->stCol_0.xX; \
(VectDest)->xY=(MatA)->stCol_0.xY; } \
else \
{ (VectDest)->xX=(MatA)->stCol_1.xX; \
(VectDest)->xY=(MatA)->stCol_1.xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetColumnInMatrix
DESCRIPTION : Put a Vector to a column of a Matrix : Set columm col of MatDest with VectA
INPUT : MatDest : address of MTH2D_tdstMatrix
VectA : address of MTH2D_tdstVector
col : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetColumnInMatrix( MatDest, VectA, col) \
if( col==0 ) \
{ (MatDest)->stCol_0.xX=(VectA)->xX; \
(MatDest)->stCol_0.xY=(VectA)->xY; } \
else \
{ (MatDest)->stCol_1.xX=(VectA)->xX; \
(MatDest)->stCol_1.xY=(VectA)->xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vGetLineInMatrix
DESCRIPTION : Get a Vector line of a Matrix to a Vector : VectDest= line lin of MatA
INPUT : VectDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
lin : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetLineInMatrix( VectDest, MatA, lin ) \
if( lin==0 ) \
{ (VectDest)->xX=(MatA)->stCol_0.xX; \
(VectDest)->xY=(MatA)->stCol_1.xX; } \
else \
{ (VectDest)->xX=(MatA)->stCol_0.xY; \
(VectDest)->xY=(MatA)->stCol_1.xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetLineInMatrix
DESCRIPTION : Put a Vector to a line of a Matrix : Set line lin of MatDest with VectA
INPUT : MatDest : address of MTH2D_tdstMatrix
VectA : address of MTH2D_tdstVector
lin : int
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetLineInMatrix( MatDest, VectA, lin) \
if( lin==0 ) \
{ (MatDest)->stCol_0.xX=(VectA)->xX; \
(MatDest)->stCol_1.xX=(VectA)->xY; } \
else \
{ (MatDest)->stCol_0.xY=(VectDest)->xX; \
(MatDest)->stCol_1.xY=(VectDest)->xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vGetDiagInMatrix
DESCRIPTION : Get a Vector diagonal of a Matrix to a Vector : VectDest= diagonal of MatA
INPUT : VectDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetDiagInMatrix( VectDest, MatA) \
{ (VectDest)->xX= (MatA)->stCol_0.xX; \
(VectDest)->xY= (MatA)->stCol_1.xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetDiagInMatrix
DESCRIPTION : Put a Vector to a diagonal of a Matrix : Set diagonal of MatDest with VectA
INPUT : MatDest : address of MTH2D_tdstMatrix
VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetDiagInMatrix( MatDest, VectA) \
{ (MatDest)->stCol_0.xX= (VectA)->xX; \
(MatDest)->stCol_1.xY= (VectA)->xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vGetVectorsInMatrix
DESCRIPTION : Get all column Matrix to two Vectors
INPUT : VaDest, VbDest : address of MTH2D_tdstVector
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vGetVectorsInMatrix( VaDest, VbDest, MatA) \
{ (VaDest)->xX=(MatA)->stCol_0.xX; \
(VaDest)->xY=(MatA)->stCol_0.xY; \
(VbDest)->xX=(MatA)->stCol_1.xX; \
(VbDest)->xY=(MatA)->stCol_1.xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vSetVectorsInMatrix
DESCRIPTION : Set all column Matrix with two Vectors
INPUT : MatDest : address of MTH2D_tdstMatrix
VectA, VectB : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vSetVectorsInMatrix( MatDest, VectA, VectB) \
{ (MatDest)->stCol_0.xX=(VectA)->xX; \
(MatDest)->stCol_0.xY=(VectA)->xY; \
(MatDest)->stCol_1.xX=(VectB)->xX; \
(MatDest)->stCol_1.xY=(VectB)->xY; }
/* ##M==================================================================================
NAME : MTH2D_M_vPrintfVector
DESCRIPTION : Print a Vector : Name + its values
INPUT : Name : string
VectA : address of MTH2D_tdstVector
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vPrintfVector( Name, VectA) \
{ printf("%s = \n |%e", (Name), (VectA)->xX); \
printf("\n |%e\n", (VectA)->xY); }
/* ##M==================================================================================
NAME : MTH2D_M_vPrintfMatrix
DESCRIPTION : Print a Matrix : Name + its values
INPUT : Name : string
MatA : address of MTH2D_tdstMatrix
OUTPUT : void
=======================================================================================*/
#define MTH2D_M_vPrintfMatrix( Name, MatA) \
{ printf("%s = \n |%e %e|", (Name), (MatA)->stCol_0.xX, (MatA)->stCol_1.xX ); \
printf("\n |%e %e|\n", (MatA)->stCol_0.xY, (MatA)->stCol_1.xY ); }
#endif /* MTH2D_H */