基於DEM模擬淹沒區域隨時間推演的實現研究

2021-08-21 14:18:54 字數 1856 閱讀 8917

基本思路是將大壩位址作為初始點,不斷向周圍8領域擴散,搜尋能夠被淹沒的畫素點,標記被淹沒。重複以上過程,直到整個dem區域計算完畢。

其中p(i,j)作為原始擴散點,搜尋其周圍八個畫素,滿足條件c則標記為淹沒點,其中條件c定義如下:

1.其高程小於特定淹沒高度

2.其高程小於p(i,j)的高程

以上兩個條件滿足其一即可。

被標記為淹沒點的畫素記錄下來,作為下一輪的原始點繼續進行八領域擴散計算。

為了體現時間推演的效果,該演算法中新增了floodlevel變數用於記錄每個淹沒點的淹沒層級,比如起始點大壩位址的floodlevel為1,其周圍淹沒點的floodlevel為2,再次擴散的淹沒點floodlevel為3,依此類推,最後生成一張floodlevel柵格圖,其值大於0的則認為被淹沒區域,而floodlevel值不同代表不同時間點新增的淹沒區:

從圖中可以看出,該方法在平原地區擴散呈現方形邊界,這並不符合實際水流的擴散方式,實際水流入平原應該呈現一種類似圓形的擴散圖形。

這是比較理想的狀態,即不考慮平原地區每個畫素點之間高程的微小差別。

呈現方形擴散,而不是圓形擴散的原因是八領域擴散方法每次計算floodlevel時都是在原始點的基礎上加1,而沒有考慮到每個點離中心點的距離不一樣,而且每次計算時,中心點的位置發生了改變,而類似水波紋的同心圓狀擴散的中心點位置是一樣的。

演算法改進的基本思路是每次計算floodlevel時,不再是在上乙個點的floodlevel基礎上加1,而是順藤摸瓜找到最原始的點,然後計算距原始點的距離s,實際的floodlevel為原始點的floodlevel+s。

需要找到這兩個畫素點中間相隔的畫素點,然後依此判定這些畫素點是否被淹沒,有乙個未被淹沒則返回false,退出迴圈。

此處認為八領域內所有畫素都是和中心點相鄰的,所以像如下圖中紅色的兩個點認為相鄰。

如下圖所示,圖中兩個紅色方格的中間相隔畫素為黃色的方格:

其計算的方法為:

1.判斷兩個畫素分別在x、y軸方向上相差的距離(即畫素個數)

2.選擇上一步中相差距離最大的那個方向作為基準方向

3.在基準方向上由起始點乙個畫素乙個畫素的移動,計算出對應的另乙個方向的畫素位置,兩個方向的畫素位置合起來定義了乙個點的位置

4.重複步驟3得出所有中間點

**請見:

計算結果體現了良好的效果:

上圖中大壩起始點的第一處水流向拐彎處可以看出較上次計算有了明顯的改觀,水的前沿部分形狀開始隨著水流方向的改變而改變:

基於DEM的坡度坡向分析

坡度坡向分析方法 坡度 slope 是地面特定區域高度變化比率的量度。坡度的表示方法有百分比法 度數法 密位法和分數法四種,其中以百分比法和度數法較為常用。本文計算的為坡度百分比資料。如當角度為45度 弧度為 4 時,高程增量等於水平增量,高程增量百分比為100 坡向 aspect 是指地形坡面的朝...

基於PhysX的流體模擬

physx作為全球最優秀的物理引擎之一,在被顯示卡老大nvidia公司收購之後,越來越受到人們的關注。前不久,nvidia公司發布了乙個支援physx cuda的顯示卡驅動,從而正式向世人宣告,乙個用顯示卡來進行物理加速的時代將要到來。我們來看一下如何用physx開發包,來實現流體的模擬。physx...

基於OSG的布料模擬

進來腦海中突然想寫個布料模擬的程式,由於自己在現在是研究生,方向也是計算機圖形方面,所以說覺得實現這個布料模擬還是很容易的。然後就動手做了。剛開始的時候,我並沒有著手寫 而是去查詢些相關的 查詢了 以後,發現布料的模擬也確實簡單,簡述來說就是內力分析,外力分析 風力,空氣阻力等等 然後顯示。當然碰撞...