Micro biome:使用生物群落生成 2D瓷砖地图(biome map)

我想用生物群落生成一个 2D 瓦片地图(假设:沙漠,草,雪)。我有一些算法的想法,比如放一些随机的瓦片,然后尝试扩展,但我完全不知道如何确定何时扩展和何时不扩展。(我所做的尝试总是以无限递归结束)

我正在寻找的结果是这样的:(生物群落较少)

有没有一个简单的方法来做到这一点?

3

我用一个真正简单的算法测试了你的问题:

随机设置点与生物群落类型在你的领域

走过完整的字段,并将生物群落类型设置为最近的点

示例结果(X 标记步骤 1 中的生物群落点):

% % % % % % % % % % % % % % % % % % I I I I I I I I I I I I I I 
% % % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I 
% % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I 
% % % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I 
% % % % % % % % % % % % % % % I I I I I I I I I I I I I I I I I 
% % % % % X % % % % % % % % I I I I I I I I I I I I I I I I I I 
% % % % % % % % % % % % % % I I I I I I I I I I I I I I I I I I 
% % % % % % % % % % % % % I I I I I I I I I I I I I I I I I I I 
O O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I 
O O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I 
O O O O O X O O O O O O I I I I I I I I I I I I I I I I I I I I 
O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I 
O O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I 
O O O O O O O O O O O O I I I I I I X I I I I I I I I I I I I I 
O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I I + 
O O O O O O O O O O O I I I I I I I I I I I I I I I I I I I + + 
O O O O O O O O O O O I I I I I I I I I I I I I I I I I + + + + 
O O O O O O O O O O O I I I I I I I I I I I I I I I I + + + + + 
O O O O O O O O O O O I I I I I I I I I I I I I I + + + + + + + 
O O O O O O O O O O I I I I I I I I I I I I I + + + + + + + + + 
O O O O O O O O O O I I I I I I I I I I I I + + + + + + + + + + 
O O O O O O O O O O I I I I I I I I I I + + + + + + + + + + + + 
O O O O O O O O O O I I I I I I I I + + + + + + + + + + + + + + 
O O O O O O O O O I I I I I I I I + + + + + + + + + + + + + + + 
O O O O O O O O O I I I I I I + + + + + + + + + + + + + + + + + 
O O O O O O O O O I I I I I + + + + + + + + + + + + + + + + + + 
O O O O O O O O O I I I + + + + + + + + + + + + + + X + + + + + 
O O O O O O O O I I + + + + + + + + + + + + + + + + + + + + + + 
O O O O O O O O I + + + + + + + + + + + + + + + + + + + + + + + 
O O O O O O O O + + + + + + + + + + + + + + + + + + + + + + + + 
O O O O O O O + + + + + + + + + + + + + + + + + + + + + + + + + 
O O O O O O + + + + + + + + + + + + + + + + + + + + + + + + + + 

我用 Java 的解决方案,但它不应该很难将其转换为 C / C ++

// a simple 'struct' to hold some vars
class BiomeInfo {
    char type;
    int x;
    int y;
}

接下来我们设置一些点。您可以将随机添加到此任务,也可以多次添加任何类型

    char[][] field = new field[32][32];
    biomeInfo[0].type = '#';
    biomeInfo[0].x = 5;
    biomeInfo[0].y = 5;
    biomeInfo[1].type = 'O';
    biomeInfo[1].x = 10;
    biomeInfo[1].y = 5;
    biomeInfo[2].type = 'I';
    biomeInfo[2].x = 13;
    biomeInfo[2].y = 18;
    biomeInfo[3].type = '+';
    biomeInfo[3].x = 26;
    biomeInfo[3].y = 26;

下一篇:走过田野

    for (int i = 0; i < field.length; i++) {
        for (int j = 0; j < field[0].length; j++) {
            char nearest = '.'; // value here doesn't matter
            int dist = Integer.MAX_VALUE; // select a big number
            // walk over each biomeInfo
            for (int z = 0; z < biomeInfo.length; z++) {
                // calculate the difference in x and y direction
                int xdiff = biomeInfo[z].x - i;
                int ydiff = biomeInfo[z].y - j;
                // calculate euclidean distance, sqrt is not needed
                // because we only compare and do not need the real value
                int cdist = xdiff*xdiff + ydiff*ydiff;
                // is the current distance smaller than the old distance?
                // if yes, take this biome
                if (cdist < dist) {
                    nearest = biomeInfo[z].type;
                    dist = cdist;
                }
            }
            // set the field to the nearest biome       
            field[i][j] = nearest;
            // you can mark the biome point with this code
            // if (dist == 0) {
            //    field[i][j] = 'X';
            // }
        }
    }

最后打印字段:

    for (int i = 0; i < field.length; i++) {
        for (int j = 0; j < field[0].length; j++) {
            System.out.printf("%c ", field[i][j]);
        }
        System.out.printf("%n"); // %n means newline
    }
    System.out.printf("%n");
1

图片上的线条以Voronoi diagram的名称命名。Wikipedia 页面mentions找到一些算法,或双重Delaunay triangulation。一种简单的方法如下:对于每个控制点,在该点和每个其他控制点之间绘制,按与 Ox 轴的角度对这些线进行排序,然后按照该顺序遍历它们以在控制点周围构造多边形。

之后,将类型分配给图块应该很容易。您只需查看图块的中心,即可找到它属于该图的哪个面。如果需要更好的精度,可以为每个图块计算与每个面的相交面积,然后选择面积最大的图块。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(145)
C语言怎么输出ascii码:我怎么能写ASCII艺术文本(使用任何语言 )
上一篇
如何把网页保存为word:将Word文档保存为带有“无标记”的PDF
下一篇

相关推荐

  • cad迷你看图 for mac轻松创建专业级2D图形

    CAD迷你看图 for Mac是一款Mac上的CAD文件查看器,可以快速浏览、打印和转换DWG/DXF/DWF文件,具有易于使用的界面,可以轻松查看和编辑CAD文件,支持多种格式,如DWG/DXF/DWF/DWFx/DWGX/DWG TrueView等,是Mac上非常不错的CAD文件查看器。…

    2023-02-21 03:27:29
    0 45 83
  • 3 d 2 y:用colorbar在2d图中绘制3d点(x y z)

    关于3 d 2 y的问题,在x plot中经常遇到,我已经计算了很多(〜 5000)的 3d 点(x,y,z)在一个相当复杂的方式,所以我没有功能,如 z = f(x,y)。…

    2024-05-26 12:09:30
    0 52 41
  • Cross join:如何CROSSJOIN 2dataframe

    我正在努力获得 2 个数据帧的 CROSS JOIN。我正在使用 spark 2.0。如何使用 2 个数据帧实现 CROSSS JOIN?…

    2024-01-15 10:06:38
    0 32 49
  • 果酸维c身体乳:二维傅里叶变换在 C(2d fourier transform in image processing)

    关于果酸维c身体乳的问题,在2d fourier transform in image processing中经常遇到,我使用这个网站的等式实现了 2D DFT 和 IDFThttp://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm我认为这些是正确的,很好地解释了。…

    2024-05-23 09:07:58
    0 77 15
  • Dramatically:Unity 2D-动画大幅降低FPS

    关于Dramatically的问题,在2d bone animation unity中经常遇到,我使用 2d 动画包和 2D Ik 包创建了一个 2D 精灵动画。我的角色是一个 sprite sheet (PBS 文件)。在 PBS 文件中所有的 spites (眼睛,嘴巴等,-角色基本上是一个带有脸的正方形) 被排列并附着骨骼。然后我在 Unity 中动画角色的空闲动画。…

    2024-04-16 07:06:45
    0 93 31
  • 数控编程简单图形例题:简单的 2D图形编程(2d graphics programming)

    关于数控编程简单图形例题的问题,在2d graphics programming中经常遇到,几年前,我在 C 和 C ++ 中使用 DirectDraw 来绘制一些简单的 2D 图形。我习惯了创建表面,使用指针写入它,翻转后缓冲区,在屏幕外表面存储精灵等步骤。所以今天如果我想用 C 或 C ++ 编写一些 2D 图形程序,该怎么做?…

    2024-06-01 03:55:05
    0 95 89
  • 银土cp:2d土砖到 3d土砖(earthtiles)

    关于银土cp的问题,在earthtiles中经常遇到,Scenario…

    2024-03-31 02:29:13
    0 57 42
  • 我想学c4d:想学写 2D游戏(2d platformer flash games)

    关于我想学c4d的问题,在2d platformer flash games中经常遇到,嘿,stackoverflow 社区!我学习了 C# 的基础知识 (我可以编写一些 Form-Applications),现在我想学习如何编写 2d 游戏。我不知道从哪里开始。是否有适合 2d 游戏的引擎?在学习了 2d 的基础知识之后,我想编写在 windows 和 linux 下工作的简单游戏 (那很酷,linux:))。…

    2023-10-20 06:46:23
    0 67 24

发表评论

登录 后才能评论

评论列表(1条)