




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上測繪程序設(shè)計(VC.net)上機實驗報告(Visual C+.Net)班 級: 測繪0901班 學 號: 姓 名: 代婭琴 2012年4月29日實驗八 平差程序設(shè)計基礎(chǔ)一、 實驗目的 鞏固過程的定義與調(diào)用 鞏固類的創(chuàng)建與使用 鞏固間接平差模型及平差計算 掌握平差程序設(shè)計的基本技巧與步驟二、 實驗內(nèi)容水準網(wǎng)平差程序設(shè)計。設(shè)計一個水準網(wǎng)平差的程序,要求數(shù)據(jù)從文件中讀取,計算部分與界面無關(guān)。1. 水準網(wǎng)間接平差模型:2. 計算示例:近似高程計算:3. 水準網(wǎng)平差計算一般步驟(1)讀取觀測數(shù)據(jù)和已知數(shù)據(jù);(2)計算未知點高程近似值;(3)列高差觀測值誤差方程;(4)根據(jù)水準路
2、線長度計算高差觀測值的權(quán);(5)組成法方程;(6)解法方程,求得未知點高程改正數(shù)及平差后高程值;(7)求高差觀測值殘差及平差后高差觀測值;(8)精度評定;(9)輸出平差結(jié)果。4. 水準網(wǎng)高程近似值計算算法 5. 輸入數(shù)據(jù)格式示例實驗代碼:#pragma onceclass LevelControlPointpublic:LevelControlPoint(void);LevelControlPoint(void);public:CString strName;/點名CString strID;/點號float H;bool flag;/標記是否已經(jīng)計算出近似高程值,若計算出則為,否則為;cla
3、ss CDhObspublic:CDhObs(void);CDhObs(void);public:LevelControlPoint* cpBackObj;/后視點LevelControlPoint* cpFrontObj;/前視點double ObsValue;/高差值double Dist;/測站的距離;#include "StdAfx.h"#include "LevelControlPoint.h"LevelControlPoint:LevelControlPoint(void)strName=_T("");strID=_T(&
4、quot;");H=0;flag=0;LevelControlPoint:LevelControlPoint(void)CDhObs:CDhObs(void)CDhObs:CDhObs(void)#pragma once#include"LevelControlPoint.h"#include "Matrix.h"class AdjustLevelpublic:AdjustLevel(void);AdjustLevel(void);public:LevelControlPoint* m_pKnownPoint;/已知點數(shù)組int m_iKnow
5、nPointCount;/已知點個數(shù)LevelControlPoint* m_pUnknownPoint;/未知點數(shù)組int m_iUnknownPointCount;/未知點個數(shù)CDhObs* m_pDhObs;/高差觀測值數(shù)組int m_iDhObsCount;/高差觀測值個數(shù)public:void SetKnownPointSize(int size);/創(chuàng)建大小為size的已知點數(shù)組void SetUnkonwnPointSize(int size);/創(chuàng)建大小為size的未知點數(shù)組void SetDhObsSize(int size);/創(chuàng)建大小為size的觀測值數(shù)組bool Loa
6、dObsData(const CString& strFile);/讀入觀測文件CString* SplitString(CString str, char split, int& iSubStrs); void ApproHeignt(void);/計算近似值private:LevelControlPoint* SearchKnownPointUsingID(CString ID);LevelControlPoint* SearchUnknownPointUsingID(CString ID);LevelControlPoint* SearchPointUsingID(CSt
7、ring ID); CMatrix LevleWeight(void);/計算權(quán)矩陣public:void FormErrorEquation(CMatrix &B, CMatrix &L);/組成誤差方程 void EquationCompute(CMatrix &x);/計算法方程void Accuracy_Assessment(double &r0,CMatrix &Qxx);/精度評定void CompAdjust(double &r0,CMatrix Qx);#include "StdAfx.h"#include &
8、quot;AdjustLevel.h"#include <locale.h>#include "LevelControlPoint.h"#include "math.h"AdjustLevel:AdjustLevel(void)m_pKnownPoint=NULL;/已知點數(shù)組m_iKnownPointCount=0;/已知點個數(shù)m_pUnknownPoint=NULL;/未知點數(shù)組m_iUnknownPointCount=0;/未知點個數(shù)m_pDhObs=NULL;/高差觀測值數(shù)組m_iDhObsCount=0;/高差觀測值個數(shù)A
9、djustLevel:AdjustLevel(void)if(m_pKnownPoint!=NULL)delete m_pKnownPoint;m_pKnownPoint=NULL;if(m_pUnknownPoint!=NULL)delete m_pUnknownPoint;m_pUnknownPoint=NULL;if(m_pDhObs!=NULL)delete m_pDhObs;m_pDhObs=NULL;void AdjustLevel:SetKnownPointSize(int size)m_pKnownPoint=new LevelControlPointsize;/創(chuàng)建動態(tài)指針m
10、_iKnownPointCount=size;void AdjustLevel:SetUnkonwnPointSize(int size)m_pUnknownPoint=new LevelControlPointsize;m_iUnknownPointCount=size;void AdjustLevel:SetDhObsSize(int size)m_pDhObs=new CDhObssize;m_iDhObsCount=size;/高差觀測值個數(shù)bool AdjustLevel:LoadObsData(const CString& strFile)CStdioFile sf;if(
11、!sf.Open(strFile,CFile:modeRead) return false;/創(chuàng)建并打開文件對象CString strLine;bool bEOF=sf.ReadString(strLine);/讀取第一行,即已知點的數(shù)目SetKnownPointSize(_ttoi(strLine);/根據(jù)已知點的數(shù)目,創(chuàng)建已知點數(shù)組;int n=0;for(int i=0;i<m_iKnownPointCount;i+)/讀取已知點的點名和高程值sf.ReadString(strLine);CString *pstrData=SplitString(strLine,',
12、9;,n);m_pKnownPointi.strName=pstrData0;m_pKnownPointi.strID=pstrData0;m_pKnownPointi.H=_tstof(pstrData1);m_pKnownPointi.flag=1;/已知點不用平差,故將其的flag設(shè)置為delete pstrData;pstrData=NULL;sf.ReadString(strLine);/讀取未知點的個數(shù)SetUnkonwnPointSize(_ttoi(strLine);/根據(jù)未知點的個數(shù)創(chuàng)建未知點數(shù)組sf.ReadString(strLine);/讀取未知點的點名CString
13、*pstrData=SplitString(strLine,',',n);for(int i=0;i<m_iUnknownPointCount;i+)/將未知點的點名放入未知點數(shù)組m_pUnknownPointi.strName=pstrDatai;m_pUnknownPointi.strID=pstrDatai;m_pUnknownPointi.H=0;/未知點的高程值設(shè)置為m_pUnknownPointi.flag=0;/還沒有求得近似高程,故其flag設(shè)置為if(pstrData!=NULL)delete pstrData;pstrData=NULL;sf.Read
14、String(strLine);/讀取觀測值的個數(shù)SetDhObsSize(_ttoi(strLine);/按照觀測值的大小,創(chuàng)建觀測值數(shù)組for(int i=0;i<m_iDhObsCount;i+)/分行讀取觀測值的數(shù)據(jù),將其存入觀測值數(shù)組sf.ReadString(strLine);CString *pstrData=SplitString(strLine,',',n);m_pDhObsi.cpBackObj=SearchPointUsingID(pstrData0);/后視點m_pDhObsi.cpFrontObj=SearchPointUsingID(pstrD
15、ata1);/前視點m_pDhObsi.HObsValue=_tstof(pstrData2);/高差觀測值m_pDhObsi.Dist=_tstof(pstrData3);/距離觀測值delete pstrData;pstrData=NULL;sf.Close();return 1;CString* AdjustLevel:SplitString(CString str, char split, int& iSubStrs)int iPos = 0; /分割符位置 int iNums = 0; /分割符的總數(shù) CString strTemp = str; CString strRig
16、ht; /先計算子字符串的數(shù)量 while (iPos != -1) iPos = strTemp.Find(split); if (iPos = -1) break; strRight = strTemp.Mid(iPos + 1, str.GetLength(); strTemp = strRight; iNums+; if (iNums = 0) /沒有找到分割符 /子字符串數(shù)就是字符串本身 iSubStrs = 1; return NULL; /子字符串數(shù)組 iSubStrs = iNums + 1; /子串的數(shù)量= 分割符數(shù)量+ 1 CString* pStrSplit; pStrS
17、plit = new CStringiSubStrs; strTemp = str; CString strLeft; for (int i = 0; i < iNums; i+) iPos = strTemp.Find(split); /左子串 strLeft = strTemp.Left(iPos); /右子串 strRight = strTemp.Mid(iPos + 1, strTemp.GetLength(); strTemp = strRight; pStrSpliti = strLeft; pStrSplitiNums = strTemp; return pStrSplit
18、;/LevelControlPoint* AdjustLevel:SearchKnownPointUsingID(CString ID)for(int i=0;i<m_iKnownPointCount;i+)if(m_pKnownPointi.strID=ID)return &m_pKnownPointi;return NULL;/LevelControlPoint* AdjustLevel:SearchUnknownPointUsingID(CString ID)for(int i=0;i<m_iUnknownPointCount;i+)if(m_pUnknownPoin
19、ti.strID=ID)return &m_pUnknownPointi;return NULL;LevelControlPoint* AdjustLevel:SearchPointUsingID(CString ID)LevelControlPoint* cp;cp=SearchKnownPointUsingID(ID);if(cp=NULL)cp=SearchUnknownPointUsingID(ID);return cp;void AdjustLevel:ApproHeignt(void)/用于計算高程近似值的函數(shù)for(int i=0;i<m_iUnknownPoint
20、Count;i+)/計算未知點高程值if(m_pUnknownPointi.flag!=1)/先在未知點作為觀測值的前視點的情況for(int j=0;j<m_iDhObsCount;j+)/從觀測數(shù)組里找與未知點有關(guān)聯(lián)的點/如果觀測值的前視點是未知點且其后視點已經(jīng)有高程值if(m_pDhObsj.cpFrontObj->strID=m_pUnknownPointi.strID)&& m_pDhObsj.cpBackObj->flag=1 ) /前視點=后視點-高差/*m_pUnknownPointi.H=m_pDhObsi.cpBackObj->H -
21、 m_pDhObsi.ObsValue;*/m_pUnknownPointi.H=m_pDhObsj.cpBackObj->H + m_pDhObsj.HObsValue;m_pUnknownPointi.flag=1; break;if(m_pUnknownPointi.flag!=1)/如果經(jīng)過上一步驟未知點仍沒有計算出近似值for(int j=0;j<m_iDhObsCount;j+)/從觀測數(shù)組里找與未知點有關(guān)聯(lián)的點 /如果觀測值的后視點是未知點且其前視點已經(jīng)有高程值 if(m_pDhObsj.cpBackObj->strID=m_pUnknownPointi.str
22、ID)&& m_pDhObsj.cpFrontObj->flag=1 ) /后視點=前視點+高差 m_pUnknownPointi.H=m_pDhObsj.cpFrontObj->H-m_pDhObsj.HObsValue; /* m_pUnknownPointi.H=m_pDhObsi.cpFrontObj->H+m_pDhObsi.ObsValue;*/ m_pUnknownPointi.flag=1; break; if(i=m_iUnknownPointCount-1)/如果已經(jīng)計算到最后一個未知點for(int a=0;a<m_iUnknown
23、PointCount;a+)if(m_pUnknownPointi.flag!=1)/只要有一個未知點的近似高程直沒有計算 /則要重新進行上面的步驟直到所有的未知點的近似高程值都計算出i=-1;break;CMatrix AdjustLevel:LevleWeight(void)CMatrix p(m_iDhObsCount,m_iDhObsCount);p.Unit();double value;for(int i=0;i<m_iDhObsCount;i+)value=(1.0/m_pDhObsi.Dist);p(i,i)=value;return p;void AdjustLevel
24、:FormErrorEquation(CMatrix &B, CMatrix &L)B.SetSize(m_iDhObsCount,m_iUnknownPointCount);L.SetSize(m_iDhObsCount,1);for(int i=0;i<m_iDhObsCount;i+)/建立B系數(shù)陣LevelControlPoint *tmpBack=NULL,*tmpFront=NULL;tmpBack=SearchPointUsingID(m_pDhObsi.cpBackObj->strID);tmpFront=SearchPointUsingID(m_p
25、DhObsi.cpFrontObj->strID);/找到與第i個觀測值有關(guān)的未知點tmpBack->strID;for(int j=0;j<m_iUnknownPointCount;j+)if(m_pUnknownPointj.strID=tmpBack->strID)/如果是后視點則前面的系數(shù)為-1 B(i,j)=-1;continue;if(m_pUnknownPointj.strID=tmpFront->strID)/如果是前視點則前面的系數(shù)為 B(i,j)=1;/建立L矩陣 CString tmp;for(int i=0;i<m_iDhObsCou
26、nt;i+)/l=高差觀測值-(后視近似值-前視近似值)/*L(i,0)=m_pDhObsi.ObsValue-(m_pDhObsi.cpBackObj->H-m_pDhObsi.cpFrontObj->H);*/L(i,0)=m_pDhObsi.HObsValue-(m_pDhObsi.cpFrontObj->H - m_pDhObsi.cpBackObj->H);tmp.Format(_T("%.3f"),L(i,0);L(i,0)=_tstof(tmp);L(i,0)=L(i,0)*1000;/將單位化為mmvoid AdjustLevel:E
27、quationCompute(CMatrix &x)/計算法方程CMatrix P,B,l;P=LevleWeight(); /P為權(quán)矩陣FormErrorEquation(B,l);ApproHeignt();CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=B; /B的轉(zhuǎn)置矩陣CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;CMatrix NBBl=NBB.Inv();x=NBBl*BT*P*l;for(int i=0;i<m_iUnknown
28、PointCount;i+)m_pUnknownPointi.H+=x(i,0);/未知點高程值=近似值+改正數(shù)void AdjustLevel:Accuracy_Assessment(double &r0,CMatrix &Qxx)/精度評定CMatrix B,l,P,x;P=LevleWeight(); /P為權(quán)矩陣FormErrorEquation(B,l);EquationCompute(x);CMatrix v(m_iDhObsCount,1);v=B*x-l;CMatrix vT(1,m_iDhObsCount);vT=v;CMatrix r/*(1,l)*/;r=
29、vT*P*v;r0=sqrt(r(0,0)/(m_iDhObsCount-m_iUnknownPointCount);/單位權(quán)中誤差Qxx.SetSize(m_iUnknownPointCount,m_iUnknownPointCount);CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=B;CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;Qxx=NBB.Inv();void AdjustLevel:CompAdjust(double &r0,CMat
30、rix Qx)ApproHeignt();/計算未知點的近似高程值并且存入數(shù)組CMatrix P(m_iDhObsCount,m_iDhObsCount);P=LevleWeight();/p為權(quán)矩陣CMatrix B,L;CMatrix x,Qxx;FormErrorEquation(B,L);/組成誤差方程,B為系數(shù)矩陣,l為常數(shù)項EquationCompute(x);/計算法方程Accuracy_Assessment(r0,Qxx);/精度評定for(int i=0;i<m_iUnknownPointCount;i+)/未知點高程中誤差Qxi=sqrt(Qxx(i,i)*r0;#i
31、nclude "Matrix.h"#include "locale.h"#include "LevelControlPoint.h"#include "AdjustLevel.h"AdjustLevel LevelComput;CString* SplitString(CString str, char split, int& iSubStrs)int iPos = 0; /分割符位置 int iNums = 0; /分割符的總數(shù) CString strTemp = str; CString strRigh
32、t; /先計算子字符串的數(shù)量 while (iPos != -1) iPos = strTemp.Find(split); if (iPos = -1) break; strRight = strTemp.Mid(iPos + 1, str.GetLength(); strTemp = strRight; iNums+; if (iNums = 0) /沒有找到分割符 /子字符串數(shù)就是字符串本身 iSubStrs = 1; return NULL; /子字符串數(shù)組 iSubStrs = iNums + 1; /子串的數(shù)量= 分割符數(shù)量+ 1 CString* pStrSplit; pStrSp
33、lit = new CStringiSubStrs; strTemp = str; CString strLeft; for (int i = 0; i < iNums; i+) iPos = strTemp.Find(split); /左子串 strLeft = strTemp.Left(iPos); /右子串 strRight = strTemp.Mid(iPos + 1, strTemp.GetLength(); strTemp = strRight; pStrSpliti = strLeft; pStrSplitiNums = strTemp; return pStrSplit;
34、void CIndircLelveDlg:OnBnClickedOpendatafile()/ TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE);CFileDialog dlgFile(TRUE,_T("txt"),NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORER,_T("(文本文件)|*.txt");/創(chuàng)建文件對話框if(dlgFile.DoModal()=IDCANCEL) return;/如果選擇取消按鈕則返回CString strFileName=dlgFile.GetPathName();/打
35、開獲取文件文件名setlocale(LC_ALL,""); /設(shè)置語言環(huán)境CStdioFile sf;if(!sf.Open(strFileName, CFile:modeRead) return;InputContent.Empty();/清空字符串str_openContent中的內(nèi)容CString strLine;BOOL bEOF=sf.ReadString(strLine);/讀取第一行數(shù)據(jù)while(bEOF)/開始讀取頂點數(shù)據(jù)bEOF=sf.ReadString(strLine); if(bEOF) InputContent+=strLine+_T("
36、;rn"); sf.Close();UpdateData(FALSE);void CIndircLelveDlg:OnBnClickedSavedata()/ TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE);CFileDialog dlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER,_T("(Level格式)|*.txt");if(dlgFile.DoModal()=IDCANCEL) return;CString strFileName=dlgFile.GetPathName();s
37、etlocale(LC_ALL,""); CStdioFile sf;if(!sf.Open(strFileName, CFile:modeCreate|CFile:modeWrite) return;sf.WriteString(LevleContent);sf.Close();UpdateData(FALSE);void CIndircLelveDlg:OnBnClickedComputelevel()/ TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE); setlocale(LC_ALL,""); double *Qx=ne
38、w doubleLevelComput.m_iUnknownPointCount;double r0;LevelComput.CompAdjust(r0,Qx);LevleContent.Format(_T("平差后高程值:rn");CString Temp;for(int i=0;i<LevelComput.m_iUnknownPointCount;i+) Temp.Empty();Temp.Format(_T("%s,%.4frn"), LevelComput.m_pUnknownPointi.strID,LevelComput.m_pUnknownPointi.H);LevleContent+=Temp;Temp.For
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 翻譯英語課件的軟件
- 美術(shù)課件-消防員
- 安全生產(chǎn)月活動感悟
- 起重作業(yè)安全操作規(guī)程完整版
- 環(huán)衛(wèi)工人安全生產(chǎn)培訓資料
- 安全生產(chǎn)單位的安全生產(chǎn)責任制
- 安全生產(chǎn)知識競賽方案
- 建筑企業(yè)安全生產(chǎn)方案
- 每半年組織一次生產(chǎn)安全事故應急預案演練
- 安監(jiān)局安全生產(chǎn)培訓課件
- (正式版)QBT 5998-2024 寵物尿墊(褲)
- 中小學智慧校園項目應急預案
- 互聯(lián)網(wǎng)醫(yī)療項目計劃書
- 量子信息學導論 課件 第8章 量子度量學
- 勞動器材配備一覽表
- 火電廠危險化學品安全管理課件
- 骨科專業(yè)手外科臨床技術(shù)操作規(guī)范2023版
- JB-T 4149-2022 臂式斗輪堆取料機
- 航空航天工程行業(yè)技術(shù)發(fā)展與創(chuàng)新趨勢
- 變電一次設(shè)備標準缺陷庫
- 三北防護林課件
評論
0/150
提交評論