| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- // IPNDlg.cpp: 实现文件
- //
- #include "pch.h"
- #include "DMS.h"
- #include "IPNDlg.h"
- #include "afxdialogex.h"
- // IPNDlg 对话框
- IMPLEMENT_DYNAMIC(IPNDlg, CDialogEx)
- IPNDlg::IPNDlg(CWnd* pParent /*=nullptr*/)
- : CDialogEx(IDD_DLG_IPN, pParent)
- , m_PicW(0)
- , m_PicH(0)
- , m_ReqPAD(0)
- , m_MaxRotaAng(0)
- , m_NowRotaAng(0)
- , m_MaxPAD(0)
- , m_ShootDist(_T(""))
- , m_DoubLen(_T(""))
- , m_FocalLen(0)
- , m_Pixel(0)
- , m_Distance(0)
- , m_Range(_T(""))
- , m_MinP(0)
- , m_Rads(0)
- {
- }
- IPNDlg::~IPNDlg()
- {
- }
- void IPNDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialogEx::DoDataExchange(pDX);
- DDX_Text(pDX, IDC_EDIT2, m_PicW);
- DDX_Text(pDX, IDC_EDIT3, m_PicH);
- DDX_Text(pDX, IDC_EDIT10, m_ReqPAD);
- DDX_Text(pDX, IDC_EDIT11, m_MaxRotaAng);
- DDX_Text(pDX, IDC_EDIT12, m_NowRotaAng);
- DDX_Text(pDX, IDC_EDIT13, m_MaxPAD);
- DDX_Text(pDX, IDC_EDIT14, m_ShootDist);
- DDX_Text(pDX, IDC_EDIT15, m_DoubLen);
- DDX_Text(pDX, IDC_EDIT4, m_FocalLen);
- DDX_Text(pDX, IDC_EDIT5, m_Pixel);
- DDX_Text(pDX, IDC_EDIT6, m_Distance);
- DDX_Text(pDX, IDC_EDIT7, m_Range);
- DDX_Text(pDX, IDC_EDIT8, m_MinP);
- DDX_Text(pDX, IDC_EDIT9, m_Rads);
- }
- BEGIN_MESSAGE_MAP(IPNDlg, CDialogEx)
- ON_BN_CLICKED(IDOK2, &IPNDlg::OnBnClickedOkLowLeft)
- ON_BN_CLICKED(IDOK3, &IPNDlg::OnBnClickedOkTopRight)
- ON_BN_CLICKED(IDOK4, &IPNDlg::OnBnClickedOkLowRight)
- END_MESSAGE_MAP()
- // IPNDlg 消息处理程序
- BOOL IPNDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- //创建图标
- HICON icon;
- //加载图标
- icon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- SetIcon(icon, true);
- SetIcon(icon, false);
- m_PicH = 7920;
- m_PicW = 6004;
- m_Pixel = 4.6;
- m_FocalLen = 25;
- m_MinP = 3;
- m_Distance = 2000;
- m_Rads = 600;
- m_ReqPAD = 0.6;
- UpdateData(FALSE);
- // TODO: 在此添加额外的初始化
- return TRUE; // return TRUE unless you set the focus to a control
- // 异常: OCX 属性页应返回 FALSE
- }
- void IPNDlg::OnBnClickedOkLowLeft()
- {
- // TODO: 在此添加控件通知处理程序代码
- UpdateData(TRUE);
- float fpicW; //CMOS宽度
- float fpicH; //CMOS高度
- float fShootW; //测得宽度
- float fShootH; //测得高度
- float MinCamP, MaxCamP; //最小,最大标志点成像尺寸
- float MinDistance; //最小拍摄距离
- float MaxDistance; //最大拍摄距离
- CString str1, str2;
- MinCamP = m_Pixel * 5 / 1000;
- fpicH = m_Pixel * m_PicH / 1000;
- fpicW = m_Pixel * m_PicW / 1000;
- //拍摄范围
- fShootW = CalShootRange(fpicW, m_FocalLen, m_Distance);
- fShootH = CalShootRange(fpicH, m_FocalLen, m_Distance);
- str1.Format(_T("%.1f x %.1f"), fShootW, fShootH);
- m_Range = str1;
- //拍摄距离
- MinDistance = m_FocalLen * m_FocalLen / (22 * COC);
- MaxDistance = CalDistance(MinCamP, m_FocalLen, m_MinP);
- str2.Format(_T("%.1f ~ %.1f"), MinDistance, MaxDistance);
- m_ShootDist = str2;
- UpdateData(FALSE);
- }
- void IPNDlg::OnBnClickedOkTopRight()
- {
- // TODO: 在此添加控件通知处理程序代码
- UpdateData(TRUE);
- float fdefRad;//偏转弧度
- float fDoubLen; //双相机基线长度
- CString str1;
- //计算相机拍摄柱状待测物偏转角
- fdefRad = CalRotaAngle(m_Rads, m_Distance, m_ReqPAD);
- m_MaxRotaAng = fdefRad * PD_R2D; //转角度制
- //计算双相机基线长度
- fDoubLen = 2 * m_Distance * tanf(fdefRad / 2); //双相机最大基线长度
- str1.Format(_T("%.1f"), fDoubLen);
- m_DoubLen = str1;
- UpdateData(FALSE);
- }
- void IPNDlg::OnBnClickedOkLowRight()
- {
- // TODO: 在此添加控件通知处理程序代码
- UpdateData(TRUE);
- //计算相机拍摄柱状待测物有效重叠率
- m_MaxPAD = CalEffectivePAD(m_Rads, m_Distance, m_NowRotaAng);
- UpdateData(FALSE);
- }
- /**************************************************************************************************
- 函 数 名 :CalShootRange
- 功能描述 :计算测量尺寸
- 输入参数:CMOS成像尺寸,焦距,拍摄距离
- 输出参数 :略
- 返 回 值 :实际测量尺寸
- **************************************************************************************************/
- float IPNDlg::CalShootRange(CFloat & length, CFloat & focalLen, CFloat & distance)
- {
- float fShootLen;
- fShootLen = length * distance / focalLen;
- return fShootLen;
- }
- /**************************************************************************************************
- 函 数 名 :CalDistance
- 功能描述 :计算拍摄距离
- 输入参数:CMOS成像尺寸,焦距,所需测量尺寸
- 输出参数 :略
- 返 回 值 :拍摄距离
- **************************************************************************************************/
- float IPNDlg::CalDistance(CFloat & length, CFloat & focalLen, CFloat & shootLen)
- {
-
- float fDistance;
- fDistance = shootLen * focalLen / length;
- return fDistance;
- }
- /**************************************************************************************************
- 函 数 名 :CalRotaAngle
- 功能描述 :计算相机旋转角度
- 输入参数:被测物半径,拍摄距离,有效重叠度
- 输出参数 :略
- 返 回 值 :相机旋转弧度
- **************************************************************************************************/
- float IPNDlg::CalRotaAngle(CFloat & Rads, CFloat & ShootDist, CFloat & PicAverlapDeg)
- {
- float fLmRad; //与待测物平面最大夹角
- float fRangeRad; //有效测量区域弧度
- float fcoverRad; //重叠弧度
- float fdefRad; //偏转弧度
- fLmRad = PD_D2R * 135; //转弧度制
- fRangeRad = 2 * (PD_PI - fLmRad - asin(Rads * sin(fLmRad) / (Rads + ShootDist)));
- fcoverRad = PicAverlapDeg * fRangeRad;
- fdefRad = fRangeRad - fcoverRad;
- return fdefRad;
- }
- /**************************************************************************************************
- 函 数 名 :CalEffectivePAD
- 功能描述 :计算有效重叠度
- 输入参数:被测物半径,拍摄距离,旋转角度
- 输出参数 :略
- 返 回 值 :有效重叠度
- **************************************************************************************************/
- float IPNDlg::CalEffectivePAD(CFloat & Rads, CFloat & ShootDist, CFloat & RotaAngle)
- {
- float fLmRad; //与待测物平面最大夹角
- float fRangeRad; //有效测量区域弧度
- float fdefRad;//偏转弧度
- float fMaxPAD; //最大有效重叠度
- //计算相机拍摄柱状待测物有效重叠率
- fLmRad = PD_D2R * 135; //转弧度制
- fRangeRad = 2 * (PD_PI - fLmRad - asin(Rads * sin(fLmRad) / (Rads + ShootDist)));
- fdefRad = RotaAngle * PD_D2R;
- fMaxPAD = 1 - (fdefRad / fRangeRad);
- return fMaxPAD;
- }
|