使用 Python 實現隨機中點位移法生成逼真的裂隙面

使用 Python 實現隨機中點位移法生成逼真的裂隙面

  • 一、隨機中點位移法簡介
    • 1. 什么是隨機中點位移法?
    • 2. 應用領域
  • 二、 Python 代碼實現
    • 1. 導入必要的庫
    • 2. 函數定義:隨機中點位移法核心邏輯
    • 3. 設置隨機數種子
    • 4. 初始化二維裂隙面
    • 5. 初始化網格的四個頂點
    • 6. 初始化步長
    • 7. 開始迭代生成裂隙面
    • 8. 鉆石步( Diamond Step )
    • 9. 方形步( Square Step )
    • 10. 更新步長和粗糙度
    • 11. 返回最終結果
    • 12. 調用函數并可視化結果
  • 三、完整代碼
  • 四、結果展示與分析
  • 五、擴展與應用
    • 1. 三維裂隙面生成
    • 2. 工程領域應用
    • 3. 性能優化

裂隙面在地質學、巖石力學、計算機圖形學等領域有著廣泛的應用。它們的隨機性和分形特性使得模擬真實裂隙面成為一項重要的研究課題。本文將通過 Python ,結合經典的 隨機中點位移法( Random Midpoint Displacement , RMD ),逐步創建一個二維的隨機裂隙面,并詳細解析每一步代碼的實現過程。

先看下效果圖:
在這里插入圖片描述


一、隨機中點位移法簡介

1. 什么是隨機中點位移法?

隨機中點位移法是一種簡單且高效的分形生成算法。它的基本思想是從一個大尺度開始,通過不斷細化網格,并在每次細化時為中間點添加隨機擾動,從而生成具有大尺度結構和小尺度細節的表面。

這一方法的特點是:

  • 高效性:算法復雜度較低,適合生成大規模的表面。
  • 隨機性:通過隨機擾動,模擬自然界中裂隙、地形等不規則表面的特性。
  • 分形特性:生成的結果具有分形維數,能很好地模擬自然界的粗糙表面。

2. 應用領域

  • 地質學:生成裂隙面,用于研究地下水流動、巖石的強度和穩定性。
  • 計算機圖形學:生成自然地貌(如山脈、地形)或粗糙材質。
  • 工程應用:模擬裂隙網絡,分析裂隙對滲透率的影響。

二、 Python 代碼實現

讓我們直接進入代碼部分,并通過逐行詳解,幫助你全面掌握隨機中點位移法的實現。


1. 導入必要的庫

import numpy as np
import matplotlib.pyplot as plt
  • numpy :用于處理多維數組和數學計算。我們將借助它來創建二維數組并進行隨機數生成。
  • matplotlib.pyplot :用于可視化生成的裂隙面。這是 Python 中非常強大的繪圖庫。

2. 函數定義:隨機中點位移法核心邏輯

def midpoint_displacement_2d(size, roughness, seed=None):"""使用隨機中點位移法生成二維粗糙裂隙面。參數:- size: 裂隙面的網格尺寸(必須是2的冪次方+1,例如65, 129, 257等)。- roughness: 粗糙度參數,控制表面的起伏程度。- seed: 隨機數種子,用于生成可重復的結果。返回值:- surface: 生成的二維裂隙面。"""

函數說明

  • size :二維數組的大小,必須為 2^n + 1 (如 129 , 257 等)。這種結構使網格能夠在每次迭代中被整齊地細分。
  • roughness :粗糙度參數,控制生成裂隙面的起伏程度。值越大,表面越粗糙;值越小,表面越平滑。
  • seed :隨機數種子,用于確保生成的結果是可重復的。指定種子后,每次運行都會生成相同的裂隙面。

3. 設置隨機數種子

    if seed is not None:np.random.seed(seed)

解釋

  • 如果用戶提供了 seed 值,那么我們使用 np.random.seed(seed) 設置隨機數生成器的種子。
  • 這樣可以確保生成的隨機數序列是固定的,從而保證結果的可重復性。

4. 初始化二維裂隙面

    surface = np.zeros((size, size))
  • np.zeros((size, size)) :創建一個大小為 (size, size) 的二維數組,初始值全為 0
  • 這個數組將表示裂隙面的高度值,每一個元素對應網格的一個節點。

5. 初始化網格的四個頂點

    surface[0, 0] = np.random.uniform(-1, 1)surface[0, -1] = np.random.uniform(-1, 1)surface[-1, 0] = np.random.uniform(-1, 1)surface[-1, -1] = np.random.uniform(-1, 1)

解釋

  • 隨機為二維數組的四個角點賦值,值范圍為 [-1, 1]
  • 這四個頂點值將作為整個裂隙面生成的初始條件。

6. 初始化步長

    step_size = size - 1

解釋

  • 設置初始步長為 size - 1
  • 步長是指當前迭代中,用于分割網格的大小。在每次迭代中,步長會減半,從而逐步細化網格。

7. 開始迭代生成裂隙面

    while step_size > 1:half_step = step_size // 2

解釋

  • 使用 while 循環,直到步長小于或等于 1
  • 在每次循環中,計算半步長 half_step = step_size // 2 ,用于在網格的中點和邊界點之間插值。

8. 鉆石步( Diamond Step )

        for x in range(0, size - 1, step_size):for y in range(0, size - 1, step_size):avg = (surface[x, y]+ surface[x + step_size, y]+ surface[x, y + step_size]+ surface[x + step_size, y + step_size]) / 4surface[x + half_step, y + half_step] = avg + np.random.uniform(-1, 1) * roughness

說明

  • 目標:為每個網格單元的中心點生成一個新值。
  • avg :計算當前網格四個頂點的平均值。
  • np.random.uniform(-1, 1) * roughness :添加一個隨機擾動,其幅度由 roughness 控制。
  • 更新后的值存儲在網格的中心點位置 surface[x + half_step, y + half_step]

9. 方形步( Square Step )

        for x in range(0, size - 1, half_step):for y in range((x + half_step) % step_size, size - 1, step_size):avg = 0count = 0if x - half_step >= 0:avg += surface[x - half_step, y]count += 1if x + half_step < size:avg += surface[x + half_step, y]count += 1if y - half_step >= 0:avg += surface[x, y - half_step]count += 1if y + half_step < size:avg += surface[x, y + half_step]count += 1surface[x, y] = avg / count + np.random.uniform(-1, 1) * roughness

說明

  • 目標:為網格的每條邊界點生成一個新值。
  • 通過計算邊界點相鄰的點的平均值,并添加隨機擾動,為邊界點賦值。

10. 更新步長和粗糙度

        step_size //= 2roughness /= 2

說明

  • 每次迭代后,步長減半,逐步細化網格。
  • 同時,降低隨機擾動幅度(粗糙度),使得細節更平滑。

11. 返回最終結果

    return surface

說明

  • 返回生成的裂隙面(二維數組)。

12. 調用函數并可視化結果

size = 129
roughness = 1.0
seed = 42
surface = midpoint_displacement_2d(size, roughness, seed)plt.figure(figsize=(10, 8))
plt.imshow(surface, cmap='terrain', origin='upper')
plt.colorbar(label="Height")
plt.title("Random Midpoint Displacement Surface")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()

說明

  • 參數:
    - size=129 :網格大小為 129 × 129
    - roughness=1.0 :初始粗糙度。
    - seed=42 :隨機種子,用于生成可復現的結果。
  • 使用 matplotlib 繪制結果:
    - imshow :展示二維裂隙面。
    - cmap='terrain' :用地形色彩映射模擬裂隙表面。

三、完整代碼

import numpy as np
import matplotlib.pyplot as pltdef midpoint_displacement_2d(size, roughness, seed=None):"""使用隨機中點位移法生成二維粗糙裂隙面。參數:- size: 裂隙面的網格尺寸(必須是2的冪次方+1,例如65, 129, 257等)。- roughness: 粗糙度參數,控制表面的起伏程度。- seed: 隨機數種子,用于生成可重復的結果。返回值:- surface: 生成的二維裂隙面。"""if seed is not None:np.random.seed(seed)# 初始化一個二維數組,并將四個頂點隨機賦值surface = np.zeros((size, size))surface[0, 0] = np.random.uniform(-1, 1)surface[0, -1] = np.random.uniform(-1, 1)surface[-1, 0] = np.random.uniform(-1, 1)surface[-1, -1] = np.random.uniform(-1, 1)step_size = size - 1  # 初始步長while step_size > 1:half_step = step_size // 2# 鉆石步:計算中點值for x in range(0, size - 1, step_size):for y in range(0, size - 1, step_size):avg = (surface[x, y]+ surface[x + step_size, y]+ surface[x, y + step_size]+ surface[x + step_size, y + step_size]) / 4surface[x + half_step, y + half_step] = avg + np.random.uniform(-1, 1) * roughness# 方形步:計算邊點值for x in range(0, size - 1, half_step):for y in range((x + half_step) % step_size, size - 1, step_size):avg = 0count = 0if x - half_step >= 0:avg += surface[x - half_step, y]count += 1if x + half_step < size:avg += surface[x + half_step, y]count += 1if y - half_step >= 0:avg += surface[x, y - half_step]count += 1if y + half_step < size:avg += surface[x, y + half_step]count += 1surface[x, y] = avg / count + np.random.uniform(-1, 1) * roughness# 縮小步長,并降低粗糙度比例step_size //= 2roughness /= 2return surface# 參數設置
size = 129  # 網格尺寸(2^n + 1,例如65, 129, 257)
roughness = 1.0  # 粗糙度系數
seed = 42  # 隨機種子(可選)# 生成裂隙面
surface = midpoint_displacement_2d(size, roughness, seed)# 繪制裂隙面
plt.figure(figsize=(10, 8))
plt.imshow(surface, cmap='terrain', origin='upper')
plt.colorbar(label="Height")
plt.title("Random Midpoint Displacement Surface")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()

四、結果展示與分析

運行上述代碼后,你將看到一個二維裂隙面,具有隨機的高低起伏,形似真實的自然裂隙。裂隙面的粗糙度參數和網格分辨率可以根據需要調整,以滿足不同的應用場景。

在這里插入圖片描述


五、擴展與應用

1. 三維裂隙面生成

將此方法擴展到三維數組,可以生成更加復雜的三維裂隙網絡。

2. 工程領域應用

模擬裂隙對流體流動的影響,分析裂隙面在接觸力學中的作用。

3. 性能優化

使用并行計算或 GPU 加速,可以快速生成高分辨率的裂隙面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64883.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql之組內排序ROW_NUMBER()函數

有個需求&#xff0c;需要組內排序&#xff0c;之前似乎從未接觸過此類排序&#xff0c;故查詢了一下&#xff0c;記錄sql執行結果。 表如下&#xff1a; play_log: 日期 (fdate)用戶 ID (user_id)歌曲 ID (song_id)2022-01-081000002022-01-161000002022-01-201000002022-0…

Android TV端彈出的PopupWindow沒有獲取焦點

在 TV 開發中&#xff0c;焦點管理是通過 Focus Navigation 實現的&#xff0c;PopupWindow 默認不接受焦點&#xff0c;導致遙控器無法選擇彈窗內的控件。這是因為 PopupWindow 默認不會將焦點傳遞到其內容視圖上。 要解決問題&#xff0c;可以通過以下步驟調整 PopupWindow …

活動預告 | Microsoft Power Platform 在線技術公開課:實現業務流程自動化

課程介紹 參加“Microsoft Power Platform 在線技術公開課&#xff1a;實現業務流程自動化”活動&#xff0c;了解如何更高效地開展業務。參加我們舉辦的本次免費培訓活動&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 優化工作流。結合使用這些工具可以幫…

FPGA(二)組成結構基礎內容

1. FPGA的基本結構 FPGA主要由以下部分組成&#xff1a; &#xff08;1&#xff09;可編程邏輯單元&#xff08;CLB&#xff09;&#xff1a;CLB是FPGA中最基本的邏輯單元&#xff0c;由查找表&#xff08;LUT&#xff09;和觸發器組成&#xff0c;可實現任意邏輯功能。查找表…

LLM(十二)| DeepSeek-V3 技術報告深度解讀——開源模型的巔峰之作

近年來&#xff0c;大型語言模型&#xff08;LLMs&#xff09;的發展突飛猛進&#xff0c;逐步縮小了與通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 團隊最新發布的 DeepSeek-V3&#xff0c;作為一款強大的混合專家模型&#xff08;Mixture-of-Experts, MoE&a…

el-pagination 為什么只能展示 10 條數據(element-ui@2.15.13)

好的&#xff0c;我來幫你分析前端為什么只能展示 10 條數據&#xff0c;以及如何解決這個問題。 問題分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 組件中&#xff0c;pageSize 的值被設置為 10&#xff1a;<el-pagination:current-page"current…

TCP網絡編程(一)—— 服務器端模式和客戶端模式

這篇文章將會編寫基本的服務器網絡程序&#xff0c;主要講解服務器端和客戶端代碼的原理&#xff0c;至于網絡名詞很具體的概念&#xff0c;例如什么是TCP協議&#xff0c;不會過多涉及。 首先介紹一下TCP網絡編程的兩種模式&#xff1a;服務器端和客戶端模式&#xff1a; 首先…

C# 設計模式(行為型模式):責任鏈模式

C# 設計模式&#xff08;行為型模式&#xff09;&#xff1a;責任鏈模式 責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為型設計模式&#xff0c;用于讓多個對象有機會處理同一個請求&#xff0c;避免請求發送者與接收者之間的耦合。它通過將請…

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;對于一些基礎能力較弱的群體來說K8S控制面板操作存在一定的難度&#xff0c;此時kubesphere可以有效的解決這類難題。以下是部署kubesphere的操作步驟&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存儲目錄 yum -y install nfs-server e…

CSS系列(43)-- Anchor Positioning詳解

前端技術探索系列&#xff1a;CSS Anchor Positioning詳解 &#x1f3af; 致讀者&#xff1a;探索智能定位的藝術 &#x1f44b; 前端開發者們&#xff0c; 今天我們將深入探討 CSS Anchor Positioning&#xff0c;這個強大的元素定位特性。 基礎概念 &#x1f680; 錨點設…

Python判別不同平臺操作系統調用相應的動態庫讀寫NFC

本示例使用的發卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bV0E4YV&ftt&id615391857885 import sys import struct # struct的pack函數把任意數據類型變成字符串 import ctypes # 調用DLL動態庫要有這個引用if sys.platform…

樹莓派之旅-第一天 系統的燒錄和設置

自言自語&#xff1a; 在此記錄一下樹莓派的玩法。以后有錢了買點來玩啊草 系統的安裝燒錄 系統下載 樹莓派官網&#xff1a;https://www.raspberrypi.com/ 首頁點擊SoftWare進入OS下載頁面 這里是安裝工具&#xff1a;安裝工具負責將系統鏡像安裝到sd卡中 點擊下載符合自己…

商用車自動駕駛,迎來大規模量產「臨界點」?

商用車自動駕駛&#xff0c;正迎來新的行業拐點。 今年初&#xff0c;交通部公開發布AEB系統運營車輛標配征求意見稿&#xff0c;首次將法規限制條件全面放開&#xff0c;有望推動商用車AEB全面標配&#xff0c;為開放場景的商用車智能駕駛市場加了一把火。 另外&#xff0c;…

人工智能及深度學習的一些題目

1、一個含有2個隱藏層的多層感知機&#xff08;MLP&#xff09;&#xff0c;神經元個數都為20&#xff0c;輸入和輸出節點分別由8和5個節點&#xff0c;這個網絡有多少權重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;權重是連接神經元的參數&#xff0c;每個連接都有一…

Solon 加入 GitCode:助力國產 Java 應用開發新飛躍

在當今數字化快速發展的時代&#xff0c;Java 應用開發框架不斷演進&#xff0c;開發者們始終在尋找更快、更小、更簡單的解決方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;為廣大 Java 開發者帶來全新的開發體驗&#xff0c;尤其是在國產應用開發進程中&#xff…

VScode 只能運行c,運行不了c++的解決問題

原文鏈接&#xff1a;Vscode只能運行c&#xff0c;運行不了c的解決方法 VScode 只能運行c&#xff0c;運行不了c&#xff0c;怎么回事呢&#xff0c;解決問題&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 這樣之后 要重啟VScode&#xff0c;點擊鏈接…

Ansible Jinja2 語法簡介及使用

1、Jinja2 介紹 Jinja2 是基于 python 的模板引擎&#xff0c;功能比較類似于 PHP 的 smarty&#xff0c;J2ee 的 Freemarker和velocity。它能完全支持unicode&#xff0c;并具有集成的沙箱執行環境&#xff0c;應用廣泛。 jinja2使用BSD授權 Jinja2的語法是由 variables(變量…

SpringCloud系列教程:微服務的未來 (五)枚舉處理器、JSON處理器、分頁插件實現

在現代 Java 開發中&#xff0c;我們常常需要處理各種通用的功能和需求&#xff0c;諸如枚舉的處理、JSON 數據處理&#xff0c;以及分頁查詢等。這些功能雖然看似簡單&#xff0c;但在實際開發中往往涉及到許多細節和優化。為了提高開發效率、減少重復代碼的編寫&#xff0c;我…

游戲引擎學習第69天

回顧碰撞響應時我們停留的位置 從昨天的討論開始&#xff0c;我們正準備處理碰撞響應的復雜性。具體來說&#xff0c;我們討論的是&#xff0c;當兩個實體在屏幕上發生碰撞時&#xff0c;如何回應這種情況。碰撞本身并不復雜&#xff0c;但要處理其后的反應和規則則更具挑戰性…

【Linux】信號處理

一、Linux系統信號 1、常見的系統信號 常見的Linux系統信號 信號值描述1SIGHUP掛起&#xff08;hang up&#xff09;進程2SIGINT中斷進&#xff08;interrupt&#xff09;程3SIGQUIT停止&#xff08;stop&#xff09;進程9SIGKILL無條件終止&#xff08;terminate&#xff09;…