日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

有窗体的闭合导线计算程序(C#)

發(fā)布時間:2023/11/30 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有窗体的闭合导线计算程序(C#) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在測繪的實際操作中,我們會遇到這樣的一些閉合導線的計算。閉合導線的計算比較復雜,我們?nèi)绾卫糜嬎銠C幫助我們快速地計算,這里我們使用C#編寫一個有(好看)界面的導線計算程序

問題

這是我們計算的結(jié)果

這是答案的結(jié)果

可以看出答案是差不多的,當然存在誤差和計算機保存小數(shù)的一些問題有關。下面來看一下如何完成這樣的一個簡單的程序(默認知道閉合導線是怎么計算的)

角度(弧度)的轉(zhuǎn)換的

  • 這里我們輸入是按照“dd ff mm” 的格式輸入的,需要通過轉(zhuǎn)換將其轉(zhuǎn)換為小數(shù)形式,然后在計算三角函數(shù)時要化為弧度
    這里我們用的datagridview控件展示的數(shù)據(jù),可以利用split()函數(shù)分割里面的單元格得到度分秒,通過這個公式得到角度
  • angle = D + F / 60 + M / 3600; // 度分秒轉(zhuǎn)換為度

    至于計算時的弧度,高中就知道可以這樣完成

    radian = angle / 180 * Math.PI; // 角度轉(zhuǎn)弧度

    計算角度的閉合差并分配誤差

  • 一個n邊形的內(nèi)角和是(n-2)*180度,但實際在測量中,肯定得不到準確的這個數(shù)據(jù),所以我們需要計算閉合差并將其分配,使內(nèi)角和等于理論值。這里的允許誤差是40√n,n是測站數(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{ } }

    計算坐標方位角

  • 在得到坐標的增量時,我們需要坐標的方位角和測站的距離,距離已知了,所以這里我們要通過一個方法實現(xiàn)計算坐標的方位角
  • 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的單元格中直接先計算放上去的,后面的改正將會在原來的基礎數(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);}}

    坐標增量的簡單平差

  • 因為這是一個閉合導線,所以理論上坐標增量的和應該為零(又回到最初的起點),然而因為誤差的存在并不是這樣的,所以我們要把閉合差(√((∑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{ }}

    做后就完成了,只在豆丁上找了一個題測試了一下(見開頭)。完整的代碼沒有貼出來,界面的設計也沒說了,還有一些其他的雜七雜八的功能。這是很早之前寫的,中間一些細節(jié)現(xiàn)在也忘了,之前的代碼寫的不好,但能提供一些參考作用,所以還是記錄下來

    總結(jié)

    以上是生活随笔為你收集整理的有窗体的闭合导线计算程序(C#)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。