mirror of
https://github.com/pybricks/ldraw.git
synced 2025-04-11 02:09:44 +02:00
325 lines
4.9 KiB
C
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;
|
|
}
|
|
}
|
|
}
|
|
}
|