A0’=a×(A1+A2+A3+A4)+b×A0 (公式一)
A0’+A1’+...+An’ = A0+A1+...+An (公式二)
(4a+b)×A0+(4a+b)×A1+...(4a+b)×An = A0+A1+...+An
A0’=(A1+A2+A3+A4)/ 2- A0
void SPRead()
{
……
for (int i=BACKWIDTH; i {
//能量的扩散
buf2[i] = ((buf1[i-1]+buf1[i+1]+buf1[i-BACKWIDTH]+buf1[i+BACKWIDTH])>>1)- buf2[i];
//能量的衰减
buf2[i] -= buf2[i]>>5;
}
//交换前后两时刻的能量缓冲区
short *ptmp =buf1;
buf1 = buf2;
buf2 = ptmp;
……
}
void Render()
{
……
int xoff, yoff;
int k = BACKWIDTH;
for (int i=1; i {
for (int j=0; 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 Bitmap2[pos2++]=Bitmap1[pos1++];
k++;
}
}
……
}
void DropStone(int x,/*x坐标 */ int y,/*y坐标*/int stonesize,/*半径*/int stoneweight/*能量*/)
{
……
//判定坐标是否在屏幕范围内
if ((x+stonesize)>BACKWIDTH (y+stonesize)>BACKHEIGHT(x-stonesize)<0(y-stonesize)<0)
return;
……
for (int posx=x-stonesize; posx for (int posy=y-stonesize; posy if ((posx-x)*(posx-x) + (posy-y)*(posy-y) < stonesize*stonesize)
buf1[BACKWIDTH*posy+posx] = -stoneweight;
……
}
BOOL InitDDraw(void)
{
DDSURFACEDESC ddsd;
HRESULT ddrval;
……
//创建DirectDraw对象
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
……
//取得全屏独占模式
ddrval = lpDD->SetCoOperativeLevel(hwndful, DDSCL_EXCLUSIVE DSCL_FULLSCREEN );
……
//设置显示器显示模式
ddrval = lpDD->SetDisplayMode( DISPLAYMODEWIDTH,DISPLAYMODEHEIGHT, 24);
……
//填充主页面信息
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS ;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
//创建主页面对象
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
……
ddsd.dwFlags = DDSD_CAPS DDSD_HEIGHT DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN DDSCAPS_SYSTEMMEMORY ;
……
lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) ;
……
lpDD->CreateSurface(&ddsd, &lpDDSPic2, NULL);
……
lpDD->CreateClipper(0, &lpClipper, NULL);
lpClipper->SetHWnd(0, hwndful);
lpDDSPrimary->SetClipper(lpClipper);
……
//初始化页面图像
DDReLoadBitmap(lpDDSPic1, MAKEINTRESOURCE(IDB_BITMAP1));
DDReLoadBitmap(lpDDSPrimary,MAKEINTRESOURCE(IDB_BITMAP2));
……
ZeroMemory(buf1, BACKWIDTH*BACKHEIGHT*sizeof(short));
ZeroMemory(buf2, BACKWIDTH*BACKHEIGHT*sizeof(short));
……
return TRUE;
}
……
DropStone((int)(BACKWIDTH*((short)rand()/32767.0)),
(int)(BACKHEIGHT*((short)rand()/32767.0)),
2,64);//激励点为随机产生,模拟雨点落在水面的情形
Spread();//计算振幅数据缓冲区
Render();//页面渲染
//在window内显示页面2
lpDDSPrimary->Blt(&Window, lpDDSPic2, NULL, DDBLT_WAIT, NULL);
……
……
//锁定两个离屏页面
DDSURFACEDESC ddsd1, ddsd2;
ddsd1.dwSize = sizeof (DDSURFACEDESC);
ddsd2.dwSize = sizeof(DDSURFACEDESC);
lpDDSPic1->Lock(NULL, &ddsd1, DDLOCK_WAIT, NULL);
lpDDSPic2->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL);
//取得页面象素位深度,和页面内存指针
int depth=ddsd1.ddpfPixelFormat.dwRGBBitCount/8;
BYTE *Bitmap1 = (BYTE*)ddsd1.lpSurface;
BYTE *Bitmap2 = (BYTE*)ddsd2.lpSurface;
……
//中间为对光的折射模拟过程的代码
……
//解锁页面
lpDDSPic1->Unlock(&ddsd1);
lpDDSPic2->Unlock(&ddsd2);
……
lpDDSPrimary->Release();
lpDDSPic1->Release();
lpDDSPic2->Release();
lpClipper->Release();
lpDD->Release();
……
新闻热点
疑难解答