construct Angles from Vector(s)
authorNicola Baldo <nbaldo@cttc.es>
Thu, 05 Jan 2012 13:31:32 +0100
changeset 7833 01af070bb92d
parent 7832 efa48ada840f
child 7834 73891a3aed72
construct Angles from Vector(s)
src/antenna/model/antenna-model.cc
src/antenna/model/antenna-model.h
src/antenna/test/test-angles.cc
src/antenna/wscript
--- a/src/antenna/model/antenna-model.cc	Thu Jan 05 11:46:58 2012 +0100
+++ b/src/antenna/model/antenna-model.cc	Thu Jan 05 13:31:32 2012 +0100
@@ -81,5 +81,19 @@
 {
 }
 
+
+AntennaModel::Angles::Angles (Vector v)
+  : phi (atan2 (v.y, v.x)),
+    theta (acos (v.z / sqrt (v.x*v.x + v.y*v.y + v.z*v.z)))
+{
 }
 
+AntennaModel::Angles::Angles (Vector v, Vector o)
+  : phi (atan2 (v.y - o.y, v.x - o.x)),
+    theta (acos ((v.z - o.z) / CalculateDistance (v, o)))
+{
+}
+
+
+}
+
--- a/src/antenna/model/antenna-model.h	Thu Jan 05 11:46:58 2012 +0100
+++ b/src/antenna/model/antenna-model.h	Thu Jan 05 13:31:32 2012 +0100
@@ -105,10 +105,20 @@
      * this constructor will initialize phi and theta by converting the
      * given 3D vector from cartesian coordinates to spherical coordinates
      * 
-     * \param c the 3D vector in cartesian coordinates
+     * \param v the 3D vector in cartesian coordinates
      * 
      */
-    Angles (Vector c);
+    Angles (Vector v);
+
+    /** 
+     * this constructor initializes an Angles instance with the angles
+     * of the spherical coordinates of point v respect to point o 
+     * 
+     * \param v the point (in cartesian coordinates) for which the angles are determined
+     * \param o the origin (in cartesian coordinates) of the spherical coordinate system
+     * 
+     */
+    Angles (Vector v, Vector o);
 
     /**
      * the azimuth angle in radians
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/antenna/test/test-angles.cc	Thu Jan 05 13:31:32 2012 +0100
@@ -0,0 +1,216 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 CTTC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Nicola Baldo <nbaldo@cttc.es>
+ */
+
+#include <ns3/log.h>
+#include <ns3/test.h>
+#include <ns3/antenna-model.h>
+#include <math.h>
+#include <string>
+#include <iostream>
+#include <sstream>
+
+namespace ns3 {
+
+class OneVectorConstructorTestCase : public TestCase
+{
+public:
+  static std::string BuildNameString (Vector v);
+  OneVectorConstructorTestCase (Vector v, AntennaModel::Angles a);
+
+private:
+  virtual void DoRun (void);
+
+  Vector m_v;
+  AntennaModel::Angles m_a;
+};
+
+std::string OneVectorConstructorTestCase::BuildNameString (Vector v)
+{
+  std::ostringstream oss;
+  oss <<  " v = " << v ;
+  return oss.str ();
+}
+
+
+OneVectorConstructorTestCase::OneVectorConstructorTestCase (Vector v, AntennaModel::Angles a)
+  : TestCase (BuildNameString (v)),
+    m_v (v),
+    m_a (a)
+{
+}
+
+void
+OneVectorConstructorTestCase::DoRun ()
+{
+  AntennaModel::Angles a (m_v);
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.phi, m_a.phi, 1e-10, "incorrect phi");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.theta, m_a.theta, 1e-10, "incorrect theta");
+}
+
+
+
+
+
+class TwoVectorsConstructorTestCase : public TestCase
+{
+public:
+  static std::string BuildNameString (Vector v, Vector o);
+  TwoVectorsConstructorTestCase (Vector v, Vector o, AntennaModel::Angles a);
+
+private:
+  virtual void DoRun (void);
+
+  Vector m_v;
+  Vector m_o;
+  AntennaModel::Angles m_a;
+};
+
+std::string TwoVectorsConstructorTestCase::BuildNameString (Vector v, Vector o)
+{
+  std::ostringstream oss;
+  oss <<  " v = " << v << ", o = " << o;
+  return oss.str ();
+}
+
+
+TwoVectorsConstructorTestCase::TwoVectorsConstructorTestCase (Vector v, Vector o, AntennaModel::Angles a)
+  : TestCase (BuildNameString (v, o)),
+    m_v (v),
+    m_o (o),
+    m_a (a)
+{
+}
+
+void
+TwoVectorsConstructorTestCase::DoRun ()
+{
+  AntennaModel::Angles a (m_v, m_o);
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.phi, m_a.phi, 1e-10, "incorrect phi");
+  NS_TEST_EXPECT_MSG_EQ_TOL ( a.theta, m_a.theta, 1e-10, "incorrect theta");
+}
+
+
+
+
+
+
+class AnglesTestSuite : public TestSuite
+{
+public:
+  AnglesTestSuite ();
+};
+
+AnglesTestSuite::AnglesTestSuite ()
+  : TestSuite ("angles", UNIT)
+{
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 0),     AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 0),    AntennaModel::Angles (M_PI, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 0),     AntennaModel::Angles (M_PI_2, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 0),    AntennaModel::Angles (-M_PI_2, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 1),     AntennaModel::Angles (0, 0)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -1),    AntennaModel::Angles (0, M_PI)));
+
+  AddTestCase (new OneVectorConstructorTestCase (Vector (2, 0, 0),     AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-2, 0, 0),    AntennaModel::Angles (M_PI, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 2, 0),     AntennaModel::Angles (M_PI_2, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -2, 0),    AntennaModel::Angles (-M_PI_2, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, 2),     AntennaModel::Angles (0, 0)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 0, -2),    AntennaModel::Angles (0, M_PI)));
+  
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, 1),     AntennaModel::Angles (0, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 0, -1),    AntennaModel::Angles (0, 3*M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, 0),     AntennaModel::Angles (M_PI_4, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, -1, 0),    AntennaModel::Angles (-M_PI_4, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, 1),    AntennaModel::Angles (M_PI, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 0, -1),   AntennaModel::Angles (M_PI, 3*M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, 0),    AntennaModel::Angles (3*M_PI_4, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, -1, 0),   AntennaModel::Angles (-3*M_PI_4, M_PI_2)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, 1),     AntennaModel::Angles (M_PI_2, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, 1, -1),    AntennaModel::Angles (M_PI_2, 3*M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, 1),    AntennaModel::Angles (-M_PI_2, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (0, -1, -1),   AntennaModel::Angles (-M_PI_2, 3*M_PI_4)));
+
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, sqrt (2)),  AntennaModel::Angles (M_PI_4, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, 1, -sqrt (2)), AntennaModel::Angles (M_PI_4, 3*M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (1, -1, sqrt (2)), AntennaModel::Angles (-M_PI_4, M_PI_4)));
+  AddTestCase (new OneVectorConstructorTestCase (Vector (-1, 1, sqrt (2)), AntennaModel::Angles (3*M_PI_4, M_PI_4)));
+
+
+
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 0),     Vector (0, 0, 0), AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 0),    Vector (0, 0, 0), AntennaModel::Angles (M_PI, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 0),     Vector (0, 0, 0), AntennaModel::Angles (M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 0),    Vector (0, 0, 0), AntennaModel::Angles (-M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 1),     Vector (0, 0, 0), AntennaModel::Angles (0, 0)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -1),    Vector (0, 0, 0), AntennaModel::Angles (0, M_PI)));
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 0, 0),     Vector (0, 0, 0), AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 0, 0),    Vector (0, 0, 0), AntennaModel::Angles (M_PI, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 2, 0),     Vector (0, 0, 0), AntennaModel::Angles (M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, 0),    Vector (0, 0, 0), AntennaModel::Angles (-M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, 2),     Vector (0, 0, 0), AntennaModel::Angles (0, 0)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 0, -2),    Vector (0, 0, 0), AntennaModel::Angles (0, M_PI)));
+  
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, 1),     Vector (0, 0, 0), AntennaModel::Angles (0, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 0, -1),    Vector (0, 0, 0), AntennaModel::Angles (0, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, 0),     Vector (0, 0, 0), AntennaModel::Angles (M_PI_4, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, -1, 0),    Vector (0, 0, 0), AntennaModel::Angles (-M_PI_4, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, 1),    Vector (0, 0, 0), AntennaModel::Angles (M_PI, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 0, -1),   Vector (0, 0, 0), AntennaModel::Angles (M_PI, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, 0),    Vector (0, 0, 0), AntennaModel::Angles (3*M_PI_4, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, -1, 0),   Vector (0, 0, 0), AntennaModel::Angles (-3*M_PI_4, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, 1),     Vector (0, 0, 0), AntennaModel::Angles (M_PI_2, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, 1, -1),    Vector (0, 0, 0), AntennaModel::Angles (M_PI_2, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, 1),    Vector (0, 0, 0), AntennaModel::Angles (-M_PI_2, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -1, -1),   Vector (0, 0, 0), AntennaModel::Angles (-M_PI_2, 3*M_PI_4)));
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, sqrt (2)),  Vector (0, 0, 0), AntennaModel::Angles (M_PI_4, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 1, -sqrt (2)), Vector (0, 0, 0), AntennaModel::Angles (M_PI_4, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, -1, sqrt (2)), Vector (0, 0, 0), AntennaModel::Angles (-M_PI_4, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 1, sqrt (2)), Vector (0, 0, 0), AntennaModel::Angles (3*M_PI_4, M_PI_4)));
+
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (3, 2, 2),     Vector (2, 2, 2), AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (1, 2, 2),     Vector (2, 2, 2), AntennaModel::Angles (M_PI, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 3, 2),     Vector (2, 2, 2), AntennaModel::Angles (M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 2, 2),    Vector (-1, 3, 2), AntennaModel::Angles (-M_PI_2, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (4, -2, 7),    Vector (4, -2, 6), AntennaModel::Angles (0, 0)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -5, -1),   Vector (0, -5, 0), AntennaModel::Angles (0, M_PI)));
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-2, 2, -1),     Vector (-4, 2, -1), AntennaModel::Angles (0, M_PI_2)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (2, 2, 0),    Vector (4, 2, 0), AntennaModel::Angles (M_PI, M_PI_2)));
+  
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (-1, 4, 4),     Vector (-2, 4, 3), AntennaModel::Angles (0, M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0, -2, -6),    Vector (-1, -2, -5), AntennaModel::Angles (0, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (77, 3, 43),    Vector (78, 2, 43), AntennaModel::Angles (3*M_PI_4, M_PI_2)));
+
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (24, -2, -6 -sqrt (2)), Vector (23, -3, -6), AntennaModel::Angles (M_PI_4, 3*M_PI_4)));
+  AddTestCase (new TwoVectorsConstructorTestCase (Vector (0.5, 11.45, sqrt (2)-1), Vector (-0.5, 12.45, -1), AntennaModel::Angles (-M_PI_4, M_PI_4)));
+
+
+};
+
+static AnglesTestSuite staticAnglesTestSuiteInstance;
+
+
+
+
+} // namespace ns3
--- a/src/antenna/wscript	Thu Jan 05 11:46:58 2012 +0100
+++ b/src/antenna/wscript	Thu Jan 05 13:31:32 2012 +0100
@@ -12,6 +12,7 @@
 	 
     module_test = bld.create_ns3_module_test_library('antenna')
     module_test.source = [
+        'test/test-angles.cc',
         'test/test-degrees-radians.cc',
         'test/test-isotropic-antenna.cc',
         'test/test-cosine-antenna.cc',