diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-11-23 16:38:17 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-11-23 16:38:17 +0000 |
commit | 1b2b21169c78fcc02759e4556c4d582f605490d4 (patch) | |
tree | a4bfe1298bbb7a4eafdb8f057735465379a7a660 /libs/pbd/cartesian.cc | |
parent | e6665809fb0bc6cbfa524ee359ef565cb7b89586 (diff) |
semi-functioning vbap panning, still not done
git-svn-id: svn://localhost/ardour2/branches/3.0@8074 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/cartesian.cc')
-rw-r--r-- | libs/pbd/cartesian.cc | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/libs/pbd/cartesian.cc b/libs/pbd/cartesian.cc index 0a84fa6bbc..fe7bf29acf 100644 --- a/libs/pbd/cartesian.cc +++ b/libs/pbd/cartesian.cc @@ -17,13 +17,18 @@ */ #include <iostream> -#include <cmath> +#include <math.h> #include "pbd/cartesian.h" +using namespace std; + void PBD::azi_ele_to_cart (double azi, double ele, double& x, double& y, double& z) { + /* convert from cylindrical coordinates in degrees to cartesian */ + static const double atorad = 2.0 * M_PI / 360.0 ; + x = cos (azi * atorad) * cos (ele * atorad); y = sin (azi * atorad) * cos (ele * atorad); z = sin (ele * atorad); @@ -32,7 +37,8 @@ PBD::azi_ele_to_cart (double azi, double ele, double& x, double& y, double& z) void PBD::cart_to_azi_ele (double x, double y, double z, double& azimuth, double& elevation) { - /* converts cartesian coordinates to angular */ + /* converts cartesian coordinates to cylindrical in degrees*/ + const double atorad = 2.0 * M_PI / 360.0; double atan_y_per_x, atan_x_pl_y_per_z; double distance; @@ -40,13 +46,15 @@ PBD::cart_to_azi_ele (double x, double y, double z, double& azimuth, double& ele if(x == 0.0) { atan_y_per_x = M_PI / 2; } else { - atan_y_per_x = atan (y/x); + atan_y_per_x = atan2 (y,x); } - azimuth = atan_y_per_x / atorad; - - if (x < 0.0) { - azimuth += 180.0; + if (y < 0.0) { + /* below x-axis: atan2 returns 0 .. -PI (negative) so convert to degrees and ADD to 180 */ + azimuth = 180.0 + (atan_y_per_x / (M_PI/180.0) + 180.0); + } else { + /* above x-axis: atan2 returns 0 .. +PI so convert to degrees */ + azimuth = atan_y_per_x / atorad; } distance = sqrt (x*x + y*y); @@ -54,21 +62,19 @@ PBD::cart_to_azi_ele (double x, double y, double z, double& azimuth, double& ele if (z == 0.0) { atan_x_pl_y_per_z = 0.0; } else { - atan_x_pl_y_per_z = atan (z/distance); + atan_x_pl_y_per_z = atan2 (z,distance); } if (distance == 0.0) { if (z < 0.0) { atan_x_pl_y_per_z = -M_PI/2.0; - } else { + } else if (z > 0.0) { atan_x_pl_y_per_z = M_PI/2.0; } } elevation = atan_x_pl_y_per_z / atorad; - std::cerr << x << ", " << y << ", " << z << " = " << azimuth << " /= " << elevation << std::endl; - // distance = sqrtf (x*x + y*y + z*z); } |