版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、中南大學測繪程序設(shè)計基礎(chǔ)課程設(shè)計報告專業(yè)班級測繪1001班學生姓名李佳霖學生學號0405100111學 院地球科學與信息物理學院指導教師范沖老師2012年7月30日實驗目的使學生能夠在學習完測繪程序程序設(shè)計基礎(chǔ)(C+)、測量學、測量平差等課程的基礎(chǔ)上,進一步鞏固這些知識,并培養(yǎng)學生的綜合應用能力。實驗內(nèi)容及要求 內(nèi)容:設(shè)計一個導線網(wǎng)平差的程序。.要求:課程設(shè)計的第一、二天根據(jù)課堂上所講進行系統(tǒng)設(shè)計,對主要的概算與平差計算要求列出計算的詳細步驟,并寫出流程圖,最后形成系統(tǒng)設(shè)計說明書,并以天為單位制定詳細的程序設(shè)計計劃。進行編程,要求編程規(guī)范編寫代碼。 = 3 * GB3 考核:要求講述編程思路與
2、具體代碼的功能含義,并演示程序。系統(tǒng)設(shè)計1、需求分析控制網(wǎng)平差程序?qū)σ巴饪刂凭W(wǎng)觀測數(shù)據(jù)進行平差數(shù)據(jù)處理,其目的就是根據(jù)最小二乘原理,消除網(wǎng)中的各種幾何矛盾,求出全網(wǎng)各待定元素(未知點的平面坐標或三維坐標)。2、實現(xiàn)功能 1).數(shù)據(jù)輸入:使用外部文件的導入,讀取.txt格式的數(shù)據(jù)文件實現(xiàn)數(shù)據(jù)的讀取。 2).概算:主要實現(xiàn)近似坐標的概算。 3).平差計算:對觀測數(shù)據(jù)進行精密平差計算,得到平差后的點位坐標,方向觀測值,邊長觀測值等,精度評定。 4).成果輸出:控制網(wǎng)圖形輸出,平差結(jié)果報表及其輸出,繪制誤差橢圓等。3、系統(tǒng)總體框架邊角網(wǎng)平差程序近似坐標概算成果輸出平差計算數(shù)據(jù)輸入四、實現(xiàn)思路1、數(shù)據(jù)輸
3、入模塊、數(shù)據(jù)格式2已知數(shù)據(jù), 2為已知點的個數(shù) 點名,X,Y 未知點數(shù)據(jù),3為未知點的個數(shù) 點名33,4,58觀測數(shù)據(jù)18為方向觀測值的個數(shù);8代表距離觀測值個數(shù)。18.、數(shù)據(jù)輸入流圖數(shù)據(jù)導入描述的.txt格式數(shù)據(jù)文件數(shù)據(jù)編輯數(shù)據(jù)輸入外業(yè)數(shù)據(jù)采集、具體實現(xiàn) 先是定義一個控制點類CControlPoint,用來定義控制點m_pKnownPoint/m_pUnknownPoint、方向角觀測值CBearingObs、距離觀測值CDistObs的格式,這個類編譯好之后,就可以用于數(shù)據(jù)的讀取了。CControlPoint* m_pUnknownPoint;/未知點數(shù)組int m_iUnknownPoi
4、ntCount; /未知點個數(shù)CControlPoint* m_pKnownPoint; /已知點數(shù)組int m_iKnownPointCount; /已知點個數(shù)CBearingObs* m_pBearingObs; /方向觀測值數(shù)組int m_iBearingObsCount; /方向觀測值個數(shù)CDistObs* m_pDistObs; /距離觀測值數(shù)組int m_iDistObsCount; /距離觀測值個數(shù)CBearingObs* m_pZeroBearing; /零方向觀測值數(shù)據(jù)int m_iZeroBearingCount; /零方向觀測值個數(shù)bool LoadData(const
5、CString& strFileName);CString* SplitString(CString str , char split, int iSubStrs);/字符串分割函數(shù)按規(guī)定格式編輯好數(shù)據(jù)文件后,將這個txt文檔導入,通過MFC文件讀取方法逐行讀入數(shù)據(jù),然后通過調(diào)用分割函數(shù)SplitString,逐行進行分割,將數(shù)據(jù)保存到定義的動態(tài)數(shù)組中,這樣就實現(xiàn)了數(shù)據(jù)的讀取與保存。2、概算模塊(主要是近似坐標的推算)近似坐標推算公式 EQ oac(,1):按方向觀測值計算三角網(wǎng)中待定點的近似坐標 EQ oac(,2)按邊長觀測值計算三邊網(wǎng)中待定點的近似坐標先按公式(2)計算三角形的內(nèi)角,再用
6、公式(1)計算待定點的坐標 EQ oac(,3)按方向和邊長觀測值計算導線網(wǎng)中待定點的近似坐標 綜合比較上述三種推算近似坐標的方法,第一和第二種方法,在近似坐標推算時必須有三角形才能計算,適用于三角網(wǎng)。而本次試驗采用的是邊角網(wǎng)的觀測數(shù)據(jù),對于第一種只按角推算和第二種只按邊推算,顯然也是不合適的。而第三種極坐標推算的方法,對所有網(wǎng)形均適用,從通用性和數(shù)據(jù)合理利用這兩面考慮,故采用第三種極坐標推算的方法推算近似坐標。 在具體計算中采用逐點解算法,選擇已知點或已計算出坐標的點作為起算點,根據(jù)具體的圖形,來逐個推算出各點的坐標。這種方法比較容易實現(xiàn),而對于整體解算的方法,對所有未知點進行整體解算,實現(xiàn)
7、起來太困難。推算流程圖如下:3、平差計算模塊 EQ oac(,1)附有條件的間接平差原理:設(shè)未知數(shù)個數(shù)為 t,觀測值個數(shù)為n,條件方程個數(shù)為m誤差方程:V=BX+L條件方程:AX+W=0根據(jù)最小二乘原理:在條件AX +W=0下,即求條件極值法,利用拉格朗日不定乘數(shù)法:由于此次實驗中間接平差更適合編程的特點,故我們選用間接平差??刂凭W(wǎng)平差程序?qū)σ巴饪刂凭W(wǎng)觀測數(shù)據(jù)進行平差數(shù)據(jù)處理,其目的就是根據(jù)最小二乘原理,消除網(wǎng)中的各種幾何矛盾,求出全網(wǎng)各待定元素(未知點的平面坐標或三維坐標)。 EQ oac(,2)平差計算步驟:讀取觀測數(shù)據(jù)與已知點坐標數(shù)據(jù);(2)計算未知點近似坐標(用“導線點坐標增量法近似坐
8、標”算法);(3)計算角度觀測值誤差方程的系數(shù)和常數(shù)項;(4)計算邊長觀測值誤差方程的系數(shù)和常數(shù)項;(5)列條件式;(6)組成誤差方程,得到系數(shù)矩陣和常數(shù)項矩陣;(7)定權(quán),得到權(quán)矩陣;(8)組成方程;(9)解算法方程,求得dX=dx1 dy1 dx2 dy2 (10)求得平差后的坐標值X=X+dX。因為只有dx 很小時誤差方程式、條件方程式才是嚴密的,因此當dX 的值較大時應把X=X_+dX 作為新的近似值重復1-3 步,直到dx 中絕對值最大的一個小于給定的限值。(11)精度評定,計算誤差橢圓參數(shù)等 EQ oac(,3)誤差方程式及條件方程式的列立以未知點坐標為平差對象,一個觀測值對應一個
9、誤差方程式,誤差方程式包括兩類:方向觀測誤差方程式和邊長觀測誤差方程式。方向觀測誤差方程式 (2)邊長觀測誤差方程式 EQ oac(,4)定權(quán) 根據(jù)先驗方向觀測中誤差和邊長觀測中誤差來定權(quán)(1) 方向觀測值的權(quán) 在等精度方向觀測的控制網(wǎng)中,可把方向觀測值的權(quán)定為1 (2)邊長觀測值的權(quán)而Ms=A+B*S/1000;其中S單位為Km,這樣的話Ms單位為mm EQ oac(,5)平差后的坐標值計算求得平差后的坐標值X=X+dX。因為只有dx很小時誤差方程式、條件方程式才是嚴密的,因此當dX的值較大時應把X=X_+dX作為新的近似值進行迭代,直到dx中絕對值最大的一個小于給定的0.1mm(注意:這里
10、只是指坐標改正值,不包括定向改正值,所以在求dx中絕對值最大值時,應除去定向改正值,否則會無限迭代計算,因為定向改正值很大,而且迭代計算時不會進行改正)。 EQ oac(,6)精度評定中誤差計算:,n為觀測值個數(shù),t為未知數(shù)個數(shù)待定點點位誤差:誤差橢圓元素計算:長半徑方位角長半徑、短半徑數(shù)據(jù)讀取,并保存到相應數(shù)組中平差計算流程圖調(diào)用坐標概算函數(shù),推算待求點近似坐標調(diào)用調(diào)用計算邊長觀測值誤差方程的系數(shù)和常數(shù)項及權(quán)計算角度觀測值誤差方程的系數(shù)和常數(shù)項及權(quán)組成誤差方程,得到系數(shù)矩陣和常數(shù)項矩陣進行間接平差否If(MaxAbsDetX(detx)0.1)是精度評定平差成果輸出結(jié)束成果輸出模塊成果輸出
11、控制網(wǎng)圖形誤差橢圓的繪制控制點成果精度統(tǒng)計具體實現(xiàn):平差的成果按一定的格式格式化輸出到界面上,并以txt文檔的格式保存。調(diào)用繪制控制網(wǎng)圖函數(shù)和繪制誤差橢圓函數(shù)實現(xiàn)圖形的輸出顯示,新建一Dlg用于設(shè)置誤差橢圓的比例系數(shù)。五、界面設(shè)計圖中主要有兩個按鈕,Open the file and Compute按鈕和Draw the Ellipse按鈕分別用作打開文件并計算輸出和繪制誤差橢圓。六、實驗總結(jié)通過本次實驗我在學習完測繪程序程序設(shè)計基礎(chǔ)(C+)、測量學、測量平差等課程的基礎(chǔ)上,通過實踐鞏固這些課程上的理論知識,并培養(yǎng)了動手能力,綜合應用的能力。在本次實驗當中,主要設(shè)計思路參考了之前上課時所編寫的
12、水準網(wǎng)平差和單導線平差的思路,其中數(shù)據(jù)讀入模塊方法基本一致,需要編寫坐標概算和平差計算以及控制網(wǎng)圖形及誤差橢圓的繪制工作。在實驗中遇到了一下的幾個問題:1、坐標概算考慮不周,在坐標概算時,只考慮到了已知數(shù)據(jù)在前面給出的情況,而如果已知數(shù)據(jù)出現(xiàn)在后面則會出現(xiàn)bug,在范老師的指導下,發(fā)現(xiàn)并改正了這個小問題;2、平差計算中出現(xiàn)問題,在平差計算時發(fā)現(xiàn)改正以后與正確值相差更多了,我自己檢查發(fā)現(xiàn)在組成法方程時,由于自己疏忽,寫錯了代碼,改過之后就能夠輸出了正確結(jié)果;3、繪制控制網(wǎng)圖形和誤差橢圓時,以前的方法是建立單文檔程序,在窗口中畫圖,但是我這次這樣做發(fā)現(xiàn)在這個里邊以前程序中的部分功能實現(xiàn)不了,我想應
13、該是因為那些函數(shù)是基于對話框的,所以就將畫圖的功能放入對話框中實現(xiàn)了。 衷心感謝范老師張老師和學長在實驗當中對我的指導。附:主要代碼#pragma once#include ControlPoint.h#include Angle.h#include Matrix.hconst double Ro = 206264.806247; /一弧度對應的秒數(shù)class CTraverseNetAdjpublic:CTraverseNetAdj(void);CTraverseNetAdj(void);private: CControlPoint* m_pUnknownPoint;/未知點數(shù)組int m_
14、iUnknownPointCount; /未知點個數(shù) CControlPoint* m_pKnownPoint; /已知點數(shù)組int m_iKnownPointCount; /已知點個數(shù)CBearingObs* m_pBearingObs; /方向觀測值數(shù)組int m_iBearingObsCount; /方向觀測值個數(shù) CDistObs* m_pDistObs; /距離觀測值數(shù)組int m_iDistObsCount; /距離觀測值個數(shù)CBearingObs* m_pZeroBearing; /零方向觀測值數(shù)據(jù)int m_iZeroBearingCount; /零方向觀測值個數(shù)CString
15、* SplitString(CString str , char split, int &iSubStrs);/分割字符串void ApproximateXY();/坐標概算,求近似坐標CControlPoint* SearchKnownPointUsingNAME(CString strNAME);/根據(jù)點名查找已知點,返回該點的指針CControlPoint* SearchUnknownPointUsingNAME(CString strNAME);/根據(jù)點名查找未知知點,返回該點的指針CControlPoint* SearchPointUsingNAME(CString strNAME)
16、;/根據(jù)點號查找控制點(包括已知點和未知點),返回該點的指針public:void SetUnknownPointSize(int size);/設(shè)置未知點數(shù)組大小void SetKnownPointSize(int size);/設(shè)置已知點數(shù)據(jù)大小void SetBearingObsSize(int size); /設(shè)置方向觀測值數(shù)組大小void SetDistObsSize(int size); /設(shè)置距離觀測值數(shù)組大小void SetZeroBearingSize(int size);/設(shè)置零方向觀測值數(shù)組大小CAngle ZeroBearing(const CBearingObs m_
17、BearingObs); /計算定向零度方向角函數(shù)輸入一個方向觀察值返回測站點的零度定向角public:CAngle Azi(const CControlPoint& P1, const CControlPoint& P2);/已知兩點求方位角,輸入?yún)?shù)為CControlPoint類型double HDist(const CControlPoint& P1, const CControlPoint& P2);/求兩點之間的距離bool LoadObsData(const CString& strFileName);/從文件中導入數(shù)據(jù) void RigorousAdjust(const CStr
18、ing& strFileName);/嚴密平差(間接平差)計算主函數(shù) private:double MaxAbsDetX(const CMatrix& detX);/求未知改正數(shù)絕對值最大的void OutMatrixToFile(const CMatrix& mat,CStdioFile& SF);/把矩陣輸出到文件中CMatrix Weight(double SigmaAng, double SigmaDist);/簡單定權(quán) /計算方向觀測方程的系數(shù)和常數(shù)項void ComBearingObsEff(const CBearingObs& BearingObs, double& Li,dou
19、ble& Aj,double& Bj, double& Ak,double& Bk); /計算距離觀測方程的系數(shù)和常數(shù)項void ComDistObsEff(const CDistObs& DistObs, double& Li, double& Ci, double& Di, double& Ck, double& Dk); /輸入一個方向觀測對象,查找這一方向觀測對象所對應的零方向?qū)ο笤诹惴较驍?shù)組中的位置int SearchZeroBearing(const CBearingObs& BearingObs); /組成誤差方程,B 為系數(shù)矩陣,L為常數(shù)項向量 void FormErrorEq
20、uations(CMatrix& B, CMatrix& L);/畫圖public:double dScale; /比例/坐標原點double dOrgX; double dOrgY;int iLineWidth;/線寬COLORREF crColor ;public:void SetScale(double scale);/設(shè)置繪圖比例 void SetOrg(double x, double y);/設(shè)置坐標原點 void SetLineWidth(int iWidth);/設(shè)置線寬 void SetColor(COLORREF color);/設(shè)置顏色void draw(CDC* pDC
21、, CRect& rect);/繪制圖形;#include StdAfx.h#include TraverseNetAdj.h#include CommonSurveyFunctions.h#include math.h#include CTraverseNetAdj:CTraverseNetAdj(void)/釋放動態(tài)數(shù)組內(nèi)存if(m_pUnknownPoint!=NULL)delete m_pUnknownPoint;m_pUnknownPoint=NULL;if(m_pKnownPoint!=NULL)delete m_pKnownPoint;m_pKnownPoint=NULL; if
22、(m_pBearingObs!=NULL)delete m_pBearingObs;m_pBearingObs=NULL; if(m_pDistObs!=NULL)delete m_pDistObs;m_pDistObs=NULL;if (m_pZeroBearing!=NULL)delete m_pZeroBearing;m_pZeroBearing=NULL;/導線網(wǎng)的已知點個數(shù)不確定,所以不能像單導線那樣直接確定已知點個數(shù)m_pKnownPoint=NULL; /已知點數(shù)組 m_iKnownPointCount=0; /已知點個數(shù)m_pUnknownPoint=NULL; /未知點數(shù)組m
23、_iUnknownPointCount=0; /未知點個數(shù) m_pBearingObs=NULL; /角度觀測值數(shù)組m_iBearingObsCount=0; /角度觀測值個數(shù) m_pDistObs=NULL; /距離觀測值數(shù)組m_iDistObsCount=0; /距離觀測值個數(shù)m_pZeroBearing=NULL; /零方向觀測值數(shù)組m_iZeroBearingCount=0; /零方向觀測值個數(shù)CTraverseNetAdj:CTraverseNetAdj(void)/釋放動態(tài)數(shù)組內(nèi)存if(m_pUnknownPoint!=NULL)delete m_pUnknownPoint;m_p
24、UnknownPoint=NULL;if(m_pKnownPoint!=NULL)delete m_pKnownPoint;m_pKnownPoint=NULL; if(m_pBearingObs!=NULL)delete m_pBearingObs;m_pBearingObs=NULL; if(m_pDistObs!=NULL)delete m_pDistObs;m_pDistObs=NULL;if (m_pZeroBearing!=NULL)delete m_pZeroBearing;m_pZeroBearing=NULL;/設(shè)置已知點個數(shù)和數(shù)組/注意:調(diào)用該函數(shù)后,原有數(shù)據(jù)被刪除void
25、 CTraverseNetAdj:SetKnownPointSize(int size)if(m_pKnownPoint!=NULL)delete m_pKnownPoint;m_pKnownPoint=NULL;m_pKnownPoint=new CControlPointsize;/已知點數(shù)組m_iKnownPointCount=size;/已知點個數(shù)/設(shè)置未知點個數(shù)和數(shù)組/注意:調(diào)用該函數(shù)后,原有數(shù)據(jù)被刪除void CTraverseNetAdj:SetUnknownPointSize(int size)if(m_pUnknownPoint!=NULL)delete m_pUnknown
26、Point;m_pUnknownPoint=NULL;m_iUnknownPointCount=size; m_pUnknownPoint=new CControlPointsize;/設(shè)置方向觀測值個數(shù)和數(shù)組/注意:調(diào)用該函數(shù)后,原有數(shù)據(jù)被刪除void CTraverseNetAdj:SetBearingObsSize(int size)if(m_pBearingObs!=NULL)delete m_pBearingObs;m_pBearingObs=NULL;m_pBearingObs=new CBearingObssize; /方向觀測值數(shù)組m_iBearingObsCount=size
27、; /方向觀測值個數(shù)/設(shè)置距離觀測值個數(shù)和數(shù)組/注意:調(diào)用該函數(shù)后,原有數(shù)據(jù)被刪除void CTraverseNetAdj:SetDistObsSize(int size)if(m_pDistObs!=NULL)delete m_pDistObs;m_pDistObs=NULL;m_pDistObs=new CDistObssize; /距離觀測值數(shù)組m_iDistObsCount=size; /距離觀測值個數(shù)/設(shè)置零方向觀測值個數(shù)和數(shù)組/注意:調(diào)用該函數(shù)后,原有數(shù)據(jù)被刪除void CTraverseNetAdj:SetZeroBearingSize(int size)if(m_pZeroBe
28、aring!=NULL)delete m_pZeroBearing;m_pZeroBearing=NULL;m_pZeroBearing=new CBearingObssize; /零方向觀測值數(shù)組m_iZeroBearingCount=size; /零方向觀測值個數(shù)/已知兩個控制點,求P1-P2的方位角CAngle CTraverseNetAdj:Azi(const CControlPoint& P1, const CControlPoint& P2)CAngle angAzi; angAzi(RAD)=Azimuth(P1.X,P1.Y,P2.X,P2.Y);return angAzi;/
29、已知兩個控制點,求P1-P2的距離double CTraverseNetAdj:HDist(const CControlPoint& P1, const CControlPoint& P2)return Dist(P1.X,P1.Y,P2.X,P2.Y);/字符串分割函數(shù)CString* CTraverseNetAdj:SplitString(CString str , char split, int &iSubStrs)int iPos = 0; /分割符位置 int iNums = 0; /分割符的總數(shù) CString strTemp = str; CString strRight; /先
30、計算子字符串的數(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; pStrSplit =
31、 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;/導入觀測數(shù)據(jù)函數(shù)b
32、ool CTraverseNetAdj:LoadObsData(const CString& strFileName)CStdioFile sf; /創(chuàng)建文件對象/以讀的形式打開文件,如果打開失敗則返回if(!sf.Open(strFileName, CFile:modeRead) return false;CString strLine;BOOL bEOF=sf.ReadString(strLine);/讀取第一行,已知點個數(shù) SetKnownPointSize(_ttoi(strLine);/根據(jù)已知點個數(shù)設(shè)置數(shù)組大小/開始讀取已知點數(shù)據(jù)int n=0;/得到分割的子字符串數(shù)量/讀取并保存
33、已知點數(shù)據(jù) for(int i=0;im_iKnownPointCount;i+) sf.ReadString(strLine); CString *pstrData=SplitString(strLine,n); m_pKnownPointi.strName=pstrData0; m_pKnownPointi.strID=1; /將strID設(shè)為,即標記為坐標已知 m_pKnownPointi.X=_tstof(pstrData1); m_pKnownPointi.Y=_tstof(pstrData2); delete pstrData; pstrData=NULL;/開始讀取未知點數(shù)據(jù) s
34、f.ReadString(strLine);/未知點個數(shù)SetUnknownPointSize(_ttoi(strLine);/讀取并保存未知點數(shù)據(jù)n=0;sf.ReadString(strLine);CString *pstrData=SplitString(strLine,n); for(int i=0;im_iUnknownPointCount;i+) m_pUnknownPointi.strName=pstrDatai; m_pUnknownPointi.strID=0; /將strID設(shè)為,即標記為坐標未知 delete pstrData; pstrData=NULL; /開始讀取方
35、向觀測值數(shù)據(jù)sf.ReadString(strLine);/方向觀測值個數(shù) SetBearingObsSize(_ttoi(strLine);/根據(jù)方向觀測值個數(shù)設(shè)置數(shù)組大小n=0;for (int i=0;im_iBearingObsCount;i+)sf.ReadString(strLine);CString *pstrData=SplitString(strLine,n);m_pBearingObsi.cpStation=SearchPointUsingNAME(pstrData0);m_pBearingObsi.cpObject=SearchPointUsingNAME(pstrDat
36、a1);m_pBearingObsi.angleObsValue=_tstof(pstrData2);delete pstrData;pstrData=NULL;/根據(jù)方向觀測值數(shù)組,將零方向觀測值數(shù)據(jù)讀入相應數(shù)組中int cnt=0; for(int i=0;im_iBearingObsCount;i+)if (m_pBearingObsi.angleObsValue(DEG)=0)m_iZeroBearingCount+;SetZeroBearingSize(m_iZeroBearingCount);for (int i=0;im_iBearingObsCount;i+)if (m_pBe
37、aringObsi.angleObsValue(DEG)=0)m_pZeroBearingcnt=m_pBearingObsi; cnt+;/開始讀取距離觀測值數(shù)據(jù)sf.ReadString(strLine);/距離觀測值個數(shù)n=0;SetDistObsSize(_ttoi(strLine);/根據(jù)距離觀測值個數(shù)設(shè)置數(shù)組大小 /讀取并保存距離觀測值數(shù)據(jù) for(int i=0;im_iDistObsCount;i+) sf.ReadString(strLine); CString *pstrData=SplitString(strLine,n); m_pDistObsi.cpStart =Se
38、archPointUsingNAME(pstrData0); m_pDistObsi.cpEnd =SearchPointUsingNAME(pstrData1); m_pDistObsi.dDist =_tstof(pstrData2); delete pstrData; pstrData=NULL;sf.Close();return true;/根據(jù)點號從已知點數(shù)組中找到控制點,并返回該點的指針CControlPoint* CTraverseNetAdj:SearchKnownPointUsingNAME(CString strNAME)for(int i=0;im_iKnownPoint
39、Count;i+)if(strNAME=m_pKnownPointi.strName)return &m_pKnownPointi;return NULL;/根據(jù)點號從未知點數(shù)組中找到控制點,并返回該點的指針CControlPoint* CTraverseNetAdj:SearchUnknownPointUsingNAME(CString strNAME)for(int i=0;im_iUnknownPointCount;i+)if(strNAME=m_pUnknownPointi.strName)return &m_pUnknownPointi;return NULL;/根據(jù)點號從未知點和已
40、知點數(shù)組中找到控制點,并返回該點的指針CControlPoint* CTraverseNetAdj:SearchPointUsingNAME(CString strNAME)CControlPoint* pCP=NULL;pCP=SearchKnownPointUsingNAME(strNAME);if(pCP=NULL)pCP=SearchUnknownPointUsingNAME(strNAME);return pCP;/求近似坐標void CTraverseNetAdj:ApproximateXY()CAngle Ang;/兩方向之間的夾角值for(int i=0;istrID=0&m_
41、pBearingObsi.cpStation-strID=1) /測站點已知,照準點未知for(int j=0;jstrName=(m_pBearingObsi.cpStation)-strName&m_pBearingObsj.cpObject-strID=1) /相同測站點,且照準點已知Ang(DEG)=m_pBearingObsi.angleObsValue(DEG)-m_pBearingObsj.angleObsValue(DEG); /夾角即為兩方向值相減if(Ang(RAD)2*PI)EndBearing(RAD)=EndBearing(RAD)-2*PI;else if (End
42、Bearing(RAD)0)EndBearing(RAD)=EndBearing(RAD)+2*PI;for(int n=0;nstrName=(m_pBearingObsi.cpStation)-strName&(m_pDistObsn.cpEnd)-strName=(m_pBearingObsi.cpObject)-strName)(m_pBearingObsi.cpObject)-X=(m_pBearingObsi.cpStation)-X+m_pDistObsn.dDist*cos(EndBearing(RAD);(m_pBearingObsi.cpObject)-Y=(m_pBear
43、ingObsi.cpStation)-Y+m_pDistObsn.dDist*sin(EndBearing(RAD);(m_pBearingObsi.cpObject)-strID=1;break;/求未知改正數(shù)絕對值最大的double CTraverseNetAdj:MaxAbsDetX(const CMatrix& detX)double max=0;for(int i=0;imax)max=fabs(detX(i,0);return max;/把矩陣輸出到文件中void CTraverseNetAdj:OutMatrixToFile(const CMatrix& mat,CStdioFi
44、le& SF) CString strLine,strTmp;for(int i=0;imat.Row();i+)strLine.Empty();for(int j=0;jmat.Col();j+)strTmp.Format(_T(%.4f ),mat(i,j);strLine=strLine+strTmp;SF.WriteString(strLine+_T(rn);/定權(quán),SigmaAng為角度觀測值先驗精度(以秒為單位),(方法仍需改進)/SigmaDist距離觀測的精度(以厘米為單位)CMatrix CTraverseNetAdj:Weight(double SigmaAng, doub
45、le SigmaDist)int iTotalObsCount=m_iBearingObsCount+m_iDistObsCount; CMatrix P(iTotalObsCount, iTotalObsCount);P.Unit(); for(int i=0;im_iDistObsCount;i+)P(m_iBearingObsCount+i,m_iBearingObsCount+i)=(SigmaAng*SigmaAng)/(SigmaDist*SigmaDist*m_pDistObsi.dDist); return P;/計算定向零度方向角函數(shù)輸入一個方向觀察值返回測站點的零度定向角C
46、Angle CTraverseNetAdj:ZeroBearing(const CBearingObs m_BearingObs)CAngle alfa(0,RAD);/每個方向求出的坐標方位角CAngle Z(0,RAD);/零度定向角CAngle A(0,RAD);/每個方向觀測值的照準角int j=0;for(int i=0;istrName=m_BearingObs.cpStation-strName)alfa=Azi(*m_pBearingObsi.cpStation,*m_pBearingObsi.cpObject);/求出測站點與照準點之間的近似坐標方位角A=alfa-m_pBe
47、aringObsi.angleObsValue;/每個方向求出來的坐標方位角減去方向觀測值,得到每個方向觀測值的照準角if(A(RAD)2*PI)A(RAD)=A(RAD)-2*PI;if(A(RAD)Y - BearingObs.cpStation-Y) / (Sjk*Sjk) / 1000;Bjk = -Ro * (BearingObs.cpObject-X - BearingObs.cpStation-X) / (Sjk*Sjk) / 1000; Aj = Ajk; Bj = Bjk; Ak = -Ajk; Bk = -Bjk;CAngle alfa=Azi(*BearingObs.cp
48、Station,*BearingObs.cpObject);/方向觀測的方位角CAngle Z;/零方向的方位角CAngle LZ;/觀測方向的方位角Z=ZeroBearing(BearingObs);LZ=BearingObs.angleObsValue+Z;if(LZ(RAD)2*PI)LZ(RAD)=LZ(RAD)-2*PI;if(LZ(RAD)X - DistObs.cpStart-X) / Sik; d = (DistObs.cpEnd-Y - DistObs.cpStart-Y) / Sik; Ci = -c; Di = -d; Ck = c; Dk = d; Li = (Dist
49、Obs.dDist - Sik) * 1000;/常數(shù)項以毫米為單位/搜索對應的零方向在零方向數(shù)組中的位置int CTraverseNetAdj:SearchZeroBearing(const CBearingObs &BearingObs)int j=0; for (int n=0;nstrName=BearingObs.cpStation-strName&m_pBearingObsn.angleObsValue(DEG)=0) for (j=0;jm_iZeroBearingCount;j+) if (m_pZeroBearingj.cpStation=m_pBearingObsn.cpS
50、tation) return j; return -1;/組成誤差方程,B 為系數(shù)矩陣,L為常數(shù)項向量void CTraverseNetAdj:FormErrorEquations(CMatrix& B, CMatrix& L) int iObsCount;/觀測值總個數(shù)int iUnknownCount;/誤差方程中未知數(shù)的個數(shù) iObsCount = m_iBearingObsCount + m_iDistObsCount; iUnknownCount = m_iUnknownPointCount*2+m_iZeroBearingCount; B.SetSize(iObsCount, iU
51、nknownCount);L.SetSize(iObsCount, 1); /計算方向觀測值系數(shù)與常數(shù)項 double Aj, Bj, Ak, Bk, Li;for(int i=0;istrName)=NULL& SearchKnownPointUsingNAME(m_pBearingObsi.cpObject-strName)=NULL)/起點終點均為未知 for (j=0;jstrName=m_pUnknownPointj.strName) break; for (k=0;kstrName=m_pUnknownPointk.strName) break; B(i,j*2)=Aj; B(i,
52、j*2+1)=Bj; B(i,k*2)=Ak; B(i,k*2+1)=Bk; else if (SearchKnownPointUsingNAME(m_pBearingObsi.cpStation-strName)=NULL& SearchKnownPointUsingNAME(m_pBearingObsi.cpObject-strName)!=NULL)/起點為未知,終點為已知 for (j=0;jstrName=m_pUnknownPointj.strName) break; /*B(i,j)=Bi;*/ B(i,j*2)=Aj; B(i,j*2+1)=Bj; else if (Searc
53、hKnownPointUsingNAME(m_pBearingObsi.cpStation-strName)!=NULL& SearchKnownPointUsingNAME(m_pBearingObsi.cpObject-strName)=NULL)/對于起點為已知,終點為未知 for (k=0;kstrName=m_pUnknownPointk.strName) break; B(i,k*2)=Ak; B(i,k*2+1)=Bk; /計算邊長觀測值系數(shù)與常數(shù)項 double Ci, Di, Ck, Dk;for(int i=0;istrName)!=NULL&SearchKnownPoin
54、tUsingNAME(m_pDistObsi.cpEnd-strName)=NULL)/對于起點為已知,終點為未知 for (k=0;kstrName=m_pUnknownPointk.strName) break; B(i+m_iBearingObsCount,k*2)=Ck; B(i+m_iBearingObsCount,k*2+1)=Dk; else if (SearchKnownPointUsingNAME(m_pDistObsi.cpStart-strName)=NULL& SearchKnownPointUsingNAME(m_pDistObsi.cpEnd-strName)!=N
55、ULL) for (j=0;jstrName=m_pUnknownPointj.strName) break; /*B(i,j)=Bi;*/ B(i+m_iBearingObsCount,j*2)=Ci; B(i+m_iBearingObsCount,j*2+1)=Di; else if (SearchKnownPointUsingNAME(m_pDistObsi.cpStart-strName)=NULL& SearchKnownPointUsingNAME(m_pDistObsi.cpEnd-strName)=NULL) for (j=0;jstrName=m_pUnknownPointj
56、.strName) break; for (k=0;kstrName=m_pUnknownPointk.strName) break; B(i+m_iBearingObsCount,j*2)=Ci; B(i+m_iBearingObsCount,j*2+1)=Di; B(i+m_iBearingObsCount,k*2)=Ck; B(i+m_iBearingObsCount,k*2+1)=Dk; /嚴密平差(間接平差)計算主函數(shù)void CTraverseNetAdj:RigorousAdjust(const CString& strFileName)/開始輸出間接平差的結(jié)果文件CStdioF
57、ile SF;CString strLine;setlocale(LC_ALL,); if(!SF.Open(strFileName, CFile:modeCreate|CFile:modeWrite) return; /開始寫數(shù)據(jù) SF.WriteString(_T(控制網(wǎng)間接平差結(jié)果n); /寫已知點數(shù)據(jù)strLine.Format(_T(已知點個數(shù):%dn),m_iKnownPointCount);SF.WriteString(strLine); for(int i=0;im_iKnownPointCount;i+) strLine.Format(_T(%s,%.4f,%.4fn), m
58、_pKnownPointi.strName, m_pKnownPointi.X,m_pKnownPointi.Y);SF.WriteString(strLine); /第一步:計算未知點近似坐標ApproximateXY(); /把未知點近似坐標寫入文件strLine.Format(_T(未知點個數(shù):%dn),m_iUnknownPointCount);SF.WriteString(strLine); for(int i=0;im_iUnknownPointCount;i+) strLine.Format(_T(%s,%.4f,%.4fn), m_pUnknownPointi.strName,
59、 m_pUnknownPointi.X,m_pUnknownPointi.Y);SF.WriteString(strLine); /第二步:計算方向觀測值誤差方程的系數(shù)和常數(shù)項 /第三步:計算邊長觀測值誤差方程的系數(shù)和常數(shù)項 /第四步:組成誤差方程/以上三步包含在FormErrorEquations函數(shù)中 /第五步:定權(quán),得到權(quán)矩陣int iTotalObsCount=m_iBearingObsCount+m_iDistObsCount; CMatrix P(iTotalObsCount,iTotalObsCount); P=Weight(5, 0.5); /第六步:組成并解算法方程 CMat
60、rix B, L; CMatrix BT, N, InvN, detX, V;CMatrix W; /注意:detX,即坐標改正數(shù)的單位為mm(循環(huán)迭代發(fā)生改變的變量是什么,前面的系數(shù)計算有問題) do FormErrorEquations(B, L); BT = B; N = BT*P*B; InvN = N.Inv();W=BT*P*L; detX = InvN * (BT * P * L); for (int i=0;i 0.1); /第六步:精度評定 V = B * detX - L; /輸出系數(shù)陣和常數(shù)項 SF.WriteString(_T(B矩陣:rn); OutMatrixToF
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年某服裝設(shè)計與某紡織廠關(guān)于環(huán)保材料應用的合作協(xié)議
- 2024-2030年中國衛(wèi)生消毒場運行狀況及投資發(fā)展前景預測報告
- 2024年度養(yǎng)老機構(gòu)與專業(yè)護理團隊合作協(xié)議3篇
- 2024上海應屆生落戶離職賠償金計算及協(xié)議3篇
- 2024年版房地產(chǎn)項目開發(fā)合作合同樣本版B版
- 珠海城市職業(yè)技術(shù)學院實訓室安全事故應急處置管理辦法(已發(fā)文)
- 滿洲里俄語職業(yè)學院《軟件工程原理與應用》2023-2024學年第一學期期末試卷
- 2025技術(shù)咨詢標準合同書
- 2025年石家莊道路貨物運輸駕駛員考試
- 2025年福州從業(yè)資格證模擬考試題貨運考題
- 胸腔穿刺術(shù)演示文稿
- 課間十分鐘 文明安全行
- 意大利國家介紹-教學課件
- VDA6.5產(chǎn)品審核培訓資料
- 商業(yè)銀行審計工作底稿之期后事項
- 兒科發(fā)展規(guī)劃與思路【兒科五年發(fā)展規(guī)劃】
- 青島幼兒師范高等專科學校教師招聘考試題庫真題2023
- 職高數(shù)學基礎(chǔ)模塊(上冊)1-3章檢測試題整理
- 沃爾瑪物流管理教學課件
- 沉積巖石學論述題總結(jié)
- 中國銀行中銀金融租賃有限公司2023年校園招聘15名人員筆試歷年高頻考點試題答案詳解
評論
0/150
提交評論