SFML/C++ 一维水波模拟,波动方程

#include <iostream>
#include <SFML/Graphics.hpp>
float depth[64];
float predepth[64];
float tmpdepth[64];

//初始化水面状态
void initDeep() {
	for (int i = 0; i < 64; i++) {
		depth[i] = 320;
	}
	for (int i = 0; i < 10; i++) {
		depth[i + 17] = sin(3.1415 / 10 * i) * 50 + 320;
	}
	for (int i = 0; i < 64; i++) {
		predepth[i] = depth[i];
	}
}
//计算下一步渲染画面
void Next() {
	for (int kase = 0; kase < 3; kase++) {
		for (int i = 0; i < 64; i++) {
			tmpdepth[i] = depth[i];
		}
		for (int i = 1; i < 63; i++) {
			/* f(x, t + 1) = (a ^ 2 * (f(x + 1, t) + f(x - 1, t) - 2 * f(x, t)) - f(x, t - 1) + 2 * f(x, t)) * k
			 * a为水波传递速度,f(x,t)为横坐标为x,时刻为t的水面高度,k为阻尼系数
			 */
			depth[i] = ((0.01 * (tmpdepth[i + 1] + tmpdepth[i - 1] - 2 * tmpdepth[i]) - predepth[i] + 2 * tmpdepth[i]) - 320) * 0.999 + 320;
		}
		for (int i = 0; i < 64; i++) {
			predepth[i] = tmpdepth[i];
		}
	}
}
//绘制
void draw(sf::RenderWindow& window, sf::VertexArray& lines) {
	for (int i = 0; i < 64; i++) {
		lines[i].position = sf::Vector2f(i * 10, depth[i]);
		lines[i].color = sf::Color::Blue;
	}
	window.draw(lines);
}
int main() {
	sf::RenderWindow window(sf::VideoMode(640, 640), "Emm");
	window.setFramerateLimit(60);
	sf::VertexArray lines(sf::LinesStrip, 64);
	initDeep();
	while (window.isOpen()) {
		sf::Event event;
		while (window.pollEvent(event)) {
			if (event.type == sf::Event::Closed)
				window.close();
		}
		window.clear();
		draw(window, lines);
		Next();
		window.display();
	}
	return 0;
}

模拟效果图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值