// vector.c // // This file supports three-dimensional vector and matrix operations. // // by John D. de Boer // For all procedures in this file, two or more parameters of the same type may // safely have repeated arguments. // Vector functions typedef struct { real x,y,z; } vector; void zerovector(vector *V); void setvector(vector *V, real X, real Y, real Z); void scalevector(vector *V, real M); real lengthsquared(const vector *V); real vectorlength(const vector *V); void vectorsum(const vector *A, const vector *B, vector *Sum); void vectordifference(const vector *A, const vector *B, vector *Diff); real differencesquared(const vector *A, const vector *B); void vectorincr(vector *A, const vector *B); void vectordecr(vector *A, const vector *B); void vectorincrement(vector *A, real F, const vector *B); void vectormean(const vector *A, const vector *B, vector *M); void vectorcomb(const vector *A, real F, const vector *B, vector *M); real dotproduct(const vector *A, const vector *B); void crossproduct(const vector *A, const vector *B, vector *C); void normalise(vector *V); // Polar vectors typedef struct { real r, // radius theta, // polar angle phi; // azimuthal angle } polar; void vectortopolar(const vector *V, polar *R); void polartovector(const polar *R, vector *V); void cartesiantopolar(const vector *V, real *Rad, real *Theta, real *Phi); void polartocartesian(real Rad, real Theta, real Phi, vector *V); void unitvector(real Theta, real Phi, vector *U); // Simple rotations void rotx090(vector *V); void rotx180(vector *V); void rotx270(vector *V); void roty090(vector *V); void roty180(vector *V); void roty270(vector *V); void rotz090(vector *V); void rotz180(vector *V); void rotz270(vector *V); void rotx(vector *V, real Theta); void roty(vector *V, real Theta); void rotz(vector *V, real Theta); // Bounds typedef struct { real x1,x2,y1,y2,z1,z2; } cuboid; void initcuboid(cuboid *C, const vector *V); void stretchcuboid(cuboid *C, const vector *V); void unioncuboid(cuboid *C, const cuboid *D); // Matrix functions typedef struct { real xx,xy,xz,yx,yy,yz,zx,zy,zz; } matrix; void identitymatrix(matrix *T); void transposematrix(matrix *T); void product(const matrix *R, const vector *A, vector *B); void matrixproduct(const matrix *R2, const matrix *R1, matrix *R); // Rotation matrices void xrotation(real Theta, matrix *R); void yrotation(real Theta, matrix *R); void zrotation(real Theta, matrix *R); void eulermatrix(real Precession, real Nutation, real Body, matrix *R); void invertrotation(matrix *R); void rotationinverse(const matrix *R, matrix *R1); void rotatevector(const matrix *R, vector *V); void unrotatevector(const matrix *R, vector *V); void rotatematrix(const matrix *R, matrix *T); void unrotatematrix(const matrix *R, matrix *T);