• 大小: 4KB
    文件类型: .cpp
    金币: 2
    下载: 0 次
    发布日期: 2024-01-22
  • 语言: C/C++
  • 标签: C++  graphics  

资源简介

graphics.h的头文件,C++编写的模拟流体运动

资源截图

代码片段和文件信息

///////////////////////////////////////////////////
// 程序名称:流体(Liquid)
// 编译环境:Visual C++ 6.0 / 2010,EasyX 20120404(beta)
// 原 作 品:http://spielzeugz.de/html5/liquid-particles.html (HTML5)
// 移植作者:krissi 
// 最后修改:2012-4-5
//
#include 
#include 
#include 


#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[

评论

共有 条评论