生活随笔
收集整理的這篇文章主要介紹了
C++ 流体效果的实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需要圖形庫(kù)graphics.h
到eaxyx官網(wǎng)上下載安裝即可
#include <graphics.h>
#include <math.h>
#include <time.h>#define WIDTH 1024
#define HEIGHT 576
#define NUM_MOVERS 600
#define FRICTION 0.96f
struct Mover
{COLORREF color
; float x
, y
; float vX
, vY
;
};
Mover movers
[NUM_MOVERS
];
int mouseX
, mouseY
;
int mouseVX
, mouseVY
;
int prevMouseX
, prevMouseY
;
bool isMouseDown
;
DWORD
* pBuffer
;
void init()
{for (int i
= 0; i
< NUM_MOVERS
; i
++){movers
[i
].color
= RGB(rand() % 256, rand() % 256, rand() % 256);movers
[i
].x
= WIDTH
* 0.5;movers
[i
].y
= HEIGHT
* 0.5;movers
[i
].vX
= float(cos(float(i
))) * (rand() % 34);movers
[i
].vY
= float(sin(float(i
))) * (rand() % 34);}mouseX
= prevMouseX
= WIDTH
/ 2;mouseY
= prevMouseY
= HEIGHT
/ 2;srand((unsigned int)time(NULL));pBuffer
= GetImageBuffer(NULL);
}
void darken()
{for (int i
= WIDTH
* HEIGHT
- 1; i
>= 0; i
--)if (pBuffer
[i
] != 0)pBuffer
[i
] = RGB(GetRValue(pBuffer
[i
]) >> 1, GetGValue(pBuffer
[i
]) >> 1, GetBValue(pBuffer
[i
]) >> 1);
}
void delay(DWORD ms
)
{static DWORD oldtime
= GetTickCount();while (GetTickCount() - oldtime
< ms
)Sleep(1);oldtime
= GetTickCount();
}
void run()
{darken(); mouseVX
= mouseX
- prevMouseX
;mouseVY
= mouseY
- prevMouseY
;prevMouseX
= mouseX
;prevMouseY
= mouseY
;float toDist
= WIDTH
* 0.86f;float stirDist
= WIDTH
* 0.125f;float blowDist
= WIDTH
* 0.5f;for (int i
= 0; i
< NUM_MOVERS
; i
++){float x
= movers
[i
].x
;float y
= movers
[i
].y
;float vX
= movers
[i
].vX
;float vY
= movers
[i
].vY
;float dX
= x
- mouseX
;float dY
= y
- mouseY
;float d
= (float)sqrt(dX
* dX
+ dY
* dY
);dX
= d
? dX
/ d
: 0;dY
= d
? dY
/ d
: 0;if (isMouseDown
&& d
< blowDist
){float blowAcc
= (1 - (d
/ blowDist
)) * 14;vX
+= dX
* blowAcc
+ 0.5f - float(rand()) / RAND_MAX
;vY
+= dY
* blowAcc
+ 0.5f - float(rand()) / RAND_MAX
;}if (d
< toDist
){float toAcc
= (1 - (d
/ toDist
)) * WIDTH
* 0.0014f;vX
-= dX
* toAcc
;vY
-= dY
* toAcc
;}if (d
< stirDist
){float mAcc
= (1 - (d
/ stirDist
)) * WIDTH
* 0.00026f;vX
+= mouseVX
* mAcc
;vY
+= mouseVY
* mAcc
;}vX
*= FRICTION
;vY
*= FRICTION
;float avgVX
= (float)fabs(vX
);float avgVY
= (float)fabs(vY
);float avgV
= (avgVX
+ avgVY
) * 0.5f;if (avgVX
< 0.1) vX
*= float(rand()) / RAND_MAX
* 3;if (avgVY
< 0.1) vY
*= float(rand()) / RAND_MAX
* 3;float sc
= avgV
* 0.45f;sc
= max(min(sc
, 3.5f), 0.4f);float nextX
= x
+ vX
;float nextY
= y
+ vY
;if (nextX
> WIDTH
) { nextX
= WIDTH
; vX
*= -1; }else if (nextX
< 0) { nextX
= 0; vX
*= -1; }if (nextY
> HEIGHT
) { nextY
= HEIGHT
; vY
*= -1; }else if (nextY
< 0) { nextY
= 0; vY
*= -1; }movers
[i
].vX
= vX
;movers
[i
].vY
= vY
;movers
[i
].x
= nextX
;movers
[i
].y
= nextY
;setcolor(movers
[i
].color
);setfillstyle(movers
[i
].color
);fillcircle(int(nextX
+ 0.5), int(nextY
+ 0.5), int(sc
+ 0.5));}
}
void main()
{initgraph(WIDTH
, HEIGHT
);BeginBatchDraw();init();MOUSEMSG m
;while (true
){while (MouseHit()){m
= GetMouseMsg();switch (m
.uMsg
){case WM_MOUSEMOVE
: mouseX
= m
.x
; mouseY
= m
.y
; break;case WM_LBUTTONDOWN
: isMouseDown
= true
; break;case WM_LBUTTONUP
: isMouseDown
= false
; break;}}run();FlushBatchDraw();delay(20);}EndBatchDraw();closegraph();
}
總結(jié)
以上是生活随笔為你收集整理的C++ 流体效果的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。