1997-05-31 03:25:54 +08:00
|
|
|
/* #include "HEADERS.h" */
|
|
|
|
/* Copyright 1988, Brown Computer Graphics Group. All Rights Reserved. */
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------------
|
|
|
|
* This file contains routines that operate solely on matrices.
|
|
|
|
* -------------------------------------------------------------------------*/
|
|
|
|
|
1998-04-09 07:35:37 +08:00
|
|
|
|
1998-04-24 08:43:12 +08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
1998-04-09 07:35:37 +08:00
|
|
|
|
1998-01-06 09:20:19 +08:00
|
|
|
#ifdef WIN32
|
1998-11-24 05:46:36 +08:00
|
|
|
# ifndef HAVE_STL_SGI_PORT
|
1999-04-23 02:46:27 +08:00
|
|
|
# ifdef __BORLANDC__
|
|
|
|
# include <mem.h>
|
|
|
|
# else
|
|
|
|
# include <memory.h> /* required for memset() and memcpy() */
|
|
|
|
# endif
|
1998-11-24 05:46:36 +08:00
|
|
|
# endif
|
1998-01-06 09:20:19 +08:00
|
|
|
#endif
|
|
|
|
|
1998-02-04 07:20:27 +08:00
|
|
|
#include <string.h>
|
|
|
|
#include <Math/mat3defs.h>
|
|
|
|
|
1998-12-08 05:09:52 +08:00
|
|
|
MAT3mat identityMatrix = {
|
|
|
|
{ 1.0, 0.0, 0.0, 0.0 },
|
|
|
|
{ 0.0, 1.0, 0.0, 0.0 },
|
|
|
|
{ 0.0, 0.0, 1.0, 0.0 },
|
|
|
|
{ 0.0, 0.0, 0.0, 1.0 }
|
|
|
|
};
|
1998-01-31 08:43:18 +08:00
|
|
|
|
1997-05-31 03:25:54 +08:00
|
|
|
/* #include "macros.h" */
|
|
|
|
|
|
|
|
/* -------------------------- Static Routines ---------------------------- */
|
|
|
|
|
|
|
|
/* ------------------------- Internal Routines --------------------------- */
|
|
|
|
|
|
|
|
/* -------------------------- Public Routines ---------------------------- */
|
|
|
|
|
|
|
|
|
1998-08-25 04:04:08 +08:00
|
|
|
#if !defined( USE_XTRA_MAT3_INLINES )
|
|
|
|
|
1997-05-31 03:25:54 +08:00
|
|
|
/*
|
|
|
|
* This multiplies two matrices, producing a third, which may the same as
|
|
|
|
* either of the first two.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
1998-01-20 02:40:33 +08:00
|
|
|
MAT3mult (double (*result_mat)[4], register double (*mat1)[4], register double (*mat2)[4])
|
1997-05-31 03:25:54 +08:00
|
|
|
{
|
|
|
|
register int i, j;
|
|
|
|
MAT3mat tmp_mat;
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
for (j = 0; j < 4; j++)
|
|
|
|
tmp_mat[i][j] = (mat1[i][0] * mat2[0][j] +
|
|
|
|
mat1[i][1] * mat2[1][j] +
|
|
|
|
mat1[i][2] * mat2[2][j] +
|
|
|
|
mat1[i][3] * mat2[3][j]);
|
|
|
|
MAT3copy (result_mat, tmp_mat);
|
|
|
|
}
|
1998-08-25 04:04:08 +08:00
|
|
|
#endif // !defined( USE_XTRA_MAT3_INLINES )
|
1997-05-31 03:25:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This returns the transpose of a matrix. The result matrix may be
|
|
|
|
* the same as the one to transpose.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
1998-01-20 02:40:33 +08:00
|
|
|
MAT3transpose (double (*result_mat)[4], register double (*mat)[4])
|
1997-05-31 03:25:54 +08:00
|
|
|
{
|
|
|
|
register int i, j;
|
|
|
|
MAT3mat tmp_mat;
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
for (j = 0; j < 4; j++)
|
|
|
|
tmp_mat[i][j] = mat[j][i];
|
|
|
|
|
|
|
|
MAT3copy (result_mat, tmp_mat);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This prints the given matrix to the given file pointer.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
1998-01-20 02:40:33 +08:00
|
|
|
MAT3print(double (*mat)[4], FILE *fp)
|
1997-05-31 03:25:54 +08:00
|
|
|
{
|
|
|
|
MAT3print_formatted(mat, fp, CNULL, CNULL, CNULL, CNULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This prints the given matrix to the given file pointer.
|
|
|
|
* use the format string to pass to fprintf. head and tail
|
|
|
|
* are printed at the beginning and end of each line.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
1998-01-20 02:40:33 +08:00
|
|
|
MAT3print_formatted(double (*mat)[4], FILE *fp, char *title, char *head, char *format, char *tail)
|
1997-05-31 03:25:54 +08:00
|
|
|
{
|
|
|
|
register int i, j;
|
|
|
|
|
|
|
|
/* This is to allow this to be called easily from a debugger */
|
|
|
|
if (fp == NULL) fp = stderr;
|
|
|
|
|
|
|
|
if (title == NULL) title = "MAT3 matrix:\n";
|
|
|
|
if (head == NULL) head = " ";
|
|
|
|
if (format == NULL) format = "%#8.4lf ";
|
|
|
|
if (tail == NULL) tail = "\n";
|
|
|
|
|
|
|
|
(void) fprintf(fp, title);
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
|
(void) fprintf(fp, head);
|
|
|
|
for (j = 0; j < 4; j++) (void) fprintf(fp, format, mat[i][j]);
|
|
|
|
(void) fprintf(fp, tail);
|
|
|
|
}
|
|
|
|
}
|