X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fcartesian.h;h=ffc91c2fd62fd709e32d12c6885c78e156dc663c;hb=6ae4f104371ed433a79c8845de97428d964edd8b;hp=67f8f0629cc53a834cdfcb97d9f4740ffc53e6bf;hpb=e50bd9e6530d6c708a4b259de6ef19e0fc6b97c0;p=ardour.git diff --git a/libs/pbd/pbd/cartesian.h b/libs/pbd/pbd/cartesian.h index 67f8f0629c..ffc91c2fd6 100644 --- a/libs/pbd/pbd/cartesian.h +++ b/libs/pbd/pbd/cartesian.h @@ -19,9 +19,86 @@ #ifndef __libpbd_cartesian_h__ #define __libpbd_cartesian_h__ +#include +#include + namespace PBD { - void azi_ele_to_cart (double azi, double ele, double& x, double& y, double& z); - void cart_to_azi_ele (double x, double y, double z, double& azi, double& ele); + +void spherical_to_cartesian (double azi, double ele, double len, double& x, double& y, double& z); +void cartesian_to_spherical (double x, double y, double z, double& azi, double& ele, double& len); + +struct AngularVector; + +struct CartesianVector { + double x; + double y; + double z; + + CartesianVector () : x(0.0), y(0.0), z(0.0) {} + CartesianVector (double xp, double yp, double zp = 0.0) : x(xp), y(yp), z(zp) {} + + CartesianVector& translate (CartesianVector& other, double xtranslate, double ytranslate, double ztranslate = 0.0) { + other.x += xtranslate; + other.y += ytranslate; + other.z += ztranslate; + return other; + } + + CartesianVector& scale (CartesianVector& other, double xscale, double yscale, double zscale = 1.0) { + other.x *= xscale; + other.y *= yscale; + other.z *= zscale; + return other; + } + + void angular (AngularVector&) const; +}; + +struct AngularVector { + double azi; + double ele; + double length; + + AngularVector () : azi(0.0), ele(0.0), length (0.0) {} + AngularVector (double a, double e, double l = 1.0) : azi(a), ele(e), length (l) {} + + AngularVector operator- (const AngularVector& other) const { + AngularVector r; + r.azi = azi - other.azi; + r.ele = ele - other.ele; + r.length = length - other.length; + return r; + } + + AngularVector operator+ (const AngularVector& other) const { + AngularVector r; + r.azi = azi + other.azi; + r.ele = ele + other.ele; + r.length = length + other.length; + return r; + } + + bool operator== (const AngularVector& other) const { + return fabs (azi - other.azi) <= FLT_EPSILON && + fabs (ele - other.ele) <= FLT_EPSILON && + fabs (length - other.length) <= FLT_EPSILON; + } + + bool operator!= (const AngularVector& other) const { + return fabs (azi - other.azi) > FLT_EPSILON || + fabs (ele - other.ele) > FLT_EPSILON || + fabs (length - other.length) > FLT_EPSILON; + } + + void cartesian (CartesianVector& c) const { + spherical_to_cartesian (azi, ele, length, c.x, c.y, c.z); + } +}; + +inline void CartesianVector::angular (AngularVector& a) const { + cartesian_to_spherical (x, y, z, a.azi, a.ele, a.length); +} + } #endif /* __libpbd_cartesian_h__ */