#pragma once #include #include "dt.h" /*平面坐标系类型枚举*/ enum class COORDINATE_SYSTEM { X_RIGHT_Y_UP, // X轴向右为正,Y轴向上为正 (标准数学坐标系) X_RIGHT_Y_DOWN, // X轴向右为正,Y轴向下为正 (屏幕坐标系) X_LEFT_Y_UP, // X轴向左为正,Y轴向上为正 X_LEFT_Y_DOWN // X轴向左为正,Y轴向下为正 }; class __declspec(dllexport) CPrCalc { private: static CPrCalc* m_pPrCalc; static std::mutex m_Mutex; public: static CPrCalc* GetInstance(); /** * 计算两点连线与X轴正方向的逆时针角度 * @param p1 第一个点坐标 * @param p2 第二个点坐标 * @return 角度值(度),范围为[0, 360),逆时针方向为正 */ double CalculateAngleWithXAxis( const XY_DOUBLE_STRUCT& p1, const XY_DOUBLE_STRUCT& p2); /** * 平面点的旋转变换函数 - 支持四种坐标系 * @param point 待旋转的点坐标 * @param center 旋转中心点 * @param angleDeg 旋转角度(度),正值表示逆时针旋转 * @param coordSystem 坐标系类型 * @param[out] rotatedPoint 旋转后的点坐标 * @return 操作结果,成功返回OK * @note 不同坐标系的旋转公式会根据坐标轴方向自动调整 */ LONG RotatePoint( const XY_DOUBLE_STRUCT& point, const XY_DOUBLE_STRUCT& center, const double& angleDeg, COORDINATE_SYSTEM coordSystem, XY_DOUBLE_STRUCT& rotatedPoint); /** * 计算目标点的新位置,使用参考点的位置偏移值和角度偏差 * @param targetPointOriginal 目标点的原始坐标(需要计算的点) * @param refPointOffset 相机检测到的参考点位置偏移值 * @param angleDeviation 角度偏差(度),逆时针为正 * @param coordSystem 坐标系类型 * @param[out] targetPointNew 输出参数,存储计算得到的目标点新坐标 * @return 操作结果,成功返回OK,失败返回错误码 */ LONG CalculateTargetPointPosition( const XY_DOUBLE_STRUCT& targetPointOriginal, const XY_DOUBLE_STRUCT& refPointOffset, const double& angleDeviation, COORDINATE_SYSTEM coordSystem, XY_DOUBLE_STRUCT& targetPointNew); /** * 根据两个像素点及其对应的物理坐标点,判断物理坐标系类型 * @param pixel1 第一个像素点坐标(x,y) * @param pixel2 第二个像素点坐标(x,y) * @param world1 第一个物理点坐标(x,y) * @param world2 第二个物理点坐标(x,y) * @param[out] system 输出参数,存储判断结果的坐标系类型 * @return 操作结果,成功返回OK,失败返回错误码 * @note 像素坐标系通常为X右Y下,物理坐标系可能有多种方向 */ LONG DetermineCoordinateSystem( const XY_DOUBLE_STRUCT& pixel1, const XY_DOUBLE_STRUCT& pixel2, const XY_DOUBLE_STRUCT& world1, const XY_DOUBLE_STRUCT& world2, COORDINATE_SYSTEM& system); /** * 根据左上、右上、右下三个点确定坐标系类型 * @param pLT 左上角点坐标 * @param pRT 右上角点坐标 * @param pRB 右下角点坐标 * @return 坐标系类型枚举值,如果计算失败返回X_RIGHT_Y_UP */ COORDINATE_SYSTEM DetermineCoordinateSystemByThreePoints( const XY_DOUBLE_STRUCT& pLT, const XY_DOUBLE_STRUCT& pRT, const XY_DOUBLE_STRUCT& pRB); /** * 根据矩阵的左上、右上、右下三个点确定坐标系方向并计算矩阵上所有点的位置 * @param pLT 左上角点坐标 * @param pRT 右上角点坐标 * @param pRB 右下角点坐标 * @param rows 矩阵总行数 * @param cols 矩阵总列数 * @param row 获取第几行数 * @param col 获取第几列数 * @param[out] point 输出参数,存储矩阵row,col点的坐标 * @return 操作结果,成功返回OK,失败返回错误码 */ LONG CalculateMatrixPointsWithSystem( const XY_DOUBLE_STRUCT& pLT, const XY_DOUBLE_STRUCT& pRT, const XY_DOUBLE_STRUCT& pRB, int rows, int cols, int row, int col, XY_DOUBLE_STRUCT& point); };