?? forthdlg.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 + -