总结起来就是将水波圆周从0-R逐渐扩大并逐帧显示。在扩大的同时赋予该像素点波动函数和能量递减的变换。颜色就是对像素点四个方向取整(色彩邻域),取权值相乘,最后赋予回给该点。
可以随机自动选择涟漪生成点的圆心,涟漪波及的半径等。
按道理应该是动态显示的,但是由于无法放视频和gif图片的尺寸问题,只能在博客中显示最后效果。
下图是效果:
确定涟漪范围代码:
dis=dx*dx+dy*dy;if dis>R*R || dis==0new=[i j k];
elsedis=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));%将该点计算后的颜色结果赋予该点