构建规则格网进行体积计算
生活随笔
收集整理的這篇文章主要介紹了
构建规则格网进行体积计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
構建規則格網進行體積計算
- 1.構建規則格網
- 1.1生成所有格網點
- 2.計算體積
- 2.1計算凸包所包含的所有格網點
- 2.2插值計算凸包內格網點的高程
- 2.3計算體積
總體步驟:
構建規則格網進行體積計算的第一大步驟----生成凸包多邊形
生成凸包多邊形又有快速凸包法、Gram Scan法等方法。
在文章[凸包多邊形生成算法—快速凸包法]中,我們根據散點集生成凸包點
本文章進行構建規則格網以及計算體積的介紹
1.構建規則格網
根據散點集計算出的四個頂點,確定規則格網的邊界。
這里可以創建兩個新的類
點類----gridpoint:表示每一個格網中心點對象
格網類----Grid:表示整個格網對象
1.1生成所有格網點
//獲取格網中心點的坐標public void GetGridpoint(List<point> peaks){xmax = (float)peaks[2].x;xmin = (float)peaks[0].x;ymax = (float)peaks[1].y;ymin = (float)peaks[3].y;//格網邊界//搜索半徑r = (ymax - ymin + xmax - xmin) *0.5 * 0.4;int m = (int)((ymax-ymin)/L);//網格數int n = (int)((xmax-xmin)/L);//格網中線點坐標for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){gridpoint gp = new gridpoint();gp.n = 0;gp.x = xmin + j * L + L / 2;gp.y = ymin + i * L + L / 2;gridps.Add(gp);}}}此步得到所有格網點中心的坐標(x,y),不包含h,h由散點插值得到
2.計算體積
第一步:計算凸包所包含的所有格網點
第二步:插值計算凸包所包含的格網點的高程
第三步:根據公式計算體積
2.1計算凸包所包含的所有格網點
格網點類中有個屬性n,用于標識是否在凸包內。
判斷點是否位于凸包內的方法:
for遍歷所有的散點
for遍歷凸包的每一條邊
if(點的y坐標位于邊兩個端點的y之間)//只可能與2或0條邊水平相交 判斷點是否位于線的左側,若是,該點的n 加1;
n == 0 無交點 點在凸包的右側
n == 2 兩個單側邊交點,點位于凸包的左側
n == 1 一個但側邊交點,點位于凸包的內部
2.2插值計算凸包內格網點的高程
對凸包內部的格網點進行插值計算。
注意,這里計算的是格網單元四個頂點的高程
首先需要設置一個搜索半徑,用于搜索待插值點周圍的散點,然后根據反距離權重計算
函數—輸入散點集,待插點坐標,返回待插點高程
//函數---插值計算點高程,進而計算網格頂點高程public double Get_h(List<point> allps ,float X,float Y){double D=0,h_sum=0,D_sum=0;double h;for (int i = 0; i < allps.Count; i++){D = Math.Sqrt((allps[i].x-X)*(allps[i].x - X) +(allps[i].y - Y) *(allps[i].y - Y));if (D<r){//反距離加權D_sum += allps[i].h / D;h_sum += 1 / D;} }h = D_sum / h_sum;return h;}2.3計算體積
//體積計算public double Cal_V(List<point> allps,double h0){double V = 0;for (int i = 0; i < gridps.Count; i++)//遍歷所有網格點{if (gridps[i].n == 1)//凸包內部的點{in_num +=1;//內部點的四個格網頂點高程double h1 = Get_h(allps, gridps[i].x - L / 2, gridps[i].y - L / 2);double h2 = Get_h(allps, gridps[i].x + L / 2, gridps[i].y + L / 2);double h3 = Get_h(allps, gridps[i].x - L / 2, gridps[i].y + L / 2);double h4 = Get_h(allps, gridps[i].x + L / 2, gridps[i].y - L / 2);//計算公式V += ((h1 + h2 + h3 + h4) / 4 - h0) * L * L;}}return V;}總結
以上是生活随笔為你收集整理的构建规则格网进行体积计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5个超棒的HTML5框架
- 下一篇: 使用微信录音将amr转为mp3