我使用分层的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
的增加,执行时间会上升得太高。
在原始函数中,作者留下了一条评论,说有比这更有效的算法。有人会知道一种高效,快速的算法,并且可以实现这种解决方案吗?
答案 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()) );
}
}
}