ugv_nav4d
DiscreteTheta.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <assert.h>
3 #include <math.h>
4 #include <ostream>
5 
7 {
8  int theta;
9  int numAngles;
10 
11  void normalize()
12  {
13  assert(numAngles >= 0);
14  if(theta < 0)
15  {
16  int num = (theta / -numAngles) + 1;
17  theta += numAngles * num;
18  }
19 
20  if(theta >= numAngles)
21  theta = theta % numAngles;
22  }
23 
24 public:
25  DiscreteTheta(int val, unsigned int numAngles) : theta(val) , numAngles(numAngles) {
26  normalize();
27  }
28 
29  DiscreteTheta(double val, unsigned int numAngles) : numAngles(numAngles) {
30  theta = round((val * numAngles) / (2.0 * M_PI));
31  normalize();
32  }
33 
34  DiscreteTheta(const DiscreteTheta &o) : theta(o.theta), numAngles(o.numAngles) {
35  }
36 
38  {
39  theta += rhs.theta;
40  normalize();
41  return *this;
42  }
43 
45  {
46  theta -= rhs.theta;
47  normalize();
48  return *this;
49  }
50 
52  {
53  lhs += rhs;
54  return lhs;
55  }
56 
58  {
59  lhs -= rhs;
60  return lhs;
61  }
62 
63  friend bool operator<(const DiscreteTheta& l, const DiscreteTheta& r)
64  {
65  return l.theta < r.theta;
66  }
67 
68  friend bool operator==(const DiscreteTheta& l, const DiscreteTheta& r)
69  {
70  return l.theta == r.theta;
71  }
72 
73  int getTheta() const
74  {
75  return theta;
76  }
77 
78  double getRadian() const
79  {
80  return M_PI * 2.0 * theta / static_cast<double>(numAngles);
81  }
82 
83  int getNumAngles() const
84  {
85  return numAngles;
86  }
87 
89  {
90  DiscreteTheta diffA = ain-*this;
91 
92  int a = diffA.theta;
93  int b = numAngles - diffA.theta;
94 
95 
96  if(a < b)
97  return DiscreteTheta(a, numAngles);
98 
99  return DiscreteTheta(b, numAngles);
100  }
101 };
102 
103 std::ostream& operator<< (std::ostream& stream, const DiscreteTheta& angle);
std::ostream & operator<<(std::ostream &stream, const DiscreteTheta &angle)
Definition: DiscreteTheta.cpp:3
Definition: DiscreteTheta.hpp:7
DiscreteTheta(const DiscreteTheta &o)
Definition: DiscreteTheta.hpp:34
double getRadian() const
Definition: DiscreteTheta.hpp:78
friend bool operator==(const DiscreteTheta &l, const DiscreteTheta &r)
Definition: DiscreteTheta.hpp:68
int getNumAngles() const
Definition: DiscreteTheta.hpp:83
DiscreteTheta(double val, unsigned int numAngles)
Definition: DiscreteTheta.hpp:29
DiscreteTheta & operator+=(const DiscreteTheta &rhs)
Definition: DiscreteTheta.hpp:37
friend DiscreteTheta operator+(DiscreteTheta lhs, const DiscreteTheta &rhs)
Definition: DiscreteTheta.hpp:51
DiscreteTheta & operator-=(const DiscreteTheta &rhs)
Definition: DiscreteTheta.hpp:44
DiscreteTheta(int val, unsigned int numAngles)
Definition: DiscreteTheta.hpp:25
friend DiscreteTheta operator-(DiscreteTheta lhs, const DiscreteTheta &rhs)
Definition: DiscreteTheta.hpp:57
int getTheta() const
Definition: DiscreteTheta.hpp:73
DiscreteTheta shortestDist(const DiscreteTheta &ain) const
Definition: DiscreteTheta.hpp:88
friend bool operator<(const DiscreteTheta &l, const DiscreteTheta &r)
Definition: DiscreteTheta.hpp:63