資源簡介
好玩的C語言代碼

代碼片段和文件信息
/****************************************************
?*?程序名稱:實現水波紋顯示 *
?*?編譯環境:Visual?C++?6.0,EasyX?20130114(beta) *
?*?作 者:豪?(QQ:?415051674)? *
?*?核心算法:參考網上算法 *
?*?最后修改:2013/3/20 *
?****************************************************/
#include??????
#include?
#include?
#define?PIC_HEIGHT?600
#define?PIC_WIDTH??800
void?frameFun(); //?幀邏輯函數,處理每一幀的邏輯
void?RenderFun(); //?幀渲染函數,輸出每一幀到顯示設備
IMAGE?src_img; //?原位圖
IMAGE?dest_img(PIC_WIDTH?PIC_HEIGHT); //?處理后顯示的位圖
DWORD?*img_ptr1; //?原圖片片內存指針
DWORD?*img_ptr2; //?處理后顯示的位圖內存指針
//?以下兩個?buf?為每一個點的波幅,前者為當前波幅,后者為下一個時刻的波幅。
short?*buf??=?new?short[PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH];
short?*buf2?=?new?short[PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH];
void?main()
{
//?初始化設備,加載圖片
????initgraph(PIC_WIDTH?PIC_HEIGHT);?
SetWindowText(GetHWnd()?“Wave-水波紋效果(點擊產生一個水波紋。移動鼠標連續產生水波紋)“);
????loadimage(&src_img?“water.jpg“); //?加載圖片,大小:800*600
setbkmode(TRANSPARENT);
settextcolor(BLACK);
setfont(25?0?“Arial“);
//?獲得內存指針
img_ptr1?=?GetImageBuffer(&src_img);
img_ptr2?=?GetImageBuffer(&dest_img);
//?初始化波幅數組
memset(buf??0?(PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH)?*?sizeof(short));
memset(buf2?0?(PIC_HEIGHT*PIC_WIDTH+PIC_WIDTH)?*?sizeof(short));
//?Let‘s?Go!
BeginBatchDraw(); //?雙緩沖,閃屏時需要
while(true)?
{
frameFun();
RenderFun();
FlushBatchDraw();
Sleep(1);
}
EndBatchDraw();
}
//?計算出下一個時刻所有點的波幅
void?nextframe()
{
for(int?i?=?PIC_WIDTH;?i? {
//?公式:X0‘=?(X1+X2+X3+X4)?/?2?-?X0
buf2[i]?=?((buf[i-PIC_WIDTH]?+?buf[i+PIC_WIDTH]?+?buf[i-1]?+?buf[i+1])?>>?1)?-?buf2[i];
//?波能衰減
buf2[i]?-=?buf2[i]?>>?5;
}
short?*ptmp?=?buf;
buf??=?buf2;
buf2?=?ptmp;
}
//?處理當前時刻波幅影響之后的位圖,保存在?dest_img?中
void?RenderRipple()
{
int?i?=?0;
for?(int?y?=?0;?y? {
for?(int?x?=?0;?x? {
short?data?=?1024?-?buf[i];
//?偏移
int?a?=?((x?-?PIC_WIDTH??/?2)?*?data?/?1024)?+?PIC_WIDTH??/?2;
int?b?=?((y?-?PIC_HEIGHT?/?2)?*?data?/?1024)?+?PIC_HEIGHT?/?2;
//?邊界處理
if?(a?>=?PIC_WIDTH) a?=?PIC_WIDTH?-?1;
if?(a?0) a?=?0;
if?(b?>=?PIC_HEIGHT) b?=?PIC_HEIGHT?-?1;
if?(b?0) b?=?0;
//?處理偏移?
img_ptr2[i]?=?img_ptr1[a?+?(b?*?PIC_WIDTH)];
i++;
}
}
}
//?鼠標模擬投石頭
//?參數說明:
//?(x?y):?鼠標坐標
//?stonesize:?“石頭”的大小
//?stoneweight:?投“石頭”的力度
//?Ps:?如果產生錯誤,一般就是數組越界所致,請酌情調整“石頭”的大小和“石頭”的力度
void?disturb(int?x?int?y?int?stonesize?int?stoneweight)?
{
//?突破邊界不處理
if?((x?>=?PIC_WIDTH?-?stonesize)?||
(x? (y?>=?PIC_HEIGHT?-?stonesize)?||
(y? return;
for?(int?posx=x-stonesize;?posx {
for?(int?posy=y-stonesize;?posy {
if?((posx-x)*(posx-x)?+?(posy-y)*(posy-y)? {
buf[PIC_WIDTH*posy+posx
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????116053??2013-03-20?01:25??water.jpg
?????文件????????4180??2013-03-21?00:43??Wave.cpp
?????文件????????4258??2013-03-20?12:40??Wave.dsp
?????文件?????????514??2013-03-19?00:57??Wave.dsw
?????文件???????98304??2013-03-21?00:44??Wave.exe
- 上一篇:圖像連續拼接算法源碼
- 下一篇:C語言實現cordic sinx的算法
評論
共有 條評論