【问题标题】:Discrete fluid "filling" algorithm for a height map高度图的离散流体“填充”算法
【发布时间】:2012-09-05 17:04:13
【问题描述】:

我正在寻找一种算法来描述流体在高度图表面上传播时的瞬态行为。我在 t=0 的起始条件是:

  • 高度值 (H) 的二维矩阵,大小为 [x, y]
  • 大小为 [x, y] 的流体高度值 (F) 的二维矩阵
  • 矩阵 (a) 中每个点的面积度量,即每个位置为 1 cm^2
  • 流体的粘度值 (u)

我想要的是一种算法,它可以在 t'=t+1 处计算流体高度矩阵 F 的新值。在任何时候,我都可以通过 v = a * (F(x,y) - H(x, y)) 计算给定点的流体体积。该算法的理想特性是:

  • 不需要考虑每个点的流体柱顶部或底部的“坡度”或“形状”。即它可以将 hieghtmap 中的每个值视为描述某个高度的平面正方形,并将流体高度图的每个值视为具有平顶的矩形水柱
  • 如果遇到“排水管”(即高度图中的一个非常低的点),来自地图所有部分的流体在被拉向它时可能会受到影响。

我正在寻找的一个简单示例如下:

  • 一个 5x5 高度图矩阵,其中所有值都是 0
  • 一个 5x5 流体高度图矩阵,其中除 [2, 2] 为 10 外,所有值均为 0。
  • 每点 1 m^2 的面积
  • 粘度为u

该算法将描述在多个时间步长上在 5x5 矩阵上展开的流体“列”。最终,该算法将在所有位置稳定在 10/25 的统一高度,但我真的对两者之间发生的事情很感兴趣。

我试图搜索这种算法,但我只能找到描述流体内部粒子行为的方程,这对于我的目的来说太细化了。有谁知道我可以参考这个问题的任何好的资源,或者可能满足我需求的现有算法。

【问题讨论】:

  • 嗯。一个非常有趣的问题!不过,我不知道如何在不使用与流体相关的物理方程的情况下准确地模拟流体的运动。例如,为了显示最终结果所采取的步骤,您的水对象必须被分成几部分。这些碎片对你来说有多小?你必须为你使用的任何大小的块想出一个模型,CFD 是一个很好的话题 - 但通常模拟粒子或块不会大很多。
  • 你试过flood-fill吗? 8^)
  • 更严重的是,您应该查找偏微分方程 (PDE),以及将它们离散为规则网格的方法。您需要仔细考虑要模拟的确切行为(例如,如果流体动量很大,这会给您带来波浪和涟漪)。

标签: algorithm simulation fluid-dynamics


【解决方案1】:
O is your starting fluid-column
o are diffusing columns
************************
X  X  X  X  X

X  X  X  X  X

X  X  O  X  X

X  X  X  X  X

X  X  X  X  X  
************************
--Get the Laplacian of the heights of each neighbour and accumulate results
in a separate matrix
--Then apply the second matrix into first one to do synchronous diffusion
--go to Laplacian step again and again


************************
X  X  X  X  X

X  X  o  X  X

X  o  O  o  X

X  X  o  X  X

X  X  X  X  X  
************************


************************
X  X  .  X  X

X  .  o  .  X

.  o  O  o  .

X  .  o  .  X

X  X  .  X  X  
************************
************************
X  X  .  X  X

X  o  o  o  X

.  o  o  o  .

X  o  o  o  X

X  X  .  X  X  
************************


************************
X  X  .  X  X

X  o  o  o  X

.  o  o  o  .

X  o  o  o  X

X  X  .  X  X  
************************

************************
X  .  o  .  X

.  o  o  o  .

o  o  o  o  o

.  o  o  o  .

X  .  o  .  X  
************************
************************
.  .  .  .  .

.  o  o  o  .

.  o  o  o  .

.  o  o  o  .

.  .  .  .  .  
************************
************************
.  .  .  .  .

.  .  .  .  .

.  .  o  .  .

.  .  .  .  .

.  .  .  .  .  
************************
************************
.  .  .  .  .

.  .  .  .  .

.  .  .  .  .

.  .  .  .  .

.  .  .  .  .  
************************
sorry for very low height-resolution

Laplacian

Laplacian's place in diffusion

Diffusion's place in Navier-Stokes equations

Discrete Laplace Operator

简单算法(伪):

get a cell's value in a.
get neighbour cells' values in b(sum of them)
put b/4.0 in c(getting 4 cells' values)
add a to c
build a matrix with this algorithm
apply the matrix onto old one
goto step 1

更难的算法(伪):

apply discrete-Laplacian-operator on all neighbours(finite-differences thing)
put solution in c height-map
subtract or add c to/from starting height-map
goto step 1

Jos Stam's fluid-solver的扩散部分也有类似的东西。

【讨论】:

  • 有趣。我对此进行了一些研究,但我真的无法让离散的拉普拉斯算子为我工作。例如,在具有 [ 0, 0, 10, 0, 0 ] 并应用一维离散拉普拉斯算子的一​​维情况下,我得到 [0, 10, -10, 10, 0] 作为 t+1 的结果。
  • 阅读那些 Wikipedia 文章让我想起了卷积运算,所以我尝试了一些方法。对于 [0.1, 0.8, 0.1] 的内核,我的 t=1 的结果是 [0, 1, 8, 1, 0] 并且 t=2 是 [0.1, 1.6, 6.6, 1.6, 0.1]。请参阅 (link)。看起来很有希望。
  • 您一定是在离散拉普拉斯算子中选择了太大的 h 方,并且必须存在同样小的时间乘数。但是你的卷积是合乎逻辑的。玩得开心。
猜你喜欢
  • 2015-01-01
  • 2017-06-18
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2012-02-08
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多