C++生成一个世界(一)

一、本期成果

  1. 完成地形设计

  1. 保存地图设计

  1. 显示地图设计

二、实现

  1. 随机生成算法

地图肯定是随机生成的,但问题是完全随机就变成散点了,所以我们要增强它的规律性和连续性,就需要一种算法。

我选择了柏林算法,具体就移步[Nature of Code] 柏林噪声

要把噪音叠起来:

int ans=0, numer=25;
    for (int k = 0; k < stage; k++) {
        ans += floor(perlin(float(i) / numer, float(j) / numer, seed,numer) * numer);
        numer *= 2;
    }
    return ans;

但写完后就会发现边角全粘在一起了:

这可不是地图,我们要对边角进行一个修正:

// P点的插值
    float d1 = y - p0y;
    float t1 = 6.0 * pow(d1, 5.0) - 15.0 * pow(d1, 4.0) + 10.0 * pow(d1, 3.0);
    if (sqrt(pow(abs(x * loud - map_size / 2), 2.0) + pow(abs(y * loud - map_size / 2), 2.0)) > map_size / 2) {
        return (0 - sqrt(pow(abs(x * loud - map_size / 2), 2.0) + pow(abs(y * loud - map_size / 2), 2.0)) + map_size / 2) / 300+n1 * (1.0 - t1) + n0 * t1;
    }
    float n2 = n1 * (1.0 - t1) + n0 * t1;
    return n2;
  1. 保存地图设计

用个fstream.h就可以

srand(seed);
    ofstream savefile;
    string s1 = "./res/save" + to_string(seed) +"large=" + to_string(map_size) + "topography" + ".txt";
    const char* s2 = s1.c_str();
    savefile.open(s2);
    for (int i = 0; i < map_size; i++) {
        for (int j = 0; j < map_size; j++) {
            if (rand()%10000==0 && perlins(4, i, j)>32)river(i, j);
            savefile << perlins(4,i,j) << ' ';
        }
        savefile << endl;
    }
    savefile.close();
  1. 显示地图设计

用了easyx库

ifstream loadfile;
    loadfile.open(name.c_str(), ios::in);
    int highnum;
    for (int i = 0; i < map_size; i++) {
        for (int j = 0; j < map_size; j++) {
            loadfile >> highnum;
            if (highnum >= 16 * 7) { putpixel(i, j, RGB(186, 113, 70)); goto drawmap_flag; }
            if (highnum >= 16 * 6) { putpixel(i, j, RGB(237, 133, 78)); goto drawmap_flag; }
            if (highnum >= 16 * 5) { putpixel(i, j, RGB(241, 170, 116)); goto drawmap_flag; }
            if (highnum >= 16 * 4) { putpixel(i, j, RGB(227, 216, 196)); goto drawmap_flag; }
            if (highnum >= 16 * 3) { putpixel(i, j, RGB(228, 240, 236)); goto drawmap_flag; }
            if (highnum >= 16 * 2) { putpixel(i, j, RGB(168, 221, 195)); goto drawmap_flag; }
            if (highnum >= 16 * 1) { putpixel(i, j, RGB(106, 190, 156)); goto drawmap_flag; }
            if (highnum >= 16 * -2) { putpixel(i, j, RGB(50, 130, 246)); goto drawmap_flag; }
            if (highnum >= 16 * -4) { putpixel(i, j, RGB(0, 35, 245)); goto drawmap_flag; }
            if (highnum >= 16 * -6) { putpixel(i, j, RGB(0, 18, 154)); goto drawmap_flag; }
            putpixel(i, j, RGB(0, 12, 123));
            drawmap_flag:;
        }
    }
    loadfile.close();

三、跳转连接

第一篇,当然没有啦。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL柏林噪声算法是一种用于生成逼真的随机纹理和模拟自然材质的算法。它是由科学家肯·普莱伯(Ken Perlin)在1983年创造并命名的。 柏林噪声算法的基本原理是通过在一个网格中的各个顶点上分配随机数值,然后使用插值方法在网格内的其他点上计算出合适的数值。它的优点是生成的噪声表现出自然界中的一些特点,如渐变、连续性和纹理的自相似性。 算法的核心是一个被称为“Perlin 网格”的数据结构。这个网格是一个三维的基于向量的数组,每个向量代表一个网格点。在网格的每个顶点上,使用一个随机化的梯度向量来分配一个随机数值。然后通过在网格中插值计算,每个网格内的其他点都可以根据周围顶点的值来计算出一个合适的数值。 柏林噪声算法被广泛应用于计算机图形学的领域,特别是在生成逼真的纹理和模拟自然材质方面。它能够为平滑的、有机的形状创建真实感纹理,并且常用于实现地形生成、纹理合成、云雾效果、水波动效果等。 通过改变柏林噪声算法中的参数,例如插值方法、频率、幅度和持续时间等,可以创建出不同类型的噪声效果。这使得开发人员可以根据需求,灵活地控制生成的纹理和模拟效果的外观和表现。 总之,OpenGL柏林噪声算法是一种优秀的随机纹理生成算法,它为计算机图形学带来了丰富的纹理和模拟效果,并在游戏开发、电影特效等领域中得到广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值