我在研究你的水波程序时,认真的进行了研究了很长时间,我觉得网上流传的水波算法在推理的过程中有一些问题值得商榷。
1。你推出公式4a+b=1的前提是能量守恒,水波的振幅之和不发生变化.
如果真是能量守恒的话,应该是a=1/4,b=0
这是因为该点的能量全部传给四周,而中心的能量传出去了。
而若取a=1/2,b=-1则实际效果是能量增加,虽然振幅之和不变,但整个数据越来越大,振幅不断增加。中心点这么大的能量不足以产生这么大的振幅。
而实质上能量正比于振幅的平方。
2.
你的波能函数核心是:
Buf2(i, j) = (Buf1(i, j - 1) + Buf1(i - 1, j) + Buf1(i + 1, j) + Buf1(i, j + 1)) /2 -
Buf2(i, j)
’实质是Buf2(i,j)下一时刻的能量是周围四点的能量的一半减去Buf2(i,j)
上上一次的能量。
Buf2(i, j) = Buf2(i, j) - Buf2(i, j) /32
Swap(Buf1,Buf2)
而不是你公式里所推导的:
Buf2(i, j) = (Buf1(i, j - 1) + Buf1(i - 1, j) + Buf1(i + 1, j) + Buf1(i, j + 1)) /2 –
Buf1(i, j)
’实质是Buf2(i,j)下一时刻的能量是周围四点的能量的一半减去Buf2(i,j)
上一次的能量。
Buf2(i, j) = Buf2(i, j) - Buf2(i, j) /32
Swap(Buf1,Buf2) ;若是Buf1这一步已有没有对结果无影响。
式子一: 'buf2(i, j) = (buf1(i - 1, j) + buf1(i + 1, j) + buf1(i, j - 1) + buf1(i, j + 1)) / 2 - buf2(i, j)
式子二: buf2(i, j) = Sqr((buf1(i - 1, j) ^ 2 + buf1(i + 1, j) ^ 2 + buf1(i, j - 1) ^ 2 + buf1(i, j + 1) ^ 2)) / 2 '- buf2(i, j)
式子三:Buf2(i, j) = (Buf1(i, j - 1) + Buf1(i - 1, j) + Buf1(i + 1, j) + Buf1(i, j + 1)) /4
'上式完整形式为buf2(i, j) =buf2(i, j)+ (buf1(i - 1, j) + buf1(i + 1, j) + buf1(i, j - 1) + buf1(i, j + 1)) / 4-buf2(i, j)
'波能在自身原有的能量基础上从周围四个方向的波源获得其1/4的能量,再把自身的能量平均分成四份完全传播给周围四点。
'buf2(i, j) = buf2(i, j) - buf2(i, j) / 32 '部分波能被水吸收
|
X(i-1,j)
|
|
X(i,j-1)
|
X(i,j)
|
X(i,j+1)
|
|
X(i+1,j)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1
|
|
|
|
|
|
|
|
3
|
0
|
3
|
|
|
|
|
|
3
|
0
|
9
|
0
|
3
|
|
|
|
1
|
0
|
9
|
0
|
9
|
0
|
1
|
|
|
|
3
|
0
|
9
|
0
|
3
|
|
|
|
|
|
3
|
0
|
3
|
|
|
|
|
|
|
|
1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
8
|
0
|
8
|
|
|
|
4
|
0
|
16
|
0
|
4
|
|
|
|
8
|
0
|
8
|
|
|
|
|
|
4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16
|
|
|
|
16
|
0
|
16
|
|
|
|
16
|
|
|
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|