21inline size_t get_index(
const std::vector<size_t>& N,
size_t wpt_index,
22 size_t sample_index = 0) {
23 return std::accumulate(N.begin(), N.begin() + wpt_index,
size_t{0}) +
35inline std::vector<double> linspace(
double start,
double end,
37 std::vector<double> result;
38 double delta = (end - start) / num_samples;
39 for (
size_t i = 1; i <= num_samples; ++i) {
40 result.push_back(start + i * delta);
50constexpr double input_modulus(
double input,
double minimum_input,
51 double maximum_input) {
52 double modulus = maximum_input - minimum_input;
55 int numMax = (input - minimum_input) / modulus;
56 input -= numMax * modulus;
59 int numMin = (input - maximum_input) / modulus;
60 input -= numMin * modulus;
68constexpr double angle_modulus(
double angle) {
69 return input_modulus(angle, -std::numbers::pi, std::numbers::pi);
80inline std::vector<double> angle_linspace(
double start,
double end,
82 return linspace(start, start + angle_modulus(end - start), num_samples);
91inline double calculate_trapezoidal_time(
double distance,
double velocity,
92 double acceleration) {
93 if (distance > ((velocity * velocity) / acceleration)) {
95 return distance / velocity + velocity / acceleration;
98 return 2.0 * std::sqrt(distance * acceleration) / acceleration;