问题标签 [procedural-generation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
306 浏览

algorithm - 将多边形细分为不同大小的框

我想指出用于创建算法的信息/资源,如本博客所示,它是将多边形(在我的情况下为 voronoi 单元)细分为几个不同大小的框:

http://procworld.blogspot.nl/2011/07/city-lots.html

在评论中可以找到博客作者的一篇论文,但是列出的唯一公式是关于候选位置的适用性:

http://www.groenewegen.de/delft/thesis-final/ProceduralCityLayoutGeneration-Preprint.pdf

任何语言都可以,但如果可以给出示例,首选 Javascript(因为它是我目前正在使用的语言)

一个类似的问题是:https ://gamedev.stackexchange.com/questions/27055/what-is-an-efficient-packing-algorithm-for-packing-rectangles-into-a-polygon

[编辑]:我找到了一些可以开始的东西,但这不是我完全想要的: http ://www2.stetson.edu/~efriedma/squintri/

0 投票
1 回答
259 浏览

python - 从C代码在python中实现噪声函数

我想玩一下程序内容生成算法,并决定从噪音(Perlin、值等)开始

为此,我想要一个通用的 n 维噪声函数。为此,我编写了一个函数,该函数返回给定维度的噪声生成函数:

我相信,问题在于计算。我的代码基于这两篇文章:

我的一项测试示例:

它总是返回 -0.281790983863,即使在更高维度和不同种子上也是如此。

我相信,问题在于在 C/C++ 中存在溢出是一些计算,并且一切正常。在python中,它只是计算一个巨大的数字。

我该如何纠正这个问题,或者如果可能的话,我如何生成一个伪随机函数,在播种后,对于某个输入,它总是返回相同的值。

[编辑] 修复了代码。现在它起作用了。

0 投票
1 回答
151 浏览

java - 在与邻居对应的区域中随机选择点,避免无限递归

请原谅文字墙。稍后我会添加图像。我需要生成一个有点现实的立方米体素地图,包括水、沙子、草、树木、矿物、沙漠、海滩、岛屿等,没有任何形式的 voronoi 应对(即聪明地将这些因素与每个其他)。是的,这是一个游戏。

我想我会随机生成临界点并将它们插入以获取海拔和湿度读数,但我对随机生成感到茫然。基本上我需要一个稍微均匀的分数分布,而不必一次列出完整的列表。我需要一次生成大约 20x20x20,并且可能使用大约 1000x1000x1000 个临界点单元格,但我预计在大单元格的边缘会发生奇怪的事情。有谁知道以这种方式选择点的任何方法?真正的麻烦在于,点应该更接近“山脉”风格链中的其他点。

这里的问题是,这发生在这些 1 公里的小区中。

我可以简单地在一个单元格中以这种方式选择点,但是由于一个单元格及其邻居需要相互依赖,所以我的简单算法会遇到需要前往这些单元格中的一个无穷大,或者看到类似网格断链的模式。链不应在单元边界上更频繁地断裂。如果他们在生成过程中显示了一些有问题的类似晶圆的图案,并且由于设计/游戏玩法的原因而导致无法使用的糟糕的生成。

nb 出于这些目的,系统级随机生成器可以播种并且实际上是统一的。就一个单元格而言,我可以很好地选择链。

我还考虑过让一个细胞溢出到任何未生成的细胞中,以便它的链开始连接到现有的细胞,但这会破坏仅基于位置和种子的生成确定性,将生成顺序作为一个因素。

同样,出于现实主义和设计的目的,我试图远离使用 Perlin。还是我应该在gamedev.SE上发帖?

0 投票
2 回答
357 浏览

c# - 随机生成的障碍物有时放置在同一位置

下面的代码是为障碍物生成随机位置。障碍物从右向左移动,所以我使用它的 x 坐标向左移动。当障碍物到达屏幕左侧时,它再次放置在某个随机位置。但这里的问题是,有时障碍物放置在同一位置或距离太近。

0 投票
1 回答
349 浏览

python - 将分形方程转换为 Python 算法时遇到问题

我正在尝试将此处概述的方程式转换为 Python 代码:

这是我的结果(为了测试目的,稍微被黑了):

然而,结果似乎只是一个简单的螺旋。很可能我只是在将数学函数转换为 Python 语句时出错了,因为这里展示的数学超出了我的教育范围。是这样吗,如果是,应该如何表达?

0 投票
1 回答
48 浏览

php - 以编程方式组装描述段落

我有许多动态创建的页面,每个页面都有许多与之关联的关键字。我希望能够创建一种方法来组合每个页面的一些描述,但我不希望它们都相同。

我有一组句子可供选择,旨在接受关键字。我正在尝试创建一种技术,该技术将获取页面主题的 ID 并根据它选择句子,因此每次访问该页面时它都是一致的,但在不同页面之间是不同的。

例如,到目前为止我有

我想为农民戴夫做的,ID 123345 是根据他的 ID 选择句子,所以当我创建它时,他总是有描述 1 和正文 2 - 例如。随后,农民约翰,ID 223454 将始终使用描述 2 和正文 2 创建。我知道如何随机选择句子,但我不知道从哪里开始使它们保持一致。

每个部分我也有大约 10 个版本,大约有 6 个部分,为了简单起见,我在这里选择了两个。我知道这可能有点矫枉过正,但它为网站增添了一种很好的个人风格。

0 投票
2 回答
784 浏览

opengl - 一种生成块的方法

我正在制作一款游戏,我实际上是在生成地图。

该地图是使用一些算法程序生成的。这没有问题。

问题是我的地图可能很大。所以我考虑过将地图切成块。

我的块没问题,它们每个都是 512*512 像素,但唯一的问题是:我必须生成一个纹理(实际上是 SFML 的 RenderTexture)。生成大约需要 0.5 毫秒,因此每次生成块时游戏都会冻结。

我想了一种方法来解决这个问题:我用工厂制作了一种线程池。我只需要向它发送一个任务,它就会创建块。

现在它已经全部实现了,它会引发 opengl 警告,例如:

“RenderTarget.cpp (219) 中的内部 OpenGL 调用失败:GL_INVALID_OPERATION,当前状态下不允许指定的操作”。

我不知道这是否是处理块的好方法。我也考虑过将块保存到图像/文件中,但我担心保存/加载它们需要太多时间。

你知道处理这种“无限”地图的更好方法吗?

0 投票
2 回答
427 浏览

c++ - 用于程序生成的伪随机

我正在用程序地图制作游戏,我想应用这种方式:

程序岛生成

它很容易实现,结果就是我想要的。

我唯一坚持的部分是第 3 部分,当我必须绕圈并随机将水变为陆地时,当水接触到大量陆地时,水变为陆地的机会更高。

我试过这样做:

countAdjacentTile 函数只计算用 x 和 y 坐标指定的瓦片周围标记为第三个参数的瓦片数。

因此,如果周围没有土地,水瓦仍然有机会变成土地瓦,如果周围有土地,机会就更高。

但它给了我这个:

在此处输入图像描述

虽然它在我之前给出的链接上给出了这个:

在此处输入图像描述

我想拥有相同类型的分支。你知道这个算法的名称吗?我读过这个: 指数分布但这对我来说并不是很健谈......

感谢您到目前为止的阅读。

0 投票
1 回答
1465 浏览

c++ - 大面积钻石方形地形生成

我正在尝试在 OpenGL 中实现菱形正方形地形生成算法。

到目前为止,我有一个由多达 1024 个不同的正方形组成的 2D 平面(实际上是 3D,但所有 Z 坐标都设置为 0)。坐标被组织成二维数组

  • x 坐标数组:xMap[1024][1024]
  • y 坐标数组:yMap[1024][1024]
  • z 坐标数组:zMap[1024][1024](开始时全部为 0;出于实验目的错误地假设 z 在我们的例子中是“垂直”轴)

例如,我们有:

我正在使用以下代码生成地形。我遇到的问题是,虽然它在 4 X 4 点大的地图上按预期工作,但它不适用于更大的地图。当应用于 6 X 6 地图时,它将为 4 X 4 相应地生成地形,但不会触及添加的 2 个方格。

这是我用来生成地形的代码:

问题可能与算法有关,也可能与我选择观点的方式有关。

有什么想法和/或帮助吗?

0 投票
2 回答
3689 浏览

c++ - 如何实现中点位移

我正在尝试在我的游戏中实现程序生成。我想真正掌握和理解所有必要的算法,而不是简单地复制/粘贴现有​​代码。为了做到这一点,我尝试自己实现一维中点位移。我使用这里的信息来编写和指导我的代码。下面是我完成的代码,它不会引发错误,但结果似乎不正确。

我到底在哪里犯了错误,我该如何纠正它们?

我得到这样的结果:

我的结果

但我期待这样的结果:

预期成绩