从2D分形噪声生成点

时间:2018-04-26 10:34:08

标签: c# unity3d optimization noise procedural-generation

我使用分层的Perlin噪声来生成2D点,使用https://www.redblobgames.com/maps/terrain-from-noise/#trees中的方法。但是,我希望点的坐标不是int s,而是float s。为此,我实现了resolution变量:

List<Vector2> points = new List<Vector2> ();
int res = 10;
int R = 2;
for (int yc = 0; yc < height*res; yc++) {
    for (int xc = 0; xc < width*res; xc++) {
        float max = 0;
        for (int yn = yc - R; yn <= yc + R; yn++) {
            for (int xn = xc - R; xn <= xc + R; xn++) {
                float e = pointsMap.GetClampedValue((float)xn/res, (float)yn/res);
                if (e > max) { max = e; }
            }
        }
        if (pointsMap.GetClampedValue((float)xc/res, (float)yc/res) == max) {
            points.Add (new Vector2((float)xc/res, (float)yc/res));
        }
    }
}

pointsMap.GetClampedValue()从0-1返回float

宽度和高度为100,分辨率为10,R = 2,执行总计2500万for个循环。虽然循环中的代码远未优化,但代码在上述设置的合理时间内执行。但是,随着分辨率,宽度,高度和R的增加,执行时间会上升得太高。

在原始函数中,作者留下了一条评论,说有比这更有效的算法。有人会知道一种高效,快速的算法,并且可以实现这种解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果你想坚持使用接近你所链接的教程的东西,但是你需要浮动坐标而不是十进制坐标,最简单的解决方案就是简单地在[0,1)范围内添加一个随机值:< / p>

Random rng = new Random(regionSeed);
List<Vector2> points = new List<Vector2> ();
for (int yc = 0; yc < height; yc++) {
  for (int xc = 0; xc < width; xc++) {
    double max = 0;
    // there are more efficient algorithms than this
    for (int yn = yc - R; yn <= yc + R; yn++) {
      for (int xn = xc - R; xn <= xc + R; xn++) {
        double e = value[yn][xn];
        if (e > max) { max = e; }
      }
    }
    if (value[yc][xc] == max) {
      list.add( new Vector2(xc+rng.NextDouble(),yc+rng.NextDouble()) );
    }
  }
}