我正在尝试在C ++上移植一维Perlin噪声教程

时间:2018-11-13 13:23:22

标签: javascript c++ sfml perlin-noise

我正在尝试使用SFMl lib在C ++上移植一维Perlin噪声教程:(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

2 个答案:

答案 0 :(得分:1)

我还是解决了我的问题:) 我不得不处理类型问题:p

我发现:

double c = x % 100 / 100;
std::cout << c << std::endl; // 0

!=

double c = x % 100;
std::cout << c / 100 << std::endl; // Some numbers depending on x

如果将来可以帮助任何人:)

答案 1 :(得分:0)

C ++要求仔细选择数字变量的类型,以避免溢出和意外转换。

OP问题中显示的摘录未指定<p class="borderBox"></p> MA的类型,但使用的是{strong> int ,而在大多数实现中,Z的初始化值超出了std::uniform_int_distribution的范围。

值得注意的是,标准库已经提供了std::linear_congruential_engine

M