ldraw/lsynth/src/mathlib.c
2020-09-20 16:38:05 +02:00

325 lines
4.9 KiB
C

#include "math.h"
#include "mathlib.h"
void
vectorcp(
PRECISION dst[3],
PRECISION src[3])
{
int i;
for (i = 0; i < 3; i++) {
dst[i] = src[i];
}
}
void
vectoradd3(
PRECISION dst[3],
PRECISION lft[3],
PRECISION rht[3])
{
int i;
for (i = 0; i < 3; i++) {
dst[i] = lft[i] + rht[i];
}
}
void
vectoradd(
PRECISION dst[3],
PRECISION src[3])
{
int i;
for (i = 0; i < 3; i++) {
dst[i] += src[i];
}
}
void
vectorsub3(
PRECISION dst[3],
PRECISION lft[3],
PRECISION rht[3])
{
int i;
for (i = 0; i < 3; i++) {
dst[i] = lft[i] - rht[i];
}
}
void
vectorsub(
PRECISION dst[3],
PRECISION src[3])
{
int i;
for (i = 0; i < 3; i++) {
dst[i] -= src[i];
}
}
PRECISION
vectorlen(
PRECISION vect[3])
{
PRECISION len = 0;
int i;
for (i = 0; i < 3; i++) {
len += vect[i]*vect[i];
}
return sqrt(len);
}
void
vectorrot3(
PRECISION t[3],
PRECISION r[3],
PRECISION m[3][3])
{
#if 0
t[0] = r[0]*m[0][0] + r[1]*m[1][0] + r[2]*m[2][0];
t[1] = r[0]*m[0][1] + r[1]*m[1][1] + r[2]*m[2][1];
t[2] = r[0]*m[0][2] + r[1]*m[1][2] + r[2]*m[2][2];
#else
t[0] = r[0]*m[0][0] + r[1]*m[0][1] + r[2]*m[0][2];
t[1] = r[0]*m[1][0] + r[1]*m[1][1] + r[2]*m[1][2];
t[2] = r[0]*m[2][0] + r[1]*m[2][1] + r[2]*m[2][2];
#endif
}
void
vectorrot(
PRECISION loc[3],
PRECISION m[3][3])
{
PRECISION t[3];
vectorrot3(t,loc,m);
loc[0] = t[0];
loc[1] = t[1];
loc[2] = t[2];
}
void
matrixcp(
PRECISION dst[3][3],
PRECISION src[3][3])
{
int i,j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
dst[i][j] = src[i][j];
}
}
}
int
matrixeq(
PRECISION dst[3][3],
PRECISION src[3][3])
{
int i,j,rc = 1;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
rc &= fabs(dst[i][j] - src[i][j]) < 0.0001;
}
}
return rc;
}
void
matrixneg(
PRECISION dst[3][3],
PRECISION src[3][3])
{
int i,j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
dst[i][j] = -src[i][j];
}
}
}
void
matrixadd3(
PRECISION dst[3][3],
PRECISION lft[3][3],
PRECISION rht[3][3])
{
int i,j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
dst[i][j] = lft[i][j] + rht[i][j];
}
}
}
void
matrixadd(
PRECISION dst[3][3],
PRECISION src[3][3])
{
int i,j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
dst[i][j] += src[i][j];
}
}
}
void
matrixmult3(
PRECISION res[3][3],
PRECISION lft[3][3],
PRECISION rht[3][3])
{
int i,j,k;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
res[i][j] = 0.0;
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
for (k = 0; k < 3; k++) {
res[i][j] += lft[i][k] * rht[k][j];
}
}
}
}
void
matrixmult(
PRECISION res[3][3],
PRECISION src[3][3])
{
PRECISION t[3][3];
matrixcp(t,res);
matrixmult3(res,t,src);
}
void
matrixinv2(
PRECISION inv[3][3],
PRECISION src[3][3])
{
int i;
PRECISION tmp[3][3];
for (i = 0; i < 3; i++) {
int j;
for (j = 0; j < 3; j++) {
inv[i][j] = 0;
}
inv[i][i] = 1;
}
matrixcp(tmp,src);
for (i = 0; i < 3; i++) {
int j;
PRECISION l;
l = tmp[i][i];
if (l == 0) {
break;
} else {
int a;
for (j = 0; j <= 3-1; j++) {
tmp[i][j] /= l;
inv[i][j] /= l;
}
for (a = 0; a < 3; a++) {
if ((a-i) != 0) {
PRECISION b;
b = tmp[a][i];
for (j = 0; j < 3; j++) {
tmp[a][j] -= b*tmp[i][j];
inv[a][j] -= b*inv[i][j];
}
}
}
}
}
}
void
matrixinv(
PRECISION a[3][3],
PRECISION src[3][3])
{
int i,j,k;
int p[3];
PRECISION h,q,s,sup,pivot;
matrixcp(a,src);
for (k = 0; k < 3; k++) {
sup = 0.0;
p[k] = 0;
for (i = k; i < 3; i++) {
s = 0.0;
for (j = k; j < 3; j++) {
s += fabs(a[i][j]);
}
q = fabs(a[i][k])/s;
if (sup < q) {
sup = q;
p[k] = i;
}
}
if (sup == 0.0) {
return;
}
if (p[k] != k) {
for (j = 0; j < 3; j++) {
h = a[k][j];
a[k][j] = a[p[k]][j];
a[p[k]][j] = h;
}
}
pivot = a[k][k];
for (j = 0; j < 3; j++) {
if (j != k) {
a[k][j] = -a[k][j] / pivot;
for (i = 0; i < 3; i++) {
if (i != k) {
a[i][j] += a[i][k] * a[k][j];
}
}
}
}
for (i = 0; i < 3; i++) {
a[i][k] /= pivot;
}
a[k][k] = 1/pivot;
}
for (k = 3 - 1; k >= 0; k--) {
if (p[k] != k) {
for (i = 0; i < 3; i++) {
h = a[i][k];
a[i][k] = a[i][p[k]];
a[i][p[k]] = h;
}
}
}
}