Javascript 创建一个随机的二维凹多边形

Javascript 创建一个随机的二维凹多边形,javascript,algorithm,math,terrain,Javascript,Algorithm,Math,Terrain,我正在用JavaScript()编写一个简单的月球着陆器克隆,我想要一个生成随机洞穴状空间的算法,而不是一个只有高低的基本景观。给定一个矩形区域来处理[0,0,1920,1200],该算法应该能够生成类似下图的内容。理想情况下,洞穴区域的任何“入口”都应该有一个设定的宽度,以便着陆器能够“进入”它 我认为这可能是不可能的,我可以只画一堆像上面那样的图像,然后将像素数据转换成粗糙的多边形数据,但是随机生成的级别要酷得多 对于超级硬核奖励积分,指定有多少洞穴状结构的能力将更加令人敬畏 该算法的输出

我正在用JavaScript()编写一个简单的月球着陆器克隆,我想要一个生成随机洞穴状空间的算法,而不是一个只有高低的基本景观。给定一个矩形区域来处理[0,0,1920,1200],该算法应该能够生成类似下图的内容。理想情况下,洞穴区域的任何“入口”都应该有一个设定的宽度,以便着陆器能够“进入”它

我认为这可能是不可能的,我可以只画一堆像上面那样的图像,然后将像素数据转换成粗糙的多边形数据,但是随机生成的级别要酷得多

对于超级硬核奖励积分,指定有多少洞穴状结构的能力将更加令人敬畏

该算法的输出将是一个点数组,每个点都是一个包含x和y属性{x:val,y:val}的对象,当您在当前点和下一点之间顺序绘制直线时,该属性将构成多边形


如果有人有类似的JavaScript实现,这也会有很大帮助

开始学习什么是气泡图,因为它在架构中使用。这是一个空间的拓扑图,用气泡作为空间和线来表示通道。我没有找到任何一个好的网页可以快速推荐,但是做一个图像搜索会产生很多例子

气泡图可以被认为是一个以气泡为顶点的图。在您的示例中,将“天空”(包括顶边的水滴)建模为顶点。洞穴是另一个顶点,入口是一条边。从这个角度来看,很容易产生你想要的洞穴般的复杂性

下一个技巧是将其转化为几何体。基本上,您希望从图形的骨架中推出,并在玩家可以导航的地方创建空白。同时,您要确保这些空洞不会向外推得太远、变薄或消除墙。所以你还需要对实体区域进行建模,这是用一个。对偶图位于原始图的“下方”,在这个意义上,边缘交叉代表冲突,冲突的解决有利于空洞而非实体

总结:(1)用你想要的特征做一个拓扑图。(2) 为图形创建几何图形,为每个顶点指定位置,并为每个边指定路径。(3) 构造对偶图,并指定其几何图形。(4) 通过向外扩展,充实与每个图形相关的空间,解决有利于通道而不是阻塞的冲突


您可能希望说服自己,最终几何体的周长列表可以通过图形的半边遍历生成,就像用一只手在墙上走迷宫一样

如果您感兴趣,可以使用行进方块将二维标量值场(可能从柏林或单纯形噪声中获取)转换为一组边缘线。当然,最终的结果将取决于如何获得二维场标量值(如何操作柏林噪声或单纯形噪声)

这是我能找到的最好的网站,可以很好地浏览细节。(它的3D孪生兄弟Marching Cubes没有那么好的文档记录)


实际上,上面的页面相当不错。

看看这些,它们可能会有帮助: