我试图理解一段来自paper concerning fluid simulations for games的代码。我正在研究解决边界条件的方法。由于我不了解C ++,因此遇到了其他困难。
据我了解:
IX(i, j)
代表一个二维网格,其x方向位于i
,y方向上的j
u[IX(i, j)]
就是(i
,j
)像元中的速度
以下宏用于IX(i, j)
:
#define IX(i, j) ((i) + (N + 2) * (j))
答案 0 :(得分:2)
我不会尝试浏览整篇论文,但是我可以解释一下 语法,并对发生的情况做出一些有根据的猜测。
#define IX(i,j) ((i)+(N+2)*(j))
在我看来,这就像他们正在转换二维坐标
i,j
进入一维数组索引。 j
是行号,i
是列号,与您的描述相对应,以及总数
列数为N+2
。
0 1 2 ... (N+2)-1
(N+2)+0 (N+2)+1 (N+2)+2 ... 2(N+2)-1
...
那么我们有这个:
x[IX(0,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)]
在C中,a ? b : c
表示如果a,b或c 。这是一个表达方式
值取决于b
是否为c
或a
。
它称为三元运算符,了解更多here。
Python有其自己的三元运算符,其操作数位于不同的位置 订单:
b if a else c
所以x[IX(0,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)]
等效于
说:
if (b == 1)
x[IX(0,i)] = -x[IX(1,i)]
else
x[IX(0,i)] = x[IX(1,i)]
因此,在第i
行中,第0列的新值是第1列的值
可能被否定。从第10页来看,这似乎有事可做
与边界。这是在左边缘,因此我们将其设置为
向内一个单元格的值,或者取反,取决b
。
希望这可以使事情有所清除。