diff --git a/Spherical.cpp b/Spherical.cpp index 29d9957..2449a6c 100644 --- a/Spherical.cpp +++ b/Spherical.cpp @@ -13,13 +13,6 @@ Spherical::Spherical() { this->distance = 0; } -// Spherical::Spherical(float polarAngle, float elevationAngle, float distance) -// { -// this->horizontalAngle = polarAngle; -// this->verticalAngle = elevationAngle; -// this->distance = distance; -// } - Spherical::Spherical(Polar polar) { this->horizontalAngle = polar.angle; this->verticalAngle = 0.0F; @@ -32,8 +25,13 @@ Spherical::Spherical(float distance, Angle horizontalAngle, Angle verticalAngle) Spherical::Spherical(Vector3 v) { distance = v.magnitude(); - verticalAngle = 90 - acosf(v.y / distance) * Angle::Rad2Deg; - horizontalAngle = atanf(v.x / v.z) * Angle::Rad2Deg; + if (distance == 0.0f) { + verticalAngle = 0; + horizontalAngle = 0; + } else { + verticalAngle = (90 - acosf(v.y / distance) * Angle::Rad2Deg); + horizontalAngle = atan2f(v.x, v.z) * Angle::Rad2Deg; + } } const Spherical Spherical::zero = Spherical(0.0F, (Angle)0.0F, (Angle)0.0F); diff --git a/test/Spherical_test.cc b/test/Spherical_test.cc index ac1f24a..973bac0 100644 --- a/test/Spherical_test.cc +++ b/test/Spherical_test.cc @@ -36,7 +36,7 @@ TEST(Spherical, ToVector3) { Vector3 r = s.ToVector3(); EXPECT_FLOAT_EQ(r.x, 0.0F) << "toVector3.x 0 0 1"; - EXPECT_FLOAT_EQ(r.y, 0.0F) << "toVector3.y 0 0 1"; + EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 0 0 1"; EXPECT_FLOAT_EQ(r.z, 1.0F) << "toVector3.z 0 0 1"; v = Vector3(0, 1, 0); @@ -52,41 +52,48 @@ TEST(Spherical, ToVector3) { r = s.ToVector3(); EXPECT_FLOAT_EQ(r.x, 1.0F) << "toVector3.x 1 0 0"; - EXPECT_FLOAT_EQ(r.y, 0.0F) << "toVector3.y 1 0 0"; + EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 1 0 0"; EXPECT_NEAR(r.z, 0.0F, 1.0e-06) << "toVector3.z 1 0 0"; } TEST(Spherical, Incident1) { Vector3 v = Vector3(2.242557f, 1.027884f, -0.322347f); Spherical s = Spherical(v); - Vector3 r = s.ToVector3(); - EXPECT_NEAR(r.x, v.x, 1.0e-06) << "toVector3.x 1 0 0"; - EXPECT_NEAR(r.y, v.y, 1.0e-06) << "toVector3.y 1 0 0"; - EXPECT_NEAR(r.z, v.z, 1.0e-06) << "toVector3.z 1 0 0"; + Spherical sr = Spherical(2.49F, 98.18f, 24.4F); + EXPECT_NEAR(s.distance, sr.distance, 1.0e-01); + EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-02); + EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-02); + + Vector3 r = sr.ToVector3(); + EXPECT_NEAR(r.x, v.x, 1.0e-02) << "toVector3.x 1 0 0"; + EXPECT_NEAR(r.y, v.y, 1.0e-02) << "toVector3.y 1 0 0"; + EXPECT_NEAR(r.z, v.z, 1.0e-02) << "toVector3.z 1 0 0"; } TEST(Spherical, Incident2) { Vector3 v = Vector3(1.0f, 0.0f, 1.0f); Spherical s = Spherical(v); - Vector3 r = s.ToVector3(); - EXPECT_NEAR(s.distance, 1.4142135623F, 1.0e-05); - EXPECT_NEAR(s.horizontalAngle, 45.0F, 1.0e-05); - EXPECT_NEAR(s.verticalAngle, 0.0F, 1.0e-05); + Spherical sr = Spherical(1.4142135623F, 45.0f, 0.0F); + EXPECT_NEAR(s.distance, sr.distance, 1.0e-05); + EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05); + EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05); + Vector3 r = sr.ToVector3(); EXPECT_NEAR(r.x, v.x, 1.0e-06); EXPECT_NEAR(r.y, v.y, 1.0e-06); EXPECT_NEAR(r.z, v.z, 1.0e-06); v = Vector3(0.0f, 1.0f, 1.0f); s = Spherical(v); - r = s.ToVector3(); - EXPECT_NEAR(s.distance, 1.4142135623F, 1.0e-05); - EXPECT_NEAR(s.horizontalAngle, 0.0F, 1.0e-05); - EXPECT_NEAR(s.verticalAngle, 45.0F, 1.0e-05); + sr = Spherical(1.4142135623F, 0.0f, 45.0F); + EXPECT_NEAR(s.distance, sr.distance, 1.0e-05); + EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05); + EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05); + r = sr.ToVector3(); EXPECT_NEAR(r.x, v.x, 1.0e-06); EXPECT_NEAR(r.y, v.y, 1.0e-06); EXPECT_NEAR(r.z, v.z, 1.0e-06); @@ -95,9 +102,9 @@ TEST(Spherical, Incident2) { s = Spherical(v); r = s.ToVector3(); - EXPECT_NEAR(s.distance, 1.73205080F, 1.0e-06); + EXPECT_NEAR(s.distance, 1.73205080F, 1.0e-02); EXPECT_NEAR(s.horizontalAngle, 45.0F, 1.0e-02); - // EXPECT_NEAR(s.verticalAngle, 35.26F, 1.0e-06); + EXPECT_NEAR(s.verticalAngle, 35.26F, 1.0e-02); EXPECT_NEAR(r.x, v.x, 1.0e-06); EXPECT_NEAR(r.y, v.y, 1.0e-06);