版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、中南大學(xué)測(cè)繪程序設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)報(bào)告專業(yè)班級(jí)測(cè)繪1001班學(xué)生姓名李佳霖學(xué)生學(xué)號(hào)0405100111學(xué) 院地球科學(xué)與信息物理學(xué)院指導(dǎo)教師范沖老師2012年7月30日實(shí)驗(yàn)?zāi)康氖箤W(xué)生能夠在學(xué)習(xí)完測(cè)繪程序程序設(shè)計(jì)基礎(chǔ)(C+)、測(cè)量學(xué)、測(cè)量平差等課程的基礎(chǔ)上,進(jìn)一步鞏固這些知識(shí),并培養(yǎng)學(xué)生的綜合應(yīng)用能力。實(shí)驗(yàn)內(nèi)容及要求 內(nèi)容:設(shè)計(jì)一個(gè)導(dǎo)線網(wǎng)平差的程序。.要求:課程設(shè)計(jì)的第一、二天根據(jù)課堂上所講進(jìn)行系統(tǒng)設(shè)計(jì),對(duì)主要的概算與平差計(jì)算要求列出計(jì)算的詳細(xì)步驟,并寫出流程圖,最后形成系統(tǒng)設(shè)計(jì)說(shuō)明書,并以天為單位制定詳細(xì)的程序設(shè)計(jì)計(jì)劃。進(jìn)行編程,要求編程規(guī)范編寫代碼。 = 3 * GB3 考核:要求講述編程思路與
2、具體代碼的功能含義,并演示程序。系統(tǒng)設(shè)計(jì)1、需求分析控制網(wǎng)平差程序?qū)σ巴饪刂凭W(wǎng)觀測(cè)數(shù)據(jù)進(jìn)行平差數(shù)據(jù)處理,其目的就是根據(jù)最小二乘原理,消除網(wǎng)中的各種幾何矛盾,求出全網(wǎng)各待定元素(未知點(diǎn)的平面坐標(biāo)或三維坐標(biāo))。2、實(shí)現(xiàn)功能 1).數(shù)據(jù)輸入:使用外部文件的導(dǎo)入,讀取.txt格式的數(shù)據(jù)文件實(shí)現(xiàn)數(shù)據(jù)的讀取。 2).概算:主要實(shí)現(xiàn)近似坐標(biāo)的概算。 3).平差計(jì)算:對(duì)觀測(cè)數(shù)據(jù)進(jìn)行精密平差計(jì)算,得到平差后的點(diǎn)位坐標(biāo),方向觀測(cè)值,邊長(zhǎng)觀測(cè)值等,精度評(píng)定。 4).成果輸出:控制網(wǎng)圖形輸出,平差結(jié)果報(bào)表及其輸出,繪制誤差橢圓等。3、系統(tǒng)總體框架邊角網(wǎng)平差程序近似坐標(biāo)概算成果輸出平差計(jì)算數(shù)據(jù)輸入四、實(shí)現(xiàn)思路1、數(shù)據(jù)輸
3、入模塊、數(shù)據(jù)格式2已知數(shù)據(jù), 2為已知點(diǎn)的個(gè)數(shù) 點(diǎn)名,X,Y 未知點(diǎn)數(shù)據(jù),3為未知點(diǎn)的個(gè)數(shù) 點(diǎn)名33,4,58觀測(cè)數(shù)據(jù)18為方向觀測(cè)值的個(gè)數(shù);8代表距離觀測(cè)值個(gè)數(shù)。18.、數(shù)據(jù)輸入流圖數(shù)據(jù)導(dǎo)入描述的.txt格式數(shù)據(jù)文件數(shù)據(jù)編輯數(shù)據(jù)輸入外業(yè)數(shù)據(jù)采集、具體實(shí)現(xiàn) 先是定義一個(gè)控制點(diǎn)類CControlPoint,用來(lái)定義控制點(diǎn)m_pKnownPoint/m_pUnknownPoint、方向角觀測(cè)值CBearingObs、距離觀測(cè)值CDistObs的格式,這個(gè)類編譯好之后,就可以用于數(shù)據(jù)的讀取了。CControlPoint* m_pUnknownPoint;/未知點(diǎn)數(shù)組int m_iUnknownPoi
4、ntCount; /未知點(diǎn)個(gè)數(shù)CControlPoint* m_pKnownPoint; /已知點(diǎn)數(shù)組int m_iKnownPointCount; /已知點(diǎn)個(gè)數(shù)CBearingObs* m_pBearingObs; /方向觀測(cè)值數(shù)組int m_iBearingObsCount; /方向觀測(cè)值個(gè)數(shù)CDistObs* m_pDistObs; /距離觀測(cè)值數(shù)組int m_iDistObsCount; /距離觀測(cè)值個(gè)數(shù)CBearingObs* m_pZeroBearing; /零方向觀測(cè)值數(shù)據(jù)int m_iZeroBearingCount; /零方向觀測(cè)值個(gè)數(shù)bool LoadData(const
5、CString& strFileName);CString* SplitString(CString str , char split, int iSubStrs);/字符串分割函數(shù)按規(guī)定格式編輯好數(shù)據(jù)文件后,將這個(gè)txt文檔導(dǎo)入,通過(guò)MFC文件讀取方法逐行讀入數(shù)據(jù),然后通過(guò)調(diào)用分割函數(shù)SplitString,逐行進(jìn)行分割,將數(shù)據(jù)保存到定義的動(dòng)態(tài)數(shù)組中,這樣就實(shí)現(xiàn)了數(shù)據(jù)的讀取與保存。2、概算模塊(主要是近似坐標(biāo)的推算)近似坐標(biāo)推算公式 EQ oac(,1):按方向觀測(cè)值計(jì)算三角網(wǎng)中待定點(diǎn)的近似坐標(biāo) EQ oac(,2)按邊長(zhǎng)觀測(cè)值計(jì)算三邊網(wǎng)中待定點(diǎn)的近似坐標(biāo)先按公式(2)計(jì)算三角形的內(nèi)角,再用
6、公式(1)計(jì)算待定點(diǎn)的坐標(biāo) EQ oac(,3)按方向和邊長(zhǎng)觀測(cè)值計(jì)算導(dǎo)線網(wǎng)中待定點(diǎn)的近似坐標(biāo) 綜合比較上述三種推算近似坐標(biāo)的方法,第一和第二種方法,在近似坐標(biāo)推算時(shí)必須有三角形才能計(jì)算,適用于三角網(wǎng)。而本次試驗(yàn)采用的是邊角網(wǎng)的觀測(cè)數(shù)據(jù),對(duì)于第一種只按角推算和第二種只按邊推算,顯然也是不合適的。而第三種極坐標(biāo)推算的方法,對(duì)所有網(wǎng)形均適用,從通用性和數(shù)據(jù)合理利用這兩面考慮,故采用第三種極坐標(biāo)推算的方法推算近似坐標(biāo)。 在具體計(jì)算中采用逐點(diǎn)解算法,選擇已知點(diǎn)或已計(jì)算出坐標(biāo)的點(diǎn)作為起算點(diǎn),根據(jù)具體的圖形,來(lái)逐個(gè)推算出各點(diǎn)的坐標(biāo)。這種方法比較容易實(shí)現(xiàn),而對(duì)于整體解算的方法,對(duì)所有未知點(diǎn)進(jìn)行整體解算,實(shí)現(xiàn)
7、起來(lái)太困難。推算流程圖如下:3、平差計(jì)算模塊 EQ oac(,1)附有條件的間接平差原理:設(shè)未知數(shù)個(gè)數(shù)為 t,觀測(cè)值個(gè)數(shù)為n,條件方程個(gè)數(shù)為m誤差方程:V=BX+L條件方程:AX+W=0根據(jù)最小二乘原理:在條件AX +W=0下,即求條件極值法,利用拉格朗日不定乘數(shù)法:由于此次實(shí)驗(yàn)中間接平差更適合編程的特點(diǎn),故我們選用間接平差。控制網(wǎng)平差程序?qū)σ巴饪刂凭W(wǎng)觀測(cè)數(shù)據(jù)進(jìn)行平差數(shù)據(jù)處理,其目的就是根據(jù)最小二乘原理,消除網(wǎng)中的各種幾何矛盾,求出全網(wǎng)各待定元素(未知點(diǎn)的平面坐標(biāo)或三維坐標(biāo))。 EQ oac(,2)平差計(jì)算步驟:讀取觀測(cè)數(shù)據(jù)與已知點(diǎn)坐標(biāo)數(shù)據(jù);(2)計(jì)算未知點(diǎn)近似坐標(biāo)(用“導(dǎo)線點(diǎn)坐標(biāo)增量法近似坐
8、標(biāo)”算法);(3)計(jì)算角度觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng);(4)計(jì)算邊長(zhǎng)觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng);(5)列條件式;(6)組成誤差方程,得到系數(shù)矩陣和常數(shù)項(xiàng)矩陣;(7)定權(quán),得到權(quán)矩陣;(8)組成方程;(9)解算法方程,求得dX=dx1 dy1 dx2 dy2 (10)求得平差后的坐標(biāo)值X=X+dX。因?yàn)橹挥衐x 很小時(shí)誤差方程式、條件方程式才是嚴(yán)密的,因此當(dāng)dX 的值較大時(shí)應(yīng)把X=X_+dX 作為新的近似值重復(fù)1-3 步,直到dx 中絕對(duì)值最大的一個(gè)小于給定的限值。(11)精度評(píng)定,計(jì)算誤差橢圓參數(shù)等 EQ oac(,3)誤差方程式及條件方程式的列立以未知點(diǎn)坐標(biāo)為平差對(duì)象,一個(gè)觀測(cè)值對(duì)應(yīng)一個(gè)
9、誤差方程式,誤差方程式包括兩類:方向觀測(cè)誤差方程式和邊長(zhǎng)觀測(cè)誤差方程式。方向觀測(cè)誤差方程式 (2)邊長(zhǎng)觀測(cè)誤差方程式 EQ oac(,4)定權(quán) 根據(jù)先驗(yàn)方向觀測(cè)中誤差和邊長(zhǎng)觀測(cè)中誤差來(lái)定權(quán)(1) 方向觀測(cè)值的權(quán) 在等精度方向觀測(cè)的控制網(wǎng)中,可把方向觀測(cè)值的權(quán)定為1 (2)邊長(zhǎng)觀測(cè)值的權(quán)而Ms=A+B*S/1000;其中S單位為Km,這樣的話Ms單位為mm EQ oac(,5)平差后的坐標(biāo)值計(jì)算求得平差后的坐標(biāo)值X=X+dX。因?yàn)橹挥衐x很小時(shí)誤差方程式、條件方程式才是嚴(yán)密的,因此當(dāng)dX的值較大時(shí)應(yīng)把X=X_+dX作為新的近似值進(jìn)行迭代,直到dx中絕對(duì)值最大的一個(gè)小于給定的0.1mm(注意:這里
10、只是指坐標(biāo)改正值,不包括定向改正值,所以在求dx中絕對(duì)值最大值時(shí),應(yīng)除去定向改正值,否則會(huì)無(wú)限迭代計(jì)算,因?yàn)槎ㄏ蚋恼岛艽?,而且迭代?jì)算時(shí)不會(huì)進(jìn)行改正)。 EQ oac(,6)精度評(píng)定中誤差計(jì)算:,n為觀測(cè)值個(gè)數(shù),t為未知數(shù)個(gè)數(shù)待定點(diǎn)點(diǎn)位誤差:誤差橢圓元素計(jì)算:長(zhǎng)半徑方位角長(zhǎng)半徑、短半徑數(shù)據(jù)讀取,并保存到相應(yīng)數(shù)組中平差計(jì)算流程圖調(diào)用坐標(biāo)概算函數(shù),推算待求點(diǎn)近似坐標(biāo)調(diào)用調(diào)用計(jì)算邊長(zhǎng)觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng)及權(quán)計(jì)算角度觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng)及權(quán)組成誤差方程,得到系數(shù)矩陣和常數(shù)項(xiàng)矩陣進(jìn)行間接平差否If(MaxAbsDetX(detx)0.1)是精度評(píng)定平差成果輸出結(jié)束成果輸出模塊成果輸出
11、控制網(wǎng)圖形誤差橢圓的繪制控制點(diǎn)成果精度統(tǒng)計(jì)具體實(shí)現(xiàn):平差的成果按一定的格式格式化輸出到界面上,并以txt文檔的格式保存。調(diào)用繪制控制網(wǎng)圖函數(shù)和繪制誤差橢圓函數(shù)實(shí)現(xiàn)圖形的輸出顯示,新建一Dlg用于設(shè)置誤差橢圓的比例系數(shù)。五、界面設(shè)計(jì)圖中主要有兩個(gè)按鈕,Open the file and Compute按鈕和Draw the Ellipse按鈕分別用作打開文件并計(jì)算輸出和繪制誤差橢圓。六、實(shí)驗(yàn)總結(jié)通過(guò)本次實(shí)驗(yàn)我在學(xué)習(xí)完測(cè)繪程序程序設(shè)計(jì)基礎(chǔ)(C+)、測(cè)量學(xué)、測(cè)量平差等課程的基礎(chǔ)上,通過(guò)實(shí)踐鞏固這些課程上的理論知識(shí),并培養(yǎng)了動(dòng)手能力,綜合應(yīng)用的能力。在本次實(shí)驗(yàn)當(dāng)中,主要設(shè)計(jì)思路參考了之前上課時(shí)所編寫的
12、水準(zhǔn)網(wǎng)平差和單導(dǎo)線平差的思路,其中數(shù)據(jù)讀入模塊方法基本一致,需要編寫坐標(biāo)概算和平差計(jì)算以及控制網(wǎng)圖形及誤差橢圓的繪制工作。在實(shí)驗(yàn)中遇到了一下的幾個(gè)問(wèn)題:1、坐標(biāo)概算考慮不周,在坐標(biāo)概算時(shí),只考慮到了已知數(shù)據(jù)在前面給出的情況,而如果已知數(shù)據(jù)出現(xiàn)在后面則會(huì)出現(xiàn)bug,在范老師的指導(dǎo)下,發(fā)現(xiàn)并改正了這個(gè)小問(wèn)題;2、平差計(jì)算中出現(xiàn)問(wèn)題,在平差計(jì)算時(shí)發(fā)現(xiàn)改正以后與正確值相差更多了,我自己檢查發(fā)現(xiàn)在組成法方程時(shí),由于自己疏忽,寫錯(cuò)了代碼,改過(guò)之后就能夠輸出了正確結(jié)果;3、繪制控制網(wǎng)圖形和誤差橢圓時(shí),以前的方法是建立單文檔程序,在窗口中畫圖,但是我這次這樣做發(fā)現(xiàn)在這個(gè)里邊以前程序中的部分功能實(shí)現(xiàn)不了,我想應(yīng)
13、該是因?yàn)槟切┖瘮?shù)是基于對(duì)話框的,所以就將畫圖的功能放入對(duì)話框中實(shí)現(xiàn)了。 衷心感謝范老師張老師和學(xué)長(zhǎng)在實(shí)驗(yàn)當(dāng)中對(duì)我的指導(dǎo)。附:主要代碼#pragma once#include ControlPoint.h#include Angle.h#include Matrix.hconst double Ro = 206264.806247; /一弧度對(duì)應(yīng)的秒數(shù)class CTraverseNetAdjpublic:CTraverseNetAdj(void);CTraverseNetAdj(void);private: CControlPoint* m_pUnknownPoint;/未知點(diǎn)數(shù)組int m_
14、iUnknownPointCount; /未知點(diǎn)個(gè)數(shù) CControlPoint* m_pKnownPoint; /已知點(diǎn)數(shù)組int m_iKnownPointCount; /已知點(diǎn)個(gè)數(shù)CBearingObs* m_pBearingObs; /方向觀測(cè)值數(shù)組int m_iBearingObsCount; /方向觀測(cè)值個(gè)數(shù) CDistObs* m_pDistObs; /距離觀測(cè)值數(shù)組int m_iDistObsCount; /距離觀測(cè)值個(gè)數(shù)CBearingObs* m_pZeroBearing; /零方向觀測(cè)值數(shù)據(jù)int m_iZeroBearingCount; /零方向觀測(cè)值個(gè)數(shù)CString
15、* SplitString(CString str , char split, int &iSubStrs);/分割字符串void ApproximateXY();/坐標(biāo)概算,求近似坐標(biāo)CControlPoint* SearchKnownPointUsingNAME(CString strNAME);/根據(jù)點(diǎn)名查找已知點(diǎn),返回該點(diǎn)的指針CControlPoint* SearchUnknownPointUsingNAME(CString strNAME);/根據(jù)點(diǎn)名查找未知知點(diǎn),返回該點(diǎn)的指針CControlPoint* SearchPointUsingNAME(CString strNAME)
16、;/根據(jù)點(diǎn)號(hào)查找控制點(diǎn)(包括已知點(diǎn)和未知點(diǎn)),返回該點(diǎn)的指針public:void SetUnknownPointSize(int size);/設(shè)置未知點(diǎn)數(shù)組大小void SetKnownPointSize(int size);/設(shè)置已知點(diǎn)數(shù)據(jù)大小void SetBearingObsSize(int size); /設(shè)置方向觀測(cè)值數(shù)組大小void SetDistObsSize(int size); /設(shè)置距離觀測(cè)值數(shù)組大小void SetZeroBearingSize(int size);/設(shè)置零方向觀測(cè)值數(shù)組大小CAngle ZeroBearing(const CBearingObs m_
17、BearingObs); /計(jì)算定向零度方向角函數(shù)輸入一個(gè)方向觀察值返回測(cè)站點(diǎn)的零度定向角public:CAngle Azi(const CControlPoint& P1, const CControlPoint& P2);/已知兩點(diǎn)求方位角,輸入?yún)?shù)為CControlPoint類型double HDist(const CControlPoint& P1, const CControlPoint& P2);/求兩點(diǎn)之間的距離bool LoadObsData(const CString& strFileName);/從文件中導(dǎo)入數(shù)據(jù) void RigorousAdjust(const CStr
18、ing& strFileName);/嚴(yán)密平差(間接平差)計(jì)算主函數(shù) private:double MaxAbsDetX(const CMatrix& detX);/求未知改正數(shù)絕對(duì)值最大的void OutMatrixToFile(const CMatrix& mat,CStdioFile& SF);/把矩陣輸出到文件中CMatrix Weight(double SigmaAng, double SigmaDist);/簡(jiǎn)單定權(quán) /計(jì)算方向觀測(cè)方程的系數(shù)和常數(shù)項(xiàng)void ComBearingObsEff(const CBearingObs& BearingObs, double& Li,dou
19、ble& Aj,double& Bj, double& Ak,double& Bk); /計(jì)算距離觀測(cè)方程的系數(shù)和常數(shù)項(xiàng)void ComDistObsEff(const CDistObs& DistObs, double& Li, double& Ci, double& Di, double& Ck, double& Dk); /輸入一個(gè)方向觀測(cè)對(duì)象,查找這一方向觀測(cè)對(duì)象所對(duì)應(yīng)的零方向?qū)ο笤诹惴较驍?shù)組中的位置int SearchZeroBearing(const CBearingObs& BearingObs); /組成誤差方程,B 為系數(shù)矩陣,L為常數(shù)項(xiàng)向量 void FormErrorEq
20、uations(CMatrix& B, CMatrix& L);/畫圖public:double dScale; /比例/坐標(biāo)原點(diǎn)double dOrgX; double dOrgY;int iLineWidth;/線寬COLORREF crColor ;public:void SetScale(double scale);/設(shè)置繪圖比例 void SetOrg(double x, double y);/設(shè)置坐標(biāo)原點(diǎn) 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)/釋放動(dòng)態(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;/導(dǎo)線網(wǎng)的已知點(diǎn)個(gè)數(shù)不確定,所以不能像單導(dǎo)線那樣直接確定已知點(diǎn)個(gè)數(shù)m_pKnownPoint=NULL; /已知點(diǎn)數(shù)組 m_iKnownPointCount=0; /已知點(diǎn)個(gè)數(shù)m_pUnknownPoint=NULL; /未知點(diǎn)數(shù)組m
23、_iUnknownPointCount=0; /未知點(diǎn)個(gè)數(shù) m_pBearingObs=NULL; /角度觀測(cè)值數(shù)組m_iBearingObsCount=0; /角度觀測(cè)值個(gè)數(shù) m_pDistObs=NULL; /距離觀測(cè)值數(shù)組m_iDistObsCount=0; /距離觀測(cè)值個(gè)數(shù)m_pZeroBearing=NULL; /零方向觀測(cè)值數(shù)組m_iZeroBearingCount=0; /零方向觀測(cè)值個(gè)數(shù)CTraverseNetAdj:CTraverseNetAdj(void)/釋放動(dòng)態(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è)置已知點(diǎn)個(gè)數(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;/已知點(diǎn)數(shù)組m_iKnownPointCount=size;/已知點(diǎn)個(gè)數(shù)/設(shè)置未知點(diǎn)個(gè)數(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è)置方向觀測(cè)值個(gè)數(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; /方向觀測(cè)值數(shù)組m_iBearingObsCount=size
27、; /方向觀測(cè)值個(gè)數(shù)/設(shè)置距離觀測(cè)值個(gè)數(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; /距離觀測(cè)值數(shù)組m_iDistObsCount=size; /距離觀測(cè)值個(gè)數(shù)/設(shè)置零方向觀測(cè)值個(gè)數(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; /零方向觀測(cè)值數(shù)組m_iZeroBearingCount=size; /零方向觀測(cè)值個(gè)數(shù)/已知兩個(gè)控制點(diǎn),求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、已知兩個(gè)控制點(diǎn),求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、計(jì)算子字符串的數(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) /沒有找到分割符 /子字符串?dāng)?shù)就是字符串本身 iSubStrs = 1; return NULL; /子字符串?dāng)?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;/導(dǎo)入觀測(cè)數(shù)據(jù)函數(shù)b
32、ool CTraverseNetAdj:LoadObsData(const CString& strFileName)CStdioFile sf; /創(chuàng)建文件對(duì)象/以讀的形式打開文件,如果打開失敗則返回if(!sf.Open(strFileName, CFile:modeRead) return false;CString strLine;BOOL bEOF=sf.ReadString(strLine);/讀取第一行,已知點(diǎn)個(gè)數(shù) SetKnownPointSize(_ttoi(strLine);/根據(jù)已知點(diǎn)個(gè)數(shù)設(shè)置數(shù)組大小/開始讀取已知點(diǎn)數(shù)據(jù)int n=0;/得到分割的子字符串?dāng)?shù)量/讀取并保存
33、已知點(diǎn)數(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è)為,即標(biāo)記為坐標(biāo)已知 m_pKnownPointi.X=_tstof(pstrData1); m_pKnownPointi.Y=_tstof(pstrData2); delete pstrData; pstrData=NULL;/開始讀取未知點(diǎn)數(shù)據(jù) s
34、f.ReadString(strLine);/未知點(diǎn)個(gè)數(shù)SetUnknownPointSize(_ttoi(strLine);/讀取并保存未知點(diǎn)數(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è)為,即標(biāo)記為坐標(biāo)未知 delete pstrData; pstrData=NULL; /開始讀取方
35、向觀測(cè)值數(shù)據(jù)sf.ReadString(strLine);/方向觀測(cè)值個(gè)數(shù) SetBearingObsSize(_ttoi(strLine);/根據(jù)方向觀測(cè)值個(gè)數(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ù)方向觀測(cè)值數(shù)組,將零方向觀測(cè)值數(shù)據(jù)讀入相應(yīng)數(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+;/開始讀取距離觀測(cè)值數(shù)據(jù)sf.ReadString(strLine);/距離觀測(cè)值個(gè)數(shù)n=0;SetDistObsSize(_ttoi(strLine);/根據(jù)距離觀測(cè)值個(gè)數(shù)設(shè)置數(shù)組大小 /讀取并保存距離觀測(cè)值數(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ù)點(diǎn)號(hào)從已知點(diǎn)數(shù)組中找到控制點(diǎn),并返回該點(diǎn)的指針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ù)點(diǎn)號(hào)從未知點(diǎn)數(shù)組中找到控制點(diǎn),并返回該點(diǎn)的指針CControlPoint* CTraverseNetAdj:SearchUnknownPointUsingNAME(CString strNAME)for(int i=0;im_iUnknownPointCount;i+)if(strNAME=m_pUnknownPointi.strName)return &m_pUnknownPointi;return NULL;/根據(jù)點(diǎn)號(hào)從未知點(diǎn)和已
40、知點(diǎn)數(shù)組中找到控制點(diǎn),并返回該點(diǎn)的指針CControlPoint* CTraverseNetAdj:SearchPointUsingNAME(CString strNAME)CControlPoint* pCP=NULL;pCP=SearchKnownPointUsingNAME(strNAME);if(pCP=NULL)pCP=SearchUnknownPointUsingNAME(strNAME);return pCP;/求近似坐標(biāo)void CTraverseNetAdj:ApproximateXY()CAngle Ang;/兩方向之間的夾角值for(int i=0;istrID=0&m_
41、pBearingObsi.cpStation-strID=1) /測(cè)站點(diǎn)已知,照準(zhǔn)點(diǎn)未知for(int j=0;jstrName=(m_pBearingObsi.cpStation)-strName&m_pBearingObsj.cpObject-strID=1) /相同測(cè)站點(diǎn),且照準(zhǔn)點(diǎn)已知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ù)絕對(duì)值最大的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為角度觀測(cè)值先驗(yàn)精度(以秒為單位),(方法仍需改進(jìn))/SigmaDist距離觀測(cè)的精度(以厘米為單位)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;/計(jì)算定向零度方向角函數(shù)輸入一個(gè)方向觀察值返回測(cè)站點(diǎn)的零度定向角C
46、Angle CTraverseNetAdj:ZeroBearing(const CBearingObs m_BearingObs)CAngle alfa(0,RAD);/每個(gè)方向求出的坐標(biāo)方位角CAngle Z(0,RAD);/零度定向角CAngle A(0,RAD);/每個(gè)方向觀測(cè)值的照準(zhǔn)角int j=0;for(int i=0;istrName=m_BearingObs.cpStation-strName)alfa=Azi(*m_pBearingObsi.cpStation,*m_pBearingObsi.cpObject);/求出測(cè)站點(diǎn)與照準(zhǔn)點(diǎn)之間的近似坐標(biāo)方位角A=alfa-m_pBe
47、aringObsi.angleObsValue;/每個(gè)方向求出來(lái)的坐標(biāo)方位角減去方向觀測(cè)值,得到每個(gè)方向觀測(cè)值的照準(zhǔn)角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);/方向觀測(cè)的方位角CAngle Z;/零方向的方位角CAngle LZ;/觀測(cè)方向的方位角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ù)項(xiàng)以毫米為單位/搜索對(duì)應(yīng)的零方向在零方向數(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ù)項(xiàng)向量void CTraverseNetAdj:FormErrorEquations(CMatrix& B, CMatrix& L) int iObsCount;/觀測(cè)值總個(gè)數(shù)int iUnknownCount;/誤差方程中未知數(shù)的個(gè)數(shù) iObsCount = m_iBearingObsCount + m_iDistObsCount; iUnknownCount = m_iUnknownPointCount*2+m_iZeroBearingCount; B.SetSize(iObsCount, iU
51、nknownCount);L.SetSize(iObsCount, 1); /計(jì)算方向觀測(cè)值系數(shù)與常數(shù)項(xiàng) double Aj, Bj, Ak, Bk, Li;for(int i=0;istrName)=NULL& SearchKnownPointUsingNAME(m_pBearingObsi.cpObject-strName)=NULL)/起點(diǎn)終點(diǎn)均為未知 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)/起點(diǎn)為未知,終點(diǎn)為已知 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)/對(duì)于起點(diǎn)為已知,終點(diǎn)為未知 for (k=0;kstrName=m_pUnknownPointk.strName) break; B(i,k*2)=Ak; B(i,k*2+1)=Bk; /計(jì)算邊長(zhǎng)觀測(cè)值系數(shù)與常數(shù)項(xiàng) double Ci, Di, Ck, Dk;for(int i=0;istrName)!=NULL&SearchKnownPoin
54、tUsingNAME(m_pDistObsi.cpEnd-strName)=NULL)/對(duì)于起點(diǎn)為已知,終點(diǎn)為未知 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; /嚴(yán)密平差(間接平差)計(jì)算主函數(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); /寫已知點(diǎn)數(shù)據(jù)strLine.Format(_T(已知點(diǎn)個(gè)數(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); /第一步:計(jì)算未知點(diǎn)近似坐標(biāo)ApproximateXY(); /把未知點(diǎn)近似坐標(biāo)寫入文件strLine.Format(_T(未知點(diǎn)個(gè)數(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); /第二步:計(jì)算方向觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng) /第三步:計(jì)算邊長(zhǎng)觀測(cè)值誤差方程的系數(shù)和常數(shù)項(xiàng) /第四步:組成誤差方程/以上三步包含在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,即坐標(biāo)改正數(shù)的單位為mm(循環(huán)迭代發(fā)生改變的變量是什么,前面的系數(shù)計(jì)算有問(wèn)題) 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); /第六步:精度評(píng)定 V = B * detX - L; /輸出系數(shù)陣和常數(shù)項(xiàng) SF.WriteString(_T(B矩陣:rn); OutMatrixToF
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中圖版九年級(jí)地理下冊(cè)月考試卷含答案
- 2025年滬科版高一物理下冊(cè)月考試卷
- 2024版企業(yè)員工體檢福利服務(wù)采購(gòu)合同范本2篇
- 2025年人教A版二年級(jí)英語(yǔ)上冊(cè)月考試卷
- 2024年生物樣本研究服務(wù)合同
- 專業(yè)水泥銷售協(xié)議:2024版細(xì)則版B版
- 2024年西安高新科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 2025年人民版七年級(jí)科學(xué)上冊(cè)月考試卷
- 2025年牛津譯林版九年級(jí)物理上冊(cè)階段測(cè)試試卷
- 2025年上外版選擇性必修2生物下冊(cè)階段測(cè)試試卷
- 經(jīng)理年終工作總結(jié)述職報(bào)告ppt模板
- 臨時(shí)用電拆除方案
- 詩(shī)經(jīng)研究課程教學(xué)大綱
- 垂體瘤診療規(guī)范內(nèi)科學(xué)診療規(guī)范診療指南2023版
- 三年級(jí)道德與法治教學(xué)工作總結(jié)
- 托卡馬克等離子體約束
- 各級(jí)各類護(hù)理人員崗位職責(zé)
- 狂犬病與破傷風(fēng)的同意告知書
- FZ/T 81013-2016寵物狗服裝
- PPVT幼兒語(yǔ)言能力測(cè)試題附答案
- 陜西省寶雞市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)及行政區(qū)劃代碼
評(píng)論
0/150
提交評(píng)論