33 lines
740 B
C++
33 lines
740 B
C++
#include "trajectory.hpp"
|
|
|
|
#include <cmath>
|
|
|
|
namespace tools
|
|
{
|
|
constexpr double g = 9.7833;
|
|
|
|
Trajectory::Trajectory(const double v0, const double d, const double h)
|
|
{
|
|
auto a = g * d * d / (2 * v0 * v0);
|
|
auto b = -d;
|
|
auto c = a + h;
|
|
auto delta = b * b - 4 * a * c;
|
|
|
|
if (delta < 0) {
|
|
unsolvable = true;
|
|
return;
|
|
}
|
|
|
|
unsolvable = false;
|
|
auto tan_pitch_1 = (-b + std::sqrt(delta)) / (2 * a);
|
|
auto tan_pitch_2 = (-b - std::sqrt(delta)) / (2 * a);
|
|
auto pitch_1 = std::atan(tan_pitch_1);
|
|
auto pitch_2 = std::atan(tan_pitch_2);
|
|
auto t_1 = d / (v0 * std::cos(pitch_1));
|
|
auto t_2 = d / (v0 * std::cos(pitch_2));
|
|
|
|
pitch = (t_1 < t_2) ? pitch_1 : pitch_2;
|
|
fly_time = (t_1 < t_2) ? t_1 : t_2;
|
|
}
|
|
|
|
} // namespace tools
|