生活随笔
收集整理的這篇文章主要介紹了
有窗体的闭合导线计算程序(C#)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在測(cè)繪的實(shí)際操作中,我們會(huì)遇到這樣的一些閉合導(dǎo)線的計(jì)算。閉合導(dǎo)線的計(jì)算比較復(fù)雜,我們?nèi)绾卫糜?jì)算機(jī)幫助我們快速地計(jì)算,這里我們使用C#編寫一個(gè)有(好看)界面的導(dǎo)線計(jì)算程序
問(wèn)題 這是我們計(jì)算的結(jié)果 這是答案的結(jié)果
可以看出答案是差不多的,當(dāng)然存在誤差和計(jì)算機(jī)保存小數(shù)的一些問(wèn)題有關(guān)。下面來(lái)看一下如何完成這樣的一個(gè)簡(jiǎn)單的程序(默認(rèn)知道閉合導(dǎo)線是怎么計(jì)算的)
角度(弧度)的轉(zhuǎn)換的
這里我們輸入是按照“dd ff mm” 的格式輸入的,需要通過(guò)轉(zhuǎn)換將其轉(zhuǎn)換為小數(shù)形式,然后在計(jì)算三角函數(shù)時(shí)要化為弧度 這里我們用的datagridview控件展示的數(shù)據(jù),可以利用split()函數(shù)分割里面的單元格得到度分秒,通過(guò)這個(gè)公式得到角度
angle
= D
+ F
/ 60 + M
/ 3600 ;
至于計(jì)算時(shí)的弧度,高中就知道可以這樣完成
radian
= angle
/ 180 * Math
. PI
;
計(jì)算角度的閉合差并分配誤差
一個(gè)n邊形的內(nèi)角和是(n-2)*180度,但實(shí)際在測(cè)量中,肯定得不到準(zhǔn)確的這個(gè)數(shù)據(jù),所以我們需要計(jì)算閉合差并將其分配,使內(nèi)角和等于理論值。這里的允許誤差是40√n,n是測(cè)站數(shù),分配原則是反向平均分配。這里我肯可以通過(guò)角度誤差分配來(lái)實(shí)現(xiàn)
private void btnAng_Click ( object sender
, EventArgs e
) { double rawang
= ( num
- 2 ) * 180 ; double nowang
= 0 ; double exang
= 0 ; double error
= 0 ; int i
; error
= 40 * Math
. Sqrt ( num
) / 3600 ; try { for ( i
= 0 ; i
< num
; i
++ ) { nowang
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 0 ] . Value
. ToString ( ) ) ; } exang
= nowang
- rawang
; if ( Math
. Abs ( exang
) > error
) { MessageBox
. Show ( "角度閉合差大于允許閉合差" ) ; } else { exang
/ = ( - 1 ) * num
; for ( i
= 0 ; i
< num
; i
++ ) { dgvList
. Rows
[ i
] . Cells
[ 0 ] . Value
= ( Convert
. ToDouble ( dgvList
. Rows
[ i
] . Cells
[ 0 ] . Value
. ToString ( ) ) + exang
) ; } dgvList
. Rows
[ i
] . Cells
[ 0 ] . Value
= "校正" ; } angle_able
= true ; } } catch { } }
計(jì)算坐標(biāo)方位角
在得到坐標(biāo)的增量時(shí),我們需要坐標(biāo)的方位角和測(cè)站的距離,距離已知了,所以這里我們要通過(guò)一個(gè)方法實(shí)現(xiàn)計(jì)算坐標(biāo)的方位角
public double GetAngle ( double lastaziang
, double turnang
, bool RorL
) { double aziang
= 0 ; if ( RorL
== false ) { aziang
= lastaziang
+ 180 - turnang
; } else { aziang
= lastaziang
- 180 + turnang
; } while ( aziang
> 360 || aziang
< 0 ) { if ( aziang
> 360 ) { aziang
- = 360 ; } else if ( aziang
< 0 ) { aziang
+ = 360 ; } } return aziang
; }
計(jì)算坐標(biāo)的增量
坐標(biāo)的增量可以通過(guò)dertX = distance * Math.Cos(azirad)和dertY = distance * Math.Sin(azirad)求得,這個(gè)azirad就是坐標(biāo)方位角的弧度形式 這里的寫法比較簡(jiǎn)單,其中是在datagridview的單元格中直接先計(jì)算放上去的,后面的改正將會(huì)在原來(lái)的基礎(chǔ)數(shù)據(jù)上改正
public void GetVariateDistance ( DataGridView dgvList
, int num
) { int i
; for ( i
= 0 ; i
< num
; i
++ ) { dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
= double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 1 ] . Value
. ToString ( ) ) * Math
. Cos ( double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 3 ] . Value
. ToString ( ) ) / 180 * Math
. PI
) ; dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
= double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 1 ] . Value
. ToString ( ) ) * Math
. Sin ( double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 3 ] . Value
. ToString ( ) ) / 180 * Math
. PI
) ; } }
坐標(biāo)增量的簡(jiǎn)單平差
因?yàn)檫@是一個(gè)閉合導(dǎo)線,所以理論上坐標(biāo)增量的和應(yīng)該為零(又回到最初的起點(diǎn)),然而因?yàn)檎`差的存在并不是這樣的,所以我們要把閉合差(√((∑dertX)^ 2)+ (∑dertY)^ 2)))按照邊長(zhǎng)的比例反其符號(hào)分配給每個(gè)坐標(biāo)增量,量距導(dǎo)線和測(cè)距導(dǎo)線的閉合差一般都小于1/2000,這里我們可以使用這樣處理
public void ExVariateDistance ( DataGridView dgvList
, int num
, double xVariate
, double yVariate
, double distance
) { int i
= 0 ; for ( i
= 0 ; i
< num
; i
++ ) { xVariate
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
. ToString ( ) ) ; yVariate
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
. ToString ( ) ) ; distance
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 1 ] . Value
. ToString ( ) ) ; } xVariate
/ = ( ( - 1 ) * distance
) ; yVariate
/ = ( ( - 1 ) * distance
) ; for ( i
= 0 ; i
< num
; i
++ ) { dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
= ( Convert
. ToDouble ( dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
. ToString ( ) ) + ( xVariate
* Convert
. ToDouble ( dgvList
. Rows
[ i
] . Cells
[ 1 ] . Value
. ToString ( ) ) ) ) ; dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
= ( Convert
. ToDouble ( dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
. ToString ( ) ) + ( yVariate
* Convert
. ToDouble ( dgvList
. Rows
[ i
] . Cells
[ 1 ] . Value
. ToString ( ) ) ) ) ; } dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
= "校正" ; dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
= "校正" ; }
最后就是求坐標(biāo)
這個(gè)就是從已知的那個(gè)起點(diǎn)坐標(biāo)開(kāi)始加坐標(biāo)增量,得到每一個(gè)導(dǎo)線點(diǎn)的坐標(biāo),也就是第二個(gè)點(diǎn)的X坐標(biāo)就是X = startX + dertX,Y坐標(biāo)是Y = startY + dertY。后面的點(diǎn)依次加dert。代碼如下,這里使用(x|y)這樣的格式顯示
public void GetPoint ( double BX
, double BY
, DataGridView dgvList
, int num
) { double X
; double Y
; try { X
= BX
+ double . Parse ( dgvList
. Rows
[ 0 ] . Cells
[ 4 ] . Value
. ToString ( ) ) ; Y
= BY
+ double . Parse ( dgvList
. Rows
[ 0 ] . Cells
[ 5 ] . Value
. ToString ( ) ) ; dgvList
. Rows
[ 0 ] . Cells
[ 6 ] . Value
= "(" + X
+ "|" + Y
+ ")" ; for ( int i
= 1 ; i
< num
; i
++ ) { X
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 4 ] . Value
. ToString ( ) ) ; Y
+ = double . Parse ( dgvList
. Rows
[ i
] . Cells
[ 5 ] . Value
. ToString ( ) ) ; dgvList
. Rows
[ i
] . Cells
[ 6 ] . Value
= "(" + X
+ "|" + Y
+ ")" ; } } catch { } }
做后就完成了,只在豆丁上找了一個(gè)題測(cè)試了一下(見(jiàn)開(kāi)頭)。完整的代碼沒(méi)有貼出來(lái),界面的設(shè)計(jì)也沒(méi)說(shuō)了,還有一些其他的雜七雜八的功能。這是很早之前寫的,中間一些細(xì)節(jié)現(xiàn)在也忘了,之前的代碼寫的不好,但能提供一些參考作用,所以還是記錄下來(lái)
總結(jié)
以上是生活随笔 為你收集整理的有窗体的闭合导线计算程序(C#) 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。