⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forthdlg.cpp

📁 摄影测量专业。实现单像后方交会以及立体像对的前方交会。以文件形式读取控制点和像点坐标。
💻 CPP
字号:
// ForthDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "BacAndFor.h"
#include "ForthDlg.h"


// ForthDlg 对话框

IMPLEMENT_DYNAMIC(ForthDlg, CDialog)

ForthDlg::ForthDlg(CWnd* pParent /*=NULL*/)
	: CDialog(ForthDlg::IDD, pParent)
	, m_Picx(-4.403262)
	, m_Picy(9.497693)
	, m_GrdX(0)
	, m_GrdY(0)
	, m_GrdZ(0)
	, m_Picx2(-13.409263)
	, m_Picy2(10.379693)
{
	LoadStatus1=FALSE;				//初始值为假,保证没获得外方位元素前按计算不发生异常
	LoadStatus2=FALSE;
}

ForthDlg::~ForthDlg()
{
}

void ForthDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT_PIC_X, m_Picx);
	DDX_Text(pDX, IDC_EDIT_PIC_Y, m_Picy);
	DDX_Text(pDX, IDC_EDIT_G_X, m_GrdX);
	DDX_Text(pDX, IDC_EDIT_G_Y, m_GrdY);
	DDX_Text(pDX, IDC_EDIT_G_Z, m_GrdZ);
	DDX_Text(pDX, IDC_EDIT_PIC_X2, m_Picx2);
	DDX_Text(pDX, IDC_EDIT_PIC_Y2, m_Picy2);
}


BEGIN_MESSAGE_MAP(ForthDlg, CDialog)
	ON_BN_CLICKED(IDC_BUTTON_INPORT_L, &ForthDlg::OnBnClickedButtonInportL)
	ON_BN_CLICKED(IDC_BUTTON_INPORT_R, &ForthDlg::OnBnClickedButtonInportR)
	ON_BN_CLICKED(IDC_BUTTON_FOR_CAL, &ForthDlg::OnBnClickedButtonForCal)
END_MESSAGE_MAP()


// ForthDlg 消息处理程序

/************************************************************************/
/* 如何获得外方位元素:
   由于之前已做了一个后方交会的模块,所以这里考虑用那个类。对于左片和右片/
   分别实例化两个对象,通过调用对象中的一些方法,就分别可获得左右两片的外/
   方位元素。美中不足的是由于之前写后方交汇程序时,没考虑到前方交会和它的/
   关系,所以导致以下代码不够简洁。
/************************************************************************/
void ForthDlg::OnBnClickedButtonInportL()
{
		BachDlg leftPic;
		leftPic.OnBnClickedButtonLoadPic();
		leftPic.OnBnClickedButtonLoadControl();

		
		/************************************************************************/
		/* 以下一段直接从后方交会拷贝而来,目的计算外方位元素                   */
		/************************************************************************/
		int m=0;								//迭代次数
		unsigned a,b;
		double v;								//三个角元素中的最大值v,及它的行列号a,b
		Matrix Res_Angle;						//提取三个角元素

		do
		{
			leftPic.LeastCal();
			leftPic.Res.ExtractSubMatrix(Res_Angle,3,0,5,0);//提取三个角元素
			Res_Angle.GetStats_MaxAbs(a,b,v);		//得到三个角元素中的最大值v,及它的行列号a,b
			m++;									//迭代次数加一

		}while(v>=0.01/206265);					// 迭代停止条件为最大的角元素小于0.01秒


		R_left=leftPic.R_G;
		Xs_l=leftPic.Xs;
		Ys_l=leftPic.Ys;
		Zs_l=leftPic.Zs;
		f1=leftPic.f;

		LoadStatus1=TRUE;
}

void ForthDlg::OnBnClickedButtonInportR()
{
	BachDlg RightPic;
	RightPic.OnBnClickedButtonLoadPic();
	RightPic.OnBnClickedButtonLoadControl();

	int m=0;									//迭代次数
	unsigned a,b;
	double v;								//三个角元素中的最大值v,及它的行列号a,b
	Matrix Res_Angle;						//提取三个角元素

	do
	{
		RightPic.LeastCal();
		RightPic.Res.ExtractSubMatrix(Res_Angle,3,0,5,0);//提取三个角元素
		Res_Angle.GetStats_MaxAbs(a,b,v);		//得到三个角元素中的最大值v,及它的行列号a,b
		m++;									//迭代次数加一

	}while(v>=0.01/206265);					// 迭代停止条件为最大的角元素小于0.01秒


	R_right=RightPic.R_G;
	Xs_r=RightPic.Xs;
	Ys_r=RightPic.Ys;
	Zs_r=RightPic.Zs;
	f2=RightPic.f;

	LoadStatus2=TRUE;
}

void ForthDlg::OnBnClickedButtonForCal()	//点击“计算”按钮的响应函数
{
	if (LoadStatus1&LoadStatus2==TRUE)				//判断是否获取了外方位元素
	{
		
		UpdateData(TRUE);
	
		getVal();
		calN();

		PicAss_L_C=N1*PicAss_l;
		PicAss_R_C=N2*PicAss_r;
	
		m_GrdX=Xs_l+PicAss_L_C[0];
		m_GrdY=0.5*((Ys_l+N1*v1)+(Ys_r+N2*v2));
		m_GrdZ=Zs_l+PicAss_L_C[2];
	
		UpdateData(FALSE);
	}
	else
	{
		MessageBox("请先获取外方位元素!","未获取外方位元素");
	}
}

void ForthDlg::getVal()
{
	
	
	Matrix p1(3,1);							//将像空间坐标系下的像点坐标放入矩阵,以便运算
	p1(0,0)=m_Picx;
	p1(1,0)=m_Picy;
	p1(2,0)=-f1;
	p_left=p1;

	Matrix p2(3,1);
	p2(0,0)=m_Picx2;
	p2(1,0)=m_Picy2;
	p2(2,0)=-f2;
	p_right=p2;

	PicAss_l=R_left*p_left;					//得到像空间辅助坐标系下的像点坐标
	PicAss_r=R_right*p_right;

	u1=PicAss_l[0];
	v1=PicAss_l[1];
	w1=PicAss_l[2];

	u2=PicAss_r[0];
	v2=PicAss_r[1];
	w2=PicAss_r[2];

	Bu=Xs_r-Xs_l;							//基线分量计算
	Bv=Ys_r-Ys_l;
	Bw=Zs_r-Zs_l;
}

void ForthDlg::calN()
{
	N1=(Bu*w2-Bw*u2)/(u1*w2-u2*w1);
	N2=(Bu*w1-Bw*u1)/(u1*w2-u2*w1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -