/*
   ***  此文件用于hero弹道着落点位，通过3D建模以及理论发弹速度以及后期轨道修正手段 ***
   ***  实现对敌方装甲板的精准打击 ***
*/

#ifndef BALLISTIC_PREDICITION_H
#define BALLISTIC_PREDICITION_H

#include <Eigen/Dense>
#include <opencv2/core.hpp>

/**
 * 弹着点计算结果
 */
struct ImpactPoint {
    Eigen::Vector3d xyz_in_camera;  // 弹着点在相机坐标系中的位置 (m)
    double flight_time;             // 弹丸飞行时间 (s)
};

/**
 * @brief 弹道计算类：根据 IMU 当前 pitch 和追踪装甲板距离，
 *        推算弹着点在相机坐标系中的三维坐标。
 *
 * 坐标系约定（与 solver.cpp 一致）：
 *   世界系: x=前, y=左, z=上
 *   相机系: z=前, x=右, y=下（OpenCV 标准）
 */
class BallisticSolver {
public:
    /**
     * @brief 根据水平距离和垂直高度差，迭代求解补偿 pitch 角。
     * @param d  水平距离 (m)
     * @param y  垂直高度差 (m，目标高于枪口为正)
     * @param v0 枪口初速度 (m/s)
     * @param k  空气阻力系数
     * @return 补偿后的 pitch 角 (度)
     */
    static double get_pitch(double d, double y, double v0, double k = 0.1);

    /**
     * @brief 计算弹丸飞行时间。
     * @param d     目标水平距离 (m，由追踪装甲板获得)
     * @param pitch 当前 IMU pitch 角 (度，仰为正)
     * @param v0    枪口初速度 (m/s)
     * @param k     空气阻力系数
     * @return 弹丸飞行时间 (s)
     */
    static double get_flight_time(double d, double pitch, double v0, double k = 0.1);

    /**
     * @brief 根据当前 IMU pitch 角推算弹丸在水平距离 d 处的垂直高度。
     * @param d     目标水平距离 (m)
     * @param pitch 当前 IMU pitch 角 (度，仰为正)
     * @param v0    枪口初速度 (m/s)
     * @param k     空气阻力系数
     * @return 弹着点相对枪口的垂直高度 (m，高于枪口为正)
     */
    static double get_impact_y(double d, double pitch, double v0, double k = 0.1);
};

#endif // BALLISTIC_PREDICITION_H
