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 ld some vars
cl 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 轴的角度对这些线进行排序,然后按照该顺序遍历它们以在控制点周围构造多边形。

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

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

(120)
Cnbr能裂解哪些氨基酸:使用 JavaScript将核苷酸转换为氨基酸
上一篇
如何把网页保存为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 80 89
  • 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 61 29
  • 激光祛斑吃维c吃多久:二维激光扫描中的目标检测(2d lidar object detection)

    关于激光祛斑吃维c吃多久的问题,在2d lidar object detection中经常遇到,目前,我拼命尝试基于 2D 激光扫描(另一个机器人)检测物体(机器人)。在以下两张图片中,蓝色箭头对应于激光扫描仪的姿势,并指向我想要检测的物体。…

    2024-09-30 14:02:37
    0 80 99
  • C4d安装教程:C++ 2D游戏开发教程(2d game design tutorial)

    关于C4d安装教程的问题,在2d game design tutorial中经常遇到,Terry Cavanaugh reccomended 我前几天学习 C ++,所以有人可以将我链接到一个完整的和最近的(2012 年末最老的),游戏开发教程吗?我更喜欢 C ++,但是,如果你不知道一个,一个外部库就可以了。我可以用 C # / Python / Java 制作游戏,所以我知道非常基本的(如 int 是什么),但我已经尝试使用 C + 教程…

    2024-07-18 13:06:04
    0 34 65
  • Cross join:如何CROSSJOIN 2dataframe

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

    2024-01-15 10:06:38
    0 71 96
  • 果酸维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 17 78
  • 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 18 52
  • 数控编程简单图形例题:简单的 2D图形编程(2d graphics programming)

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

    2024-06-01 03:55:05
    0 58 43

发表评论

登录 后才能评论

评论列表(82条)