File tree 3 files changed +37
-0
lines changed
common/tier4_autoware_utils
include/tier4_autoware_utils/math
3 files changed +37
-0
lines changed Original file line number Diff line number Diff line change 15
15
#ifndef TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
16
16
#define TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
17
17
18
+ #include < utility>
19
+
18
20
namespace tier4_autoware_utils
19
21
{
20
22
21
23
float sin (float radian);
22
24
23
25
float cos (float radian);
24
26
27
+ std::pair<float , float > sin_and_cos (float radian);
28
+
25
29
} // namespace tier4_autoware_utils
26
30
27
31
#endif // TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
Original file line number Diff line number Diff line change @@ -49,4 +49,27 @@ float cos(float radian)
49
49
return sin (radian + static_cast <float >(tier4_autoware_utils::pi ) / 2 .f );
50
50
}
51
51
52
+ std::pair<float , float > sin_and_cos (float radian)
53
+ {
54
+ constexpr float tmp =
55
+ (180 .f / static_cast <float >(tier4_autoware_utils::pi )) * (discrete_arcs_num_360 / 360 .f );
56
+ const float degree = radian * tmp;
57
+ size_t idx =
58
+ (static_cast <int >(std::round (degree)) % discrete_arcs_num_360 + discrete_arcs_num_360) %
59
+ discrete_arcs_num_360;
60
+
61
+ if (idx < discrete_arcs_num_90) {
62
+ return {g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
63
+ } else if (discrete_arcs_num_90 <= idx && idx < 2 * discrete_arcs_num_90) {
64
+ idx = 2 * discrete_arcs_num_90 - idx;
65
+ return {g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
66
+ } else if (2 * discrete_arcs_num_90 <= idx && idx < 3 * discrete_arcs_num_90) {
67
+ idx = idx - 2 * discrete_arcs_num_90;
68
+ return {-g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
69
+ } else { // 3 * discrete_arcs_num_90 <= idx && idx < 4 * discrete_arcs_num_90
70
+ idx = 4 * discrete_arcs_num_90 - idx;
71
+ return {-g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
72
+ }
73
+ }
74
+
52
75
} // namespace tier4_autoware_utils
Original file line number Diff line number Diff line change @@ -40,3 +40,13 @@ TEST(trigonometry, cos)
40
40
tier4_autoware_utils::cos (x * static_cast <float >(i))) < 10e-5 );
41
41
}
42
42
}
43
+
44
+ TEST (trigonometry, sin_and_cos)
45
+ {
46
+ float x = 4 .f * tier4_autoware_utils::pi / 128 .f ;
47
+ for (int i = 0 ; i < 128 ; i++) {
48
+ const auto sin_and_cos = tier4_autoware_utils::sin_and_cos (x * static_cast <float >(i));
49
+ EXPECT_TRUE (std::abs (std::sin (x * static_cast <float >(i)) - sin_and_cos.first ) < 10e-7 );
50
+ EXPECT_TRUE (std::abs (std::cos (x * static_cast <float >(i)) - sin_and_cos.second ) < 10e-7 );
51
+ }
52
+ }
You can’t perform that action at this time.
0 commit comments