如何在Java中生成林

8cdiaqws  于 2022-10-18  发布在  Java
关注(0)|答案(2)|浏览(273)

一周前,我创建了一个基本的‘森林’生成系统,它只是一个for循环,它取一大块,并将随机数量的树木放置在随机的位置。但这并没有给我带来我想要的结果。
代码:

for(int t = 0; t <= randomForTrees.nextInt(maxTreesPerChunk); t++){

    // generates random locations for the X, Z positions\\
    // the Y position is the height on the terrain gain with the X, Z coordinates \\
    float TreeX = random.nextInt((int) (Settings.TERRAIN_VERTEX_COUNT + Settings.TERRAIN_SIZE)) + terrain.getX();
    float TreeZ = random.nextInt((int) (Settings.TERRAIN_VERTEX_COUNT + Settings.TERRAIN_SIZE)) + terrain.getZ();
    float TreeY = terrain.getTerrainHeightAtSpot(TreeX, TreeZ);

    // creates a tree entity with the previous generated positions \\
    Entity tree = new Entity(TreeStaticModel, new Vector3f(TreeX, TreeY, TreeZ), 0, random.nextInt(360), 0, 1);

    // checks if the tree is on land \\
    if(!(tree.getPosition().y <= -17)){
        trees.add(tree);
    }
}

结果:

voj3qocg

voj3qocg1#

首先看看我的:

如您所见,您可以根据海拔、坡度等计算生物量。更复杂的生成器创建一个VoronoiMap,将您的Map划分为生物群区域,根据已经分配的邻居随机分配(按某些规则)生物群类型...
回到你的问题上,你应该在某个位置周围放置更密集的树木,而不是均匀地用稀疏的树木覆盖大片区域。因此,您需要略有不同的随机性分布(如高斯)。请看传奇:

关于如何获得不同于均匀分布的分布。
所以你应该做的是获得几个随机的位置来均匀地覆盖你的区域形状。然后生成密度取决于到这些点的最小距离的树。林木放置距离越小,密度越大。

iqih9akk

iqih9akk2#

你要找的是一个能产生随机数的“低偏差序列”。产生的数字不是真正随机的,而是均匀分布的。这将它们与随机数生成器区分开来,随机数生成器不会自动生成均匀分布的数。
这样的序列的一个例子是Halton Sequence,而Apache Commons也有一个可以使用的implementation

double[] nextVector = generator.nextVector();

在您的例子中,使用两个维度,结果数组也有两个条目。您仍然需要做的是将这些点转换为您的本地坐标,方法是将想要放置森林的正方形的中心点添加到每个生成的矢量中。此外,若要增加点之间的间距,应考虑缩放向量。

相关问题