#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;
}
模拟效果图