IPNDlg.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. // IPNDlg.cpp: 实现文件
  2. //
  3. #include "pch.h"
  4. #include "DMS.h"
  5. #include "IPNDlg.h"
  6. #include "afxdialogex.h"
  7. // IPNDlg 对话框
  8. IMPLEMENT_DYNAMIC(IPNDlg, CDialogEx)
  9. IPNDlg::IPNDlg(CWnd* pParent /*=nullptr*/)
  10. : CDialogEx(IDD_DLG_IPN, pParent)
  11. , m_PicW(0)
  12. , m_PicH(0)
  13. , m_ReqPAD(0)
  14. , m_MaxRotaAng(0)
  15. , m_NowRotaAng(0)
  16. , m_MaxPAD(0)
  17. , m_ShootDist(_T(""))
  18. , m_DoubLen(_T(""))
  19. , m_FocalLen(0)
  20. , m_Pixel(0)
  21. , m_Distance(0)
  22. , m_Range(_T(""))
  23. , m_MinP(0)
  24. , m_Rads(0)
  25. {
  26. }
  27. IPNDlg::~IPNDlg()
  28. {
  29. }
  30. void IPNDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialogEx::DoDataExchange(pDX);
  33. DDX_Text(pDX, IDC_EDIT2, m_PicW);
  34. DDX_Text(pDX, IDC_EDIT3, m_PicH);
  35. DDX_Text(pDX, IDC_EDIT10, m_ReqPAD);
  36. DDX_Text(pDX, IDC_EDIT11, m_MaxRotaAng);
  37. DDX_Text(pDX, IDC_EDIT12, m_NowRotaAng);
  38. DDX_Text(pDX, IDC_EDIT13, m_MaxPAD);
  39. DDX_Text(pDX, IDC_EDIT14, m_ShootDist);
  40. DDX_Text(pDX, IDC_EDIT15, m_DoubLen);
  41. DDX_Text(pDX, IDC_EDIT4, m_FocalLen);
  42. DDX_Text(pDX, IDC_EDIT5, m_Pixel);
  43. DDX_Text(pDX, IDC_EDIT6, m_Distance);
  44. DDX_Text(pDX, IDC_EDIT7, m_Range);
  45. DDX_Text(pDX, IDC_EDIT8, m_MinP);
  46. DDX_Text(pDX, IDC_EDIT9, m_Rads);
  47. }
  48. BEGIN_MESSAGE_MAP(IPNDlg, CDialogEx)
  49. ON_BN_CLICKED(IDOK2, &IPNDlg::OnBnClickedOkLowLeft)
  50. ON_BN_CLICKED(IDOK3, &IPNDlg::OnBnClickedOkTopRight)
  51. ON_BN_CLICKED(IDOK4, &IPNDlg::OnBnClickedOkLowRight)
  52. END_MESSAGE_MAP()
  53. // IPNDlg 消息处理程序
  54. BOOL IPNDlg::OnInitDialog()
  55. {
  56. CDialogEx::OnInitDialog();
  57. //创建图标
  58. HICON icon;
  59. //加载图标
  60. icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. SetIcon(icon, true);
  62. SetIcon(icon, false);
  63. m_PicH = 7920;
  64. m_PicW = 6004;
  65. m_Pixel = 4.6;
  66. m_FocalLen = 25;
  67. m_MinP = 3;
  68. m_Distance = 2000;
  69. m_Rads = 600;
  70. m_ReqPAD = 0.6;
  71. UpdateData(FALSE);
  72. // TODO: 在此添加额外的初始化
  73. return TRUE; // return TRUE unless you set the focus to a control
  74. // 异常: OCX 属性页应返回 FALSE
  75. }
  76. void IPNDlg::OnBnClickedOkLowLeft()
  77. {
  78. // TODO: 在此添加控件通知处理程序代码
  79. UpdateData(TRUE);
  80. float fpicW; //CMOS宽度
  81. float fpicH; //CMOS高度
  82. float fShootW; //测得宽度
  83. float fShootH; //测得高度
  84. float MinCamP, MaxCamP; //最小,最大标志点成像尺寸
  85. float MinDistance; //最小拍摄距离
  86. float MaxDistance; //最大拍摄距离
  87. CString str1, str2;
  88. MinCamP = m_Pixel * 5 / 1000;
  89. fpicH = m_Pixel * m_PicH / 1000;
  90. fpicW = m_Pixel * m_PicW / 1000;
  91. //拍摄范围
  92. fShootW = CalShootRange(fpicW, m_FocalLen, m_Distance);
  93. fShootH = CalShootRange(fpicH, m_FocalLen, m_Distance);
  94. str1.Format(_T("%.1f x %.1f"), fShootW, fShootH);
  95. m_Range = str1;
  96. //拍摄距离
  97. MinDistance = m_FocalLen * m_FocalLen / (22 * COC);
  98. MaxDistance = CalDistance(MinCamP, m_FocalLen, m_MinP);
  99. str2.Format(_T("%.1f ~ %.1f"), MinDistance, MaxDistance);
  100. m_ShootDist = str2;
  101. UpdateData(FALSE);
  102. }
  103. void IPNDlg::OnBnClickedOkTopRight()
  104. {
  105. // TODO: 在此添加控件通知处理程序代码
  106. UpdateData(TRUE);
  107. float fdefRad;//偏转弧度
  108. float fDoubLen; //双相机基线长度
  109. CString str1;
  110. //计算相机拍摄柱状待测物偏转角
  111. fdefRad = CalRotaAngle(m_Rads, m_Distance, m_ReqPAD);
  112. m_MaxRotaAng = fdefRad * PD_R2D; //转角度制
  113. //计算双相机基线长度
  114. fDoubLen = 2 * m_Distance * tanf(fdefRad / 2); //双相机最大基线长度
  115. str1.Format(_T("%.1f"), fDoubLen);
  116. m_DoubLen = str1;
  117. UpdateData(FALSE);
  118. }
  119. void IPNDlg::OnBnClickedOkLowRight()
  120. {
  121. // TODO: 在此添加控件通知处理程序代码
  122. UpdateData(TRUE);
  123. //计算相机拍摄柱状待测物有效重叠率
  124. m_MaxPAD = CalEffectivePAD(m_Rads, m_Distance, m_NowRotaAng);
  125. UpdateData(FALSE);
  126. }
  127. /**************************************************************************************************
  128. 函 数 名 :CalShootRange
  129. 功能描述 :计算测量尺寸
  130. 输入参数:CMOS成像尺寸,焦距,拍摄距离
  131. 输出参数 :略
  132. 返 回 值 :实际测量尺寸
  133. **************************************************************************************************/
  134. float IPNDlg::CalShootRange(CFloat & length, CFloat & focalLen, CFloat & distance)
  135. {
  136. float fShootLen;
  137. fShootLen = length * distance / focalLen;
  138. return fShootLen;
  139. }
  140. /**************************************************************************************************
  141. 函 数 名 :CalDistance
  142. 功能描述 :计算拍摄距离
  143. 输入参数:CMOS成像尺寸,焦距,所需测量尺寸
  144. 输出参数 :略
  145. 返 回 值 :拍摄距离
  146. **************************************************************************************************/
  147. float IPNDlg::CalDistance(CFloat & length, CFloat & focalLen, CFloat & shootLen)
  148. {
  149. float fDistance;
  150. fDistance = shootLen * focalLen / length;
  151. return fDistance;
  152. }
  153. /**************************************************************************************************
  154. 函 数 名 :CalRotaAngle
  155. 功能描述 :计算相机旋转角度
  156. 输入参数:被测物半径,拍摄距离,有效重叠度
  157. 输出参数 :略
  158. 返 回 值 :相机旋转弧度
  159. **************************************************************************************************/
  160. float IPNDlg::CalRotaAngle(CFloat & Rads, CFloat & ShootDist, CFloat & PicAverlapDeg)
  161. {
  162. float fLmRad; //与待测物平面最大夹角
  163. float fRangeRad; //有效测量区域弧度
  164. float fcoverRad; //重叠弧度
  165. float fdefRad; //偏转弧度
  166. fLmRad = PD_D2R * 135; //转弧度制
  167. fRangeRad = 2 * (PD_PI - fLmRad - asin(Rads * sin(fLmRad) / (Rads + ShootDist)));
  168. fcoverRad = PicAverlapDeg * fRangeRad;
  169. fdefRad = fRangeRad - fcoverRad;
  170. return fdefRad;
  171. }
  172. /**************************************************************************************************
  173. 函 数 名 :CalEffectivePAD
  174. 功能描述 :计算有效重叠度
  175. 输入参数:被测物半径,拍摄距离,旋转角度
  176. 输出参数 :略
  177. 返 回 值 :有效重叠度
  178. **************************************************************************************************/
  179. float IPNDlg::CalEffectivePAD(CFloat & Rads, CFloat & ShootDist, CFloat & RotaAngle)
  180. {
  181. float fLmRad; //与待测物平面最大夹角
  182. float fRangeRad; //有效测量区域弧度
  183. float fdefRad;//偏转弧度
  184. float fMaxPAD; //最大有效重叠度
  185. //计算相机拍摄柱状待测物有效重叠率
  186. fLmRad = PD_D2R * 135; //转弧度制
  187. fRangeRad = 2 * (PD_PI - fLmRad - asin(Rads * sin(fLmRad) / (Rads + ShootDist)));
  188. fdefRad = RotaAngle * PD_D2R;
  189. fMaxPAD = 1 - (fdefRad / fRangeRad);
  190. return fMaxPAD;
  191. }