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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

构建规则格网进行体积计算

發布時間:2024/3/26 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构建规则格网进行体积计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

構建規則格網進行體積計算

    • 1.構建規則格網
      • 1.1生成所有格網點
    • 2.計算體積
      • 2.1計算凸包所包含的所有格網點
      • 2.2插值計算凸包內格網點的高程
      • 2.3計算體積

總體步驟:

  • 生成凸包多邊形
  • 構建規則格網
  • 計算體積
  • 構建規則格網進行體積計算的第一大步驟----生成凸包多邊形
    生成凸包多邊形又有快速凸包法、Gram Scan法等方法。

    在文章[凸包多邊形生成算法—快速凸包法]中,我們根據散點集生成凸包點
    本文章進行構建規則格網以及計算體積的介紹

    1.構建規則格網

    根據散點集計算出的四個頂點,確定規則格網的邊界。

    這里可以創建兩個新的類
    點類----gridpoint:表示每一個格網中心點對象
    格網類----Grid:表示整個格網對象

    class gridpoint{public float x,y,h;public int n;//標記網格點是否在凸包內。1在,0或2不在}class Grid{//格網的xmax,xmin,ymax,ymin從peaks中獲取public float xmax, xmin, ymax, ymin;public float L;//網格邊長public double r;//搜索半徑public int in_num;//凸包內網格數public List<gridpoint> gridps = new List<gridpoint>();//所有格網點g}//方法在文章后面給出

    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 一個但側邊交點,點位于凸包的內部

    //函數---判斷點是否在線左邊public int judge(gridpoint a,point b,point c){double m = (c.x - b.x) / (c.y - b.y) * (a.y - b.y) + b.x;if (m > a.x)//點a在線bc左邊,單線交點+1{return 1;}elsereturn 0;}//函數---判斷點是否在凸包內public void Find_in(List<point> convex){for (int i = 0; i < gridps.Count; i++)//遍歷每一個網格點{for (int j = 0; j < convex.Count-1; j++)//遍歷凸包點{if (gridps[i].y<Math.Max(convex[j].y, convex[j+1].y)&&gridps[i].y>=Math.Min(convex[j].y, convex[j + 1].y)){gridps[i].n += judge(gridps[i], convex[j], convex[j + 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;}

    總結

    以上是生活随笔為你收集整理的构建规则格网进行体积计算的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。