Я пытаюсь портировать учебник по 1D-шуму perlin на C ++ с использованием SFMl lib: (ссылка на учебник в javascript) https://codepen.io/Tobsta/post/procedural-generation-part-1-1d-perlin-noise
Однако это не работает, я не получаю никакой ошибки, новот что я получаю: https://i.imgur.com/2tAPhsH.png.в основном прямая линия
И вот что я должен получить: https://i.imgur.com/GPnfsuK.png
Вот перенесенный код по ссылке выше:
Конструктор TerrainBorder:
TerrainBorder::TerrainBorder(sf::RenderWindow &window) {
M = 4294967296;
A = 1664525;
C = 1;
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> dist(0, M);
Z = floor(dist(rng) * M);
x = 0;
y = window.getSize().y / 2.0f;
amp = 100;
wl = 100;
fq = 1.0f / wl;
a = rand();
b = rand();
ar = sf::VertexArray(sf::Points);
}
Функции:
double TerrainBorder::rand()
{
Z = (A * Z + C) % M;
return Z / M - 0.5;
}
double TerrainBorder::interpolate(double pa, double pb , double px) {
double ft = px * PI,
f = (1 - cos(ft)) * 0.5;
return pa * (1 - f) + pb * f;
}
void TerrainBorder::drawPoints(sf::RenderWindow &window) {
while (x < window.getSize().x) {
if (static_cast<int> (x) % wl == 0) {
a = b;
b = rand();
y = window.getSize().y / 2 + a * amp;
} else {
y = window.getSize().y / 2 + interpolate(a, b, static_cast<int> (x)
% wl / wl) * amp;
}
ar.append(sf::Vertex(sf::Vector2f(x, y)));
x += 1;
}
}
Затем я рисую sf::VectorArray
(который содержит все sf::Vertex
в игровом цикле