日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 流体效果的实现

發布時間:2024/2/28 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 流体效果的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需要圖形庫graphics.h
到eaxyx官網上下載安裝即可

#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); }// 全屏變暗50% 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();// 延時20 毫秒delay(20);}// 關閉EndBatchDraw();closegraph(); }

總結

以上是生活随笔為你收集整理的C++ 流体效果的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。