特效天地——水波(4) for (int j=0; j<BACKWIDTH; j++) { //计算偏移量 xoff =buf1[k-1]-buf1[k+1]; yoff =buf1[k-BACKWIDTH]-buf1[k+BACKWIDTH]; //判断坐标是否在窗口范围内 if ((i+yoff )< 0 ){k++; continue;} if ((i+yoff )>BACKHEIGHT) {k++; continue;} if ((j+xoff )< 0 ){k++; continue;} if ((j+xoff )>BACKWIDTH ) {k++; continue;} //计算出偏移象素和原始象素的内存地址偏移量 int pos1, pos2; pos1=ddsd1.lPitch*(i+yoff)+ depth*(j+xoff); pos2=ddsd2.lPitch*i+depth*j; //复制象素 for (int d=0;d<depth; d++) Bitmap2[pos2++]=Bitmap1[pos1++]; k++; } } //解锁页面 lpDDSPic1->Unlock(&ddsd1); lpDDSPic2->Unlock(&ddsd2);}
增加波源
俗话说:无风不起浪,为了形成水波,我们必须在水池中加入波源,你可以想象成向水中投入石头,形成的波源的大小和能量与石头的半径和你扔石头的力量都有关系。知道了这些,那么好,我们只要修改波能数据缓冲区buf,让它在石头入水的地点来一个负的“尖脉冲”,即让buf[x,y]=-n。经过实验,n的范围在(32~128)之间比较合适。
控制波源半径也好办,你只要以石头入水中心点为圆心,画一个以石头半径为半径的圆,让这个圆中所有的点都来这么一个负的“尖脉冲”就可以了(这里也做了近似处理)。
增加波源的代码如下:
//*****************************************************