/* * Transforms a spherical vector from 'spb' to 'spe' into an inverse Euler * transformation. Returns true if the transformation was successful. */ static bool spherevector_to_euler_inv(SEuler *se, const SPoint *spb, const SPoint *spe) { if (spoint_eq(spb, spe)) { return false; } else { Vector3D vbeg, vend, vtmp; SPoint spt[2]; SEuler set; spoint_vector3d(&vbeg, spb); spoint_vector3d(&vend, spe); vector3d_cross(&vtmp, &vbeg, &vend); vector3d_spoint(&spt[0], &vtmp); set.phi = -spt[0].lng - PIH; set.theta = spt[0].lat - PIH; set.psi = 0.0; seuler_set_zxz(&set); euler_spoint_trans(&spt[1], spb, &set); set.psi = -spt[1].lng; memcpy((void *) se, (void *) &set, sizeof(SEuler)); } return true; }
Datum spheretrans_from_float8 (PG_FUNCTION_ARGS) { SEuler * se = ( SEuler * ) MALLOC ( sizeof ( SEuler ) ) ; se->phi = PG_GETARG_FLOAT8( 0 ); se->theta = PG_GETARG_FLOAT8( 1 ); se->psi = PG_GETARG_FLOAT8( 2 ); seuler_set_zxz( se ); PG_RETURN_POINTER( spheretrans_check(se) ); }
Datum sphereline_out(PG_FUNCTION_ARGS) { SLine *sl = (SLine *) PG_GETARG_POINTER(0); char *out = (char *) palloc(255); char *tstr = NULL; SEuler se; unsigned int rdeg, rmin; double rsec; rdeg = rmin = 0; rsec = 0.0; seuler_set_zxz(&se); se.phi = sl->phi; se.theta = sl->theta; se.psi = sl->psi; tstr = DatumGetPointer(DirectFunctionCall1(spheretrans_out, PointerGetDatum(&se))); switch (sphere_output) { case OUTPUT_DEG: sprintf(out, "( %s ), %.*gd", tstr, sphere_output_precision, RADIANS * sl->length ); break; case OUTPUT_HMS: case OUTPUT_DMS: rad_to_dms(sl->length, &rdeg, &rmin, &rsec); sprintf(out, "( %s ), %2ud %2um %.*gs", tstr, rdeg, rmin, sphere_output_precision, rsec); break; default: sprintf(out, "( %s ), %.*g", tstr, sphere_output_precision, sl->length ); break; } PG_RETURN_CSTRING(out); }
SEuler * strans_zxz( SEuler * ret , const SEuler * se ) { if ( se->phi_a == EULER_AXIS_Z && se->theta_a == EULER_AXIS_X && se->psi_a == EULER_AXIS_Z ){ memcpy( (void*) ret, (void*) se, sizeof( SEuler ) ); } else { static SEuler tmp; tmp.psi = 0.0; tmp.theta = 0.0; tmp.phi = 0.0; seuler_set_zxz( &tmp ); seuler_trans_zxz ( ret, se, &tmp ); } return ret; }