123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #pragma once
- #include <mutex>
- #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);
- };
|