Example #1
0
 /*
  * 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;
}
Example #2
0
 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) );
 }
Example #3
0
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);
}
Example #4
0
 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;
 }