生活随笔
收集整理的這篇文章主要介紹了
有窗体的闭合导线计算程序(C#)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在測繪的實際操作中,我們會遇到這樣的一些閉合導線的計算。閉合導線的計算比較復雜,我們如何利用計算機幫助我們快速地計算,這里我們使用C#編寫一個有(好看)界面的導線計算程序
問題 這是我們計算的結果 這是答案的結果
可以看出答案是差不多的,當然存在誤差和計算機保存小數的一些問題有關。下面來看一下如何完成這樣的一個簡單的程序(默認知道閉合導線是怎么計算的)
角度(弧度)的轉換的
這里我們輸入是按照“dd ff mm” 的格式輸入的,需要通過轉換將其轉換為小數形式,然后在計算三角函數時要化為弧度 這里我們用的datagridview控件展示的數據,可以利用split()函數分割里面的單元格得到度分秒,通過這個公式得到角度
angle
= D
+ F
/ 60 + M
/ 3600 ;
至于計算時的弧度,高中就知道可以這樣完成
radian
= angle
/ 180 * Math
. PI
;
計算角度的閉合差并分配誤差
一個n邊形的內角和是(n-2)*180度,但實際在測量中,肯定得不到準確的這個數據,所以我們需要計算閉合差并將其分配,使內角和等于理論值。這里的允許誤差是40√n,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 { } }
計算坐標方位角
在得到坐標的增量時,我們需要坐標的方位角和測站的距離,距離已知了,所以這里我們要通過一個方法實現計算坐標的方位角
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
; }
計算坐標的增量
坐標的增量可以通過dertX = distance * Math.Cos(azirad)和dertY = distance * Math.Sin(azirad)求得,這個azirad就是坐標方位角的弧度形式 這里的寫法比較簡單,其中是在datagridview的單元格中直接先計算放上去的,后面的改正將會在原來的基礎數據上改正
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
) ; } }
坐標增量的簡單平差
因為這是一個閉合導線,所以理論上坐標增量的和應該為零(又回到最初的起點),然而因為誤差的存在并不是這樣的,所以我們要把閉合差(√((∑dertX)^ 2)+ (∑dertY)^ 2)))按照邊長的比例反其符號分配給每個坐標增量,量距導線和測距導線的閉合差一般都小于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
= "校正" ; }
最后就是求坐標
這個就是從已知的那個起點坐標開始加坐標增量,得到每一個導線點的坐標,也就是第二個點的X坐標就是X = startX + dertX,Y坐標是Y = startY + dertY。后面的點依次加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 { } }
做后就完成了,只在豆丁上找了一個題測試了一下(見開頭)。完整的代碼沒有貼出來,界面的設計也沒說了,還有一些其他的雜七雜八的功能。這是很早之前寫的,中間一些細節現在也忘了,之前的代碼寫的不好,但能提供一些參考作用,所以還是記錄下來
總結
以上是生活随笔 為你收集整理的有窗体的闭合导线计算程序(C#) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。