summaryrefslogtreecommitdiff
path: root/libs/pbd/cartesian.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-11-23 16:38:17 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-11-23 16:38:17 +0000
commit1b2b21169c78fcc02759e4556c4d582f605490d4 (patch)
treea4bfe1298bbb7a4eafdb8f057735465379a7a660 /libs/pbd/cartesian.cc
parente6665809fb0bc6cbfa524ee359ef565cb7b89586 (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.cc28
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);
}