要約すると、水の波の円が0-Rから徐々に拡大されてフレームごとに表示されます。拡大中、ピクセル点には波動関数とエネルギー減少変換が与えられます。カラーは、ピクセル ポイント (カラー近傍) の 4 方向を丸め、重み値を乗算し、最後にポイントに割り当て直します。
波紋の発生点の中心や波紋の半径などをランダムに自動選択できます。
論理的には動的に表示する必要がありますが、ビデオのサイズと gif 画像を配置できないため、最終的な効果はブログ内でのみ表示されます。
下の写真がその効果です。
リップル範囲コードを決定します。
dis=dx*dx+dy*dy;
if dis>R*R || dis==0
new=[i j k];
else
dis=sqrt(dis);
a= ((R-dis) * wave*l * sin(dis/wave * 2*pi))/(R*dis); %圆形波动+能量递减(R-dis)/R
*dis去模拟水波效果
i1=(i+dy*a); %获得迁移变量
j1=(j+dx*a); %获得迁移变量
水の波効果のエネルギー変換コアコード:
float_Y=new(1)-floor(new(1)); %这一步可以算是归一化,方便计算后面四个点的权重
float_X=new(2)-floor(new(2));
new_up_left=[floor(new(1)) floor(new(2)) ]; %获得像素位置的四个邻域
new_up_right=[floor(new(1)) ceil(new(2)) ];
new_down_left=[ceil(new(1)) floor(new(2)) ];
new_down_right=[ceil(new(1)) ceil(new(2)) ];
value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重,进行插值
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
imgn(i,j,k)=value_up_left*img(new_up_left(1),new_up_left(2),new(3))+ ...
value_up_right*img(new_up_right(1),new_up_right(2),new(3))+ ...
value_down_left*img(new_down_left(1),new_down_left(2),new(3))+ ...
value_down_right*img(new_down_right(1),new_down_right(2),new(3));%将该点计算后的颜色结果赋予该点