V3 v3diff(V3 v1, V3 v2) { if (v3GetType(v1) == SPHERICAL) { v1 = v3s2c(v1); } if (v3GetType(v2) == SPHERICAL) { v2 = v3s2c(v2); } v3DecX(v1, v3GetX(v2)); v3DecY(v1, v3GetY(v2)); v3DecZ(v1, v3GetZ(v2)); return(v1); }
V6 v32v6(V3 v3) { V6 v6; v6 = v6init(v3GetType(v3)); v6SetPos(v6, v3); return(v6); }
double v3mod(V3 v) { double x = 0.0; if (v3GetType(v) == SPHERICAL) { x = fabs(v3GetR(v)); } else { x += v3GetX(v) * v3GetX(v); x += v3GetY(v) * v3GetY(v); x += v3GetZ(v) * v3GetZ(v); x = sqrt(x); } return(x); }
V3 m3v3(M3 m, V3 v1) { int row, col; V3 v2; if (v3GetType(v1) == SPHERICAL) { v1 = v3s2c(v1); } v2 = v3init(CARTESIAN); for (row = 0; row < 3; row++) { for (col = 0; col < 3; col++) { v2.v[row] += m.m[row][col] * v1.v[col]; } } return(v2); }
V3 v3s2c(V3 vs) { double rcosd; V3 vc; if (v3GetType(vs) == CARTESIAN) { return(vs); } vc = v3init(CARTESIAN); rcosd = R*cos(D); v3SetX(vc, rcosd*cos(A)); v3SetY(vc, rcosd*sin(A)); v3SetZ(vc, R*sin(D)); return(vc); }
char * v3fmt(V3 v) { char *p; /* get a buffer */ p = v3buf[nxtv3buf++]; nxtv3buf %= NV3BUF; if (v3GetType(v) == CARTESIAN) { (void)sprintf(p, "%22.15e %22.15e %22.15e", v3GetX(v), v3GetY(v), v3GetZ(v)); } else { (void)sprintf(p, "%22.15e %22.15e %22.15e", v3GetR(v), v3GetAlpha(v), v3GetDelta(v)); } return(p); }
double v3alpha(V3 v) { double alpha; if (v3GetType(v) == CARTESIAN) { v = v3c2s(v); } alpha = v3GetAlpha(v); if (v3GetR(v) < 0.0) { alpha += M_PI; } if (alpha < 0.0) { alpha += ceil(alpha / (-2 * M_PI)) * (2 * M_PI); } if (alpha >= (2 * M_PI)) { alpha -= floor(alpha / (2 * M_PI)) * (2 * M_PI); } return(alpha); }