// 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; }