|
7 | 7 | #include "carla/geom/Math.h" |
8 | 8 |
|
9 | 9 | #include "carla/geom/Rotation.h" |
| 10 | +#include "carla/geom/Quaternion.h" |
10 | 11 |
|
11 | 12 | namespace carla { |
12 | 13 | namespace geom { |
13 | 14 |
|
14 | | - double Math::GetVectorAngle(const Vector3D &a, const Vector3D &b) { |
15 | | - return std::acos(Dot(a, b) / (a.Length() * b.Length())); |
| 15 | + float Math::SineVectorAngleFromUnitVectors(Vector3D const &a_unit, Vector3D const &b_unit) |
| 16 | + { |
| 17 | + auto const cross = Math::Cross(a_unit, b_unit); |
| 18 | + Vector3D const to_up(0.f, 0.f, 1.f); |
| 19 | + auto const sine_angle_abs = Math::Length(cross); |
| 20 | + if ( std::signbit(Math::Dot(cross, to_up) ) ) |
| 21 | + { |
| 22 | + return -sine_angle_abs; |
| 23 | + } |
| 24 | + else |
| 25 | + { |
| 26 | + return sine_angle_abs; |
| 27 | + } |
| 28 | + } |
| 29 | + |
| 30 | + float Math::GetVectorAngleAbs(const Vector3D &a, const Vector3D &b) { |
| 31 | + float cosine_vector_angle = Math::CosineVectorAngle(a, b); |
| 32 | + return std::acos(cosine_vector_angle); |
| 33 | + } |
| 34 | + |
| 35 | + float Math::GetVectorAngle(const Vector3D &a, const Vector3D &b) { |
| 36 | + auto const a_unit = a.MakeUnitVector(); |
| 37 | + auto const b_unit = b.MakeUnitVector(); |
| 38 | + auto const cosine_vector_angle = Math::CosineVectorAngleFromUnitVectors(a_unit, b_unit); |
| 39 | + auto const sine_vector_angle = Math::SineVectorAngleFromUnitVectors(a_unit, b_unit); |
| 40 | + auto const angle = std::atan2(sine_vector_angle, cosine_vector_angle); |
| 41 | + return angle; |
16 | 42 | } |
17 | 43 |
|
18 | 44 | std::pair<float, float> Math::DistanceSegmentToPoint( |
@@ -114,39 +140,17 @@ namespace geom { |
114 | 140 | return Vector3D(p.x * c - p.y * s, p.x * s + p.y * c, 0.0f); |
115 | 141 | } |
116 | 142 |
|
117 | | - Vector3D Math::GetForwardVector(const Rotation &rotation) { |
118 | | - const float cp = std::cos(ToRadians(rotation.pitch)); |
119 | | - const float sp = std::sin(ToRadians(rotation.pitch)); |
120 | | - const float cy = std::cos(ToRadians(rotation.yaw)); |
121 | | - const float sy = std::sin(ToRadians(rotation.yaw)); |
122 | | - return {cy * cp, sy * cp, sp}; |
123 | | - } |
| 143 | + Vector3D GetForwardVector(const Rotation &rotation) { return rotation.GetForwardVector(); } |
124 | 144 |
|
125 | | - Vector3D Math::GetRightVector(const Rotation &rotation) { |
126 | | - const float cy = std::cos(ToRadians(rotation.yaw)); |
127 | | - const float sy = std::sin(ToRadians(rotation.yaw)); |
128 | | - const float cr = std::cos(ToRadians(rotation.roll)); |
129 | | - const float sr = std::sin(ToRadians(rotation.roll)); |
130 | | - const float cp = std::cos(ToRadians(rotation.pitch)); |
131 | | - const float sp = std::sin(ToRadians(rotation.pitch)); |
132 | | - return { |
133 | | - cy * sp * sr - sy * cr, |
134 | | - sy * sp * sr + cy * cr, |
135 | | - -cp * sr}; |
136 | | - } |
| 145 | + Vector3D GetRightVector(const Rotation &rotation) { return rotation.GetRightVector(); } |
137 | 146 |
|
138 | | - Vector3D Math::GetUpVector(const Rotation &rotation) { |
139 | | - const float cy = std::cos(ToRadians(rotation.yaw)); |
140 | | - const float sy = std::sin(ToRadians(rotation.yaw)); |
141 | | - const float cr = std::cos(ToRadians(rotation.roll)); |
142 | | - const float sr = std::sin(ToRadians(rotation.roll)); |
143 | | - const float cp = std::cos(ToRadians(rotation.pitch)); |
144 | | - const float sp = std::sin(ToRadians(rotation.pitch)); |
145 | | - return { |
146 | | - -cy * sp * cr - sy * sr, |
147 | | - -sy * sp * cr + cy * sr, |
148 | | - cp * cr}; |
149 | | - } |
| 147 | + Vector3D GetUpVector(const Rotation &rotation) { return rotation.GetUpVector(); } |
| 148 | + |
| 149 | + Vector3D GetForwardVector(const Quaternion &quaternion) { return quaternion.GetForwardVector(); } |
| 150 | + |
| 151 | + Vector3D GetRightVector(const Quaternion &quaternion) { return quaternion.GetRightVector(); } |
| 152 | + |
| 153 | + Vector3D GetUpVector(const Quaternion &quaternion) { return quaternion.GetUpVector(); } |
150 | 154 |
|
151 | 155 | std::vector<int> Math::GenerateRange(int a, int b) { |
152 | 156 | std::vector<int> result; |
|
0 commit comments