Remove unused function PBD::sys::extension
[ardour.git] / libs / pbd / pbd / cartesian.h
index 67f8f0629cc53a834cdfcb97d9f4740ffc53e6bf..ffc91c2fd62fd709e32d12c6885c78e156dc663c 100644 (file)
 #ifndef __libpbd_cartesian_h__
 #define __libpbd_cartesian_h__
 
+#include <cfloat>
+#include <cmath>
+
 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__ */