工控编程吧
标题:
上位机MFC水波特效算法源代码
[打印本页]
作者:
qq263946146
时间:
2019-10-3 09:45
标题:
上位机MFC水波特效算法源代码
(, 下载次数: 2)
上传
点击文件名下载附件
界面 运行效果如上图。
显示的是下雨的效果。
还有其他效果,可以在工具栏选择查看。
关键代码
//*******************************************************
//根据波能数据缓冲区对离屏页面进行渲染
//*******************************************************
void RenderRipple()
{
//锁定两个离屏页面
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;
//下面进行页面渲染
int xoff, yoff;
int k = BACKWIDTH;
for (int i=1; i<BACKHEIGHT-1; i++)
{
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);
}
//********************************************************
//更新屏幕
//********************************************************
void UpdateFrame( void )
{
//随机增加波源
if (rain==TRUE)
DropStone(
(int)(BACKWIDTH*((short)rand()/32767.0)),
(int)(BACKHEIGHT*((short)rand()/32767.0)),
3,
128
);
if (downripper==TRUE)
DropStone(
(int)(BACKWIDTH*((short)rand()/32767.0)),
BACKHEIGHT-3,
3,
128
);
if (upripper==TRUE)
DropStone(
(int)(BACKWIDTH*((short)rand()/32767.0)),
3,
3,
128
);
RippleSpread();//计算波能数据缓冲区
RenderRipple();//页面渲染
//将离屏页面图象Blit到主页面
RECT Window;
POINT pt;
GetClientRect(ChooseWnd(), &Window);
pt.x=pt.y=0;
ClientToScreen(ChooseWnd(), &pt);
OffsetRect(&Window, pt.x, pt.y);
lpDDSPrimary->Blt(&Window, lpDDSPic2, NULL, DDBLT_WAIT, NULL);
}
void MakeRect(RECT *rect, short left, short top, short width, short height)
{
rect->left=left;
rect->top=top;
rect->right=left+width;
rect->bottom=top+height;
}
//*****************************************************
//增加波源
//*****************************************************
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<x+stonesize; posx++)
for (int posy=y-stonesize; posy<y+stonesize; posy++)
if ((posx-x)*(posx-x) + (posy-y)*(posy-y) < stonesize*stonesize)
buf1[BACKWIDTH*posy+posx] = -stoneweight;
}
复制代码
源代码下载地址:
(, 下载次数: 2)
上传
点击文件名下载附件
[MFC408]1[/MFC408]
[halcon]1[/halcon]
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4