CPrCalc.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #pragma once
  2. #include <mutex>
  3. #include "dt.h"
  4. /*平面坐标系类型枚举*/
  5. enum class COORDINATE_SYSTEM {
  6. X_RIGHT_Y_UP, // X轴向右为正,Y轴向上为正 (标准数学坐标系)
  7. X_RIGHT_Y_DOWN, // X轴向右为正,Y轴向下为正 (屏幕坐标系)
  8. X_LEFT_Y_UP, // X轴向左为正,Y轴向上为正
  9. X_LEFT_Y_DOWN // X轴向左为正,Y轴向下为正
  10. };
  11. class __declspec(dllexport) CPrCalc
  12. {
  13. private:
  14. static CPrCalc* m_pPrCalc;
  15. static std::mutex m_Mutex;
  16. public:
  17. static CPrCalc* GetInstance();
  18. /**
  19. * 计算两点连线与X轴正方向的逆时针角度
  20. * @param p1 第一个点坐标
  21. * @param p2 第二个点坐标
  22. * @return 角度值(度),范围为[0, 360),逆时针方向为正
  23. */
  24. double CalculateAngleWithXAxis(
  25. const XY_DOUBLE_STRUCT& p1,
  26. const XY_DOUBLE_STRUCT& p2);
  27. /**
  28. * 平面点的旋转变换函数 - 支持四种坐标系
  29. * @param point 待旋转的点坐标
  30. * @param center 旋转中心点
  31. * @param angleDeg 旋转角度(度),正值表示逆时针旋转
  32. * @param coordSystem 坐标系类型
  33. * @param[out] rotatedPoint 旋转后的点坐标
  34. * @return 操作结果,成功返回OK
  35. * @note 不同坐标系的旋转公式会根据坐标轴方向自动调整
  36. */
  37. LONG RotatePoint(
  38. const XY_DOUBLE_STRUCT& point,
  39. const XY_DOUBLE_STRUCT& center,
  40. const double& angleDeg,
  41. COORDINATE_SYSTEM coordSystem,
  42. XY_DOUBLE_STRUCT& rotatedPoint);
  43. /**
  44. * 计算目标点的新位置,使用参考点的位置偏移值和角度偏差
  45. * @param targetPointOriginal 目标点的原始坐标(需要计算的点)
  46. * @param refPointOffset 相机检测到的参考点位置偏移值
  47. * @param angleDeviation 角度偏差(度),逆时针为正
  48. * @param coordSystem 坐标系类型
  49. * @param[out] targetPointNew 输出参数,存储计算得到的目标点新坐标
  50. * @return 操作结果,成功返回OK,失败返回错误码
  51. */
  52. LONG CalculateTargetPointPosition(
  53. const XY_DOUBLE_STRUCT& targetPointOriginal,
  54. const XY_DOUBLE_STRUCT& refPointOffset,
  55. const double& angleDeviation,
  56. COORDINATE_SYSTEM coordSystem,
  57. XY_DOUBLE_STRUCT& targetPointNew);
  58. /**
  59. * 根据两个像素点及其对应的物理坐标点,判断物理坐标系类型
  60. * @param pixel1 第一个像素点坐标(x,y)
  61. * @param pixel2 第二个像素点坐标(x,y)
  62. * @param world1 第一个物理点坐标(x,y)
  63. * @param world2 第二个物理点坐标(x,y)
  64. * @param[out] system 输出参数,存储判断结果的坐标系类型
  65. * @return 操作结果,成功返回OK,失败返回错误码
  66. * @note 像素坐标系通常为X右Y下,物理坐标系可能有多种方向
  67. */
  68. LONG DetermineCoordinateSystem(
  69. const XY_DOUBLE_STRUCT& pixel1,
  70. const XY_DOUBLE_STRUCT& pixel2,
  71. const XY_DOUBLE_STRUCT& world1,
  72. const XY_DOUBLE_STRUCT& world2,
  73. COORDINATE_SYSTEM& system);
  74. /**
  75. * 根据左上、右上、右下三个点确定坐标系类型
  76. * @param pLT 左上角点坐标
  77. * @param pRT 右上角点坐标
  78. * @param pRB 右下角点坐标
  79. * @return 坐标系类型枚举值,如果计算失败返回X_RIGHT_Y_UP
  80. */
  81. COORDINATE_SYSTEM DetermineCoordinateSystemByThreePoints(
  82. const XY_DOUBLE_STRUCT& pLT,
  83. const XY_DOUBLE_STRUCT& pRT,
  84. const XY_DOUBLE_STRUCT& pRB);
  85. /**
  86. * 根据矩阵的左上、右上、右下三个点确定坐标系方向并计算矩阵上所有点的位置
  87. * @param pLT 左上角点坐标
  88. * @param pRT 右上角点坐标
  89. * @param pRB 右下角点坐标
  90. * @param rows 矩阵总行数
  91. * @param cols 矩阵总列数
  92. * @param row 获取第几行数
  93. * @param col 获取第几列数
  94. * @param[out] point 输出参数,存储矩阵row,col点的坐标
  95. * @return 操作结果,成功返回OK,失败返回错误码
  96. */
  97. LONG CalculateMatrixPointsWithSystem(
  98. const XY_DOUBLE_STRUCT& pLT,
  99. const XY_DOUBLE_STRUCT& pRT,
  100. const XY_DOUBLE_STRUCT& pRB,
  101. int rows, int cols,
  102. int row, int col,
  103. XY_DOUBLE_STRUCT& point);
  104. };