|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 2974 (0xb9e)
Types: TextFile
Names: »mutils.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/mutils.c«
/*
* Spacewar - matrix, vector, and trig routines
*
* Copyright 1985 obo Systems, Inc.
* Copyright 1985 Dan Rosenblatt
*/
#include "spacewar.h"
VOID unity(mtrx)
double mtrx[3][3];
{
minit(mtrx);
mtrx[0][0] = 1.0;
mtrx[1][1] = 1.0;
mtrx[2][2] = 1.0;
}
VOID matmul(amtrx,bmtrx,cmtrx)
double amtrx[3][3],bmtrx[3][3],cmtrx[3][3];
{
double tmp,tmpmtrx[3][3];
int i,j,k;
for (i=0;i<3;++i)
for (j=0;j<3;++j) {
tmp = 0.0;
for (k=0;k<3;++k)
tmp = ADD(tmp,MUL(amtrx[k][j],bmtrx[i][k]));
tmpmtrx[i][j] = tmp;
}
mcopy(cmtrx,tmpmtrx);
}
VOID vecmul(avec,bmtrx,cvec)
double avec[3],bmtrx[3][3],cvec[3];
{
double tmp,tmpvec[3];
int i,j;
for (i=0;i<3;++i) {
tmp = 0.0;
for (j=0;j<3;++j)
tmp = ADD(tmp,MUL(avec[j],bmtrx[i][j]));
tmpvec[i] = tmp;
}
vcopy(cvec,tmpvec);
}
VOID xrot(rotmtrx,rotangl)
double rotmtrx[3][3],rotangl;
{
double tmpmtrx[3][3];
minit(tmpmtrx);
tmpmtrx[1][1] = tmpmtrx[2][2] = COS(rotangl);
tmpmtrx[1][2] = NEG(tmpmtrx[2][1] = SIN(rotangl));
tmpmtrx[0][0] = 1.0;
matmul(rotmtrx,tmpmtrx,rotmtrx);
}
VOID yrot(rotmtrx,rotangl)
double rotmtrx[3][3],rotangl;
{
double tmpmtrx[3][3];
minit(tmpmtrx);
tmpmtrx[0][0] = tmpmtrx[2][2] = COS(rotangl);
tmpmtrx[2][0] = NEG(tmpmtrx[0][2] = SIN(rotangl));
tmpmtrx[1][1] = 1.0;
matmul(rotmtrx,tmpmtrx,rotmtrx);
}
VOID zrot(rotmtrx,rotangl)
double rotmtrx[3][3],rotangl;
{
double tmpmtrx[3][3];
minit(tmpmtrx);
tmpmtrx[0][0] = tmpmtrx[1][1] = COS(rotangl);
tmpmtrx[0][1] = NEG(tmpmtrx[1][0] = SIN(rotangl));
tmpmtrx[2][2] = 1.0;
matmul(rotmtrx,tmpmtrx,rotmtrx);
}
VOID sptort(spvec,rtvec)
double spvec[3],rtvec[3];
{
double sin2,tmpvec[3];
sin2 = SIN(spvec[2]);
tmpvec[0] = MUL(spvec[0],MUL(COS(spvec[1]),sin2));
tmpvec[1] = MUL(spvec[0],MUL(SIN(spvec[1]),sin2));
tmpvec[2] = MUL(spvec[0],COS(spvec[2]));
vcopy(rtvec,tmpvec);
}
double xatan2(x,y)
double x,y;
{
if (x == 0. && y == 0.)
return(0.);
else
return(ATAN2(x,y));
}
VOID rttosp(rtvec,spvec)
double rtvec[3],spvec[3];
{
double tmp,tmpvec[3];
tmp = ADD(SQUARE(rtvec[0]),SQUARE(rtvec[1]));
tmpvec[0] = SQRT(ADD(tmp,SQUARE(rtvec[2])));
tmpvec[1] = FMOD(ADD(xatan2(rtvec[1],rtvec[0]),TWOPI),TWOPI);
tmpvec[2] = FMOD(ADD(xatan2(SQRT(tmp),rtvec[2]),TWOPI),TWOPI);
vcopy(spvec,tmpvec);
}
VOID vdiff(avec,bvec,cvec)
register double *avec,*bvec,*cvec;
{
register int i;
for (i=0;i++<3;)
*cvec++ = *avec++ - *bvec++;
}
double vdist(avec,bvec)
double avec[3],bvec[3];
{
double tmp,sumsqr=0.;
int i;
for (i=0;i<3;++i) {
tmp = SUB(avec[i],bvec[i]);
sumsqr = ADD(sumsqr,SQUARE(tmp));
}
return(SQRT(sumsqr));
}
double vlen(avec)
double avec[3];
{
double sumsqr;
sumsqr = SQUARE(avec[0]);
sumsqr = ADD(sumsqr,SQUARE(avec[1]));
sumsqr = ADD(sumsqr,SQUARE(avec[2]));
return(SQRT(sumsqr));
}
#if defined(NEEDFMOD)
double fmod(arg1,arg2)
double arg1,arg2;
{
double tmp;
while ((tmp = SUB(arg1,arg2)) >= 0.)
arg1 = tmp;
return(arg1);
}
#endif