python绘制随机地形地图

news2024/11/16 6:56:30

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

当我们谈论计算机编程中的地图生成时,通常会想到游戏开发、仿真模拟或者数据可视化等领域。Python 作为一门功能强大的编程语言,在地图生成方面有着丰富的资源和库。本文将介绍如何使用 Python 中的一些工具和库来绘制随机地形地图。

准备工作

在开始之前,我们需要确保安装了 Python 和一些必要的库。这里我们将使用 matplotlib 库来绘制地图,以及 numpy 库来生成随机地形。你可以通过以下命令来安装这些库:

pip install matplotlib numpy

生成随机地形

首先,我们需要生成随机的地形数据。这里我们将使用 numpy 库中的随机数生成函数来生成一个二维数组,代表地形的高度。

import numpy as np

def generate_terrain(width, height, scale=20, octaves=6, persistence=0.5, lacunarity=2.0, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    terrain = np.zeros((height, width))
    for y in range(height):
        for x in range(width):
            amplitude = 1
            frequency = 1
            for o in range(octaves):
                sampleX = x / scale * frequency
                sampleY = y / scale * frequency

                noise = np.interp([sampleX], [0, 1], [-1, 1]) * 2 - 1
                terrain[y][x] += noise * amplitude

                amplitude *= persistence
                frequency *= lacunarity
    return terrain

这段代码使用了 Perlin 噪声算法来生成随机地形数据。通过调整参数,我们可以控制生成地形的复杂程度。

绘制地图

接下来,我们将使用 matplotlib 库来绘制生成的地形数据。

import matplotlib.pyplot as plt

def plot_terrain(terrain):
    plt.figure(figsize=(10, 5))
    plt.imshow(terrain, cmap='terrain', origin='lower')
    plt.colorbar(label='Elevation')
    plt.title('Terrain Map')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()

# 生成地形数据
width = 100
height = 100
terrain = generate_terrain(width, height)

# 绘制地图
plot_terrain(terrain)

这段代码将生成的地形数据以热图的形式展示出来。你可以看到地形的高低起伏,颜色越亮代表海拔越高,颜色越暗代表海拔越低。

添加地形特征

除了简单的随机地形外,我们还可以添加一些地形特征,如山脉、河流等,使地图更加生动。

生成山脉

我们可以通过在地形中添加高度较高的区域来模拟山脉。

def add_mountains(terrain, num_mountains=5, mountain_height=10, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_mountains):
        peak_x = np.random.randint(0, width)
        peak_y = np.random.randint(0, height)
        radius = np.random.randint(10, 30)
        for y in range(height):
            for x in range(width):
                distance_to_peak = np.sqrt((x - peak_x)**2 + (y - peak_y)**2)
                if distance_to_peak < radius:
                    terrain[y][x] += mountain_height * np.exp(-distance_to_peak / (radius / 3))
生成河流

河流是地形中常见的地形特征之一,我们可以在地图中模拟出河流的路径。

def add_river(terrain, river_width=3, river_depth=5, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    start_x = np.random.randint(0, width)
    start_y = 0
    end_x = np.random.randint(0, width)
    end_y = height - 1
    
    current_x = start_x
    current_y = start_y
    
    while current_y < end_y:
        next_x = np.clip(current_x + np.random.randint(-1, 2), 0, width - 1)
        current_y += 1
        for x in range(max(0, next_x - river_width // 2), min(width, next_x + river_width // 2)):
            for y in range(max(0, current_y - river_width // 2), min(height, current_y + river_width // 2)):
                terrain[y][x] -= river_depth
        current_x = next_x

完整代码

将上述的地形特征生成函数与前文的地形生成函数结合起来,并进行绘图:

terrain = generate_terrain(width, height)
add_mountains(terrain)
add_river(terrain)

plot_terrain(terrain)

通过这些地形特征的添加,我们可以生成更加多样化和丰富的地形地图。这些地图不仅可以用于游戏开发中的世界地图生成,还可以用于模拟实验中的地理环境,或者作为数据可视化的一部分呈现地形信息。 Python 的强大库和灵活性使得地图生成变得轻而易举。

自定义地形特征

除了山脉和河流之外,我们还可以添加其他类型的地形特征,比如湖泊、峡谷等,来使地图更加多样化。

生成湖泊

湖泊是由于低洼地区积水而形成的地形特征,我们可以在地图中随机选择一些低洼的区域并将其填充成湖泊。

def add_lakes(terrain, num_lakes=3, lake_size=10, lake_depth=5, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_lakes):
        lake_x = np.random.randint(0, width)
        lake_y = np.random.randint(0, height)
        for y in range(max(0, lake_y - lake_size), min(height, lake_y + lake_size)):
            for x in range(max(0, lake_x - lake_size), min(width, lake_x + lake_size)):
                terrain[y][x] -= lake_depth
生成峡谷

峡谷是由于地质构造而形成的地形特征,我们可以模拟出峡谷两侧的陡峭山壁。

def add_canyons(terrain, num_canyons=2, canyon_width=5, canyon_depth=10, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_canyons):
        start_x = np.random.randint(0, width)
        start_y = np.random.randint(0, height)
        direction_x = np.random.choice([-1, 1])
        direction_y = np.random.choice([-1, 1])
        
        for step in range(canyon_width):
            current_x = start_x + step * direction_x
            current_y = start_y + step * direction_y
            for y in range(max(0, current_y - canyon_width), min(height, current_y + canyon_width)):
                for x in range(max(0, current_x - canyon_width), min(width, current_x + canyon_width)):
                    terrain[y][x] -= canyon_depth * (1 - step / canyon_width)

完整代码

将上述的地形特征生成函数与前文的地形生成函数结合起来,并进行绘图:

terrain = generate_terrain(width, height)
add_mountains(terrain)
add_river(terrain)
add_lakes(terrain)
add_canyons(terrain)

plot_terrain(terrain)

通过添加不同的地形特征,我们可以生成更加多样化和复杂的地形地图,从而满足不同应用场景下的需求。这些地形地图不仅可以提供视觉上的享受,还可以用于模拟实验、游戏开发、数据可视化等各种用途。 Python 的灵活性和丰富的库使得地图生成变得简单而有趣。

自定义地形特征

除了山脉和河流之外,我们还可以添加其他类型的地形特征,比如湖泊、峡谷等,来使地图更加多样化。

生成湖泊

湖泊是由于低洼地区积水而形成的地形特征,我们可以在地图中随机选择一些低洼的区域并将其填充成湖泊。

def add_lakes(terrain, num_lakes=3, lake_size=10, lake_depth=5, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_lakes):
        lake_x = np.random.randint(0, width)
        lake_y = np.random.randint(0, height)
        for y in range(max(0, lake_y - lake_size), min(height, lake_y + lake_size)):
            for x in range(max(0, lake_x - lake_size), min(width, lake_x + lake_size)):
                terrain[y][x] -= lake_depth
生成峡谷

峡谷是由于地质构造而形成的地形特征,我们可以模拟出峡谷两侧的陡峭山壁。

def add_canyons(terrain, num_canyons=2, canyon_width=5, canyon_depth=10, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_canyons):
        start_x = np.random.randint(0, width)
        start_y = np.random.randint(0, height)
        direction_x = np.random.choice([-1, 1])
        direction_y = np.random.choice([-1, 1])
        
        for step in range(canyon_width):
            current_x = start_x + step * direction_x
            current_y = start_y + step * direction_y
            for y in range(max(0, current_y - canyon_width), min(height, current_y + canyon_width)):
                for x in range(max(0, current_x - canyon_width), min(width, current_x + canyon_width)):
                    terrain[y][x] -= canyon_depth * (1 - step / canyon_width)

完整代码

将上述的地形特征生成函数与前文的地形生成函数结合起来,并进行绘图:

terrain = generate_terrain(width, height)
add_mountains(terrain)
add_river(terrain)
add_lakes(terrain)
add_canyons(terrain)

plot_terrain(terrain)

通过添加不同的地形特征,我们可以生成更加多样化和复杂的地形地图,从而满足不同应用场景下的需求。这些地形地图不仅可以提供视觉上的享受,还可以用于模拟实验、游戏开发、数据可视化等各种用途。 Python 的灵活性和丰富的库使得地图生成变得简单而有趣。

进一步优化地形生成算法

在前面的代码中,我们使用了简单的 Perlin 噪声算法来生成随机地形数据。虽然这种方法可以生成较为自然的地形,但在一些情况下可能会出现连续性不够好、地形过于平滑等问题。为了进一步优化地形生成的质量,我们可以考虑使用更复杂的地形生成算法,例如 Diamond-Square 算法。

Diamond-Square 算法是一种递归的地形生成算法,它通过不断地对方形区域进行分割和计算来生成地形。这种算法生成的地形具有更好的连续性和细节性,能够更好地模拟真实世界中的地形特征。

下面是一个简化版的 Diamond-Square 算法的实现示例:

def diamond_square_algorithm(size, roughness=0.5, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    terrain = np.zeros((size, size))
    step_size = size - 1

    # 初始化角点高度
    terrain[0][0] = np.random.uniform(0, 1)
    terrain[0][size - 1] = np.random.uniform(0, 1)
    terrain[size - 1][0] = np.random.uniform(0, 1)
    terrain[size - 1][size - 1] = np.random.uniform(0, 1)

    while step_size > 1:
        half_step = step_size // 2

        # Diamond 步骤
        for y in range(0, size - 1, step_size):
            for x in range(0, size - 1, step_size):
                average = (terrain[y][x] + terrain[y][x + step_size] + terrain[y + step_size][x] + terrain[y + step_size][x + step_size]) / 4
                terrain[y + half_step][x + half_step] = average + np.random.uniform(-roughness, roughness)

        # Square 步骤
        for y in range(0, size - 1, half_step):
            for x in range((y + half_step) % step_size, size - 1, step_size):
                average = 0
                count = 0
                if y - half_step >= 0:
                    average += terrain[y - half_step][x]
                    count += 1
                if y + half_step < size:
                    average += terrain[y + half_step][x]
                    count += 1
                if x - half_step >= 0:
                    average += terrain[y][x - half_step]
                    count += 1
                if x + half_step < size:
                    average += terrain[y][x + half_step]
                    count += 1
                terrain[y][x] = average / count + np.random.uniform(-roughness, roughness)

                if x == 0:
                    terrain[y][size - 1] = average / count + np.random.uniform(-roughness, roughness)
                if y == 0:
                    terrain[size - 1][x] = average / count + np.random.uniform(-roughness, roughness)

        step_size //= 2
        roughness /= 2

    return terrain

使用 Diamond-Square 算法生成地形

现在,我们可以使用 Diamond-Square 算法来生成地形,并绘制地图:

terrain = diamond_square_algorithm(size=128, roughness=0.7, seed=42)
plot_terrain(terrain)

通过 Diamond-Square 算法生成的地形具有更多的细节和更好的连续性,能够更好地模拟真实世界中的地形特征。这使得我们可以生成更加真实和多样化的地形地图,满足不同应用场景下的需求。

自定义地形特征

在生成地形之后,我们可以进一步增强地图的真实感和趣味性,通过添加自定义的地形特征,比如树木、建筑物等。

生成树木

树木是地图中常见的地形特征,我们可以随机在地图的某些位置生成树木,使得地图更加生动。

def add_trees(terrain, num_trees=50, min_height=0.3, max_height=0.8, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_trees):
        tree_x = np.random.randint(0, width)
        tree_y = np.random.randint(0, height)
        if terrain[tree_y][tree_x] > min_height:
            terrain[tree_y][tree_x] += np.random.uniform(0, max_height - min_height)
生成建筑物

建筑物是地图中的人工结构,可以通过随机在地图上生成一些方块状的结构来模拟建筑物的存在。

def add_buildings(terrain, num_buildings=10, min_height=0.5, max_height=0.9, building_size=5, seed=None):
    if seed is not None:
        np.random.seed(seed)
    
    height, width = terrain.shape
    for _ in range(num_buildings):
        building_x = np.random.randint(0, width - building_size)
        building_y = np.random.randint(0, height - building_size)
        building_height = np.random.uniform(min_height, max_height)
        terrain[building_y:building_y+building_size, building_x:building_x+building_size] += building_height

完整代码

将上述的地形特征生成函数与地形生成函数结合起来,并进行绘图:

terrain = diamond_square_algorithm(size=128, roughness=0.7, seed=42)
add_mountains(terrain)
add_river(terrain)
add_lakes(terrain)
add_canyons(terrain)
add_trees(terrain)
add_buildings(terrain)

plot_terrain(terrain)

通过添加树木、建筑物等自定义地形特征,我们可以使地图更加丰富多彩,增加了地图的真实感和趣味性。这样的地图不仅可以用于游戏开发中的场景设计,还可以用于模拟实验、教学演示等多种应用场景。

总结

总的来说,本文介绍了如何使用 Python 来生成随机地形地图,并通过添加不同的地形特征来增强地图的真实感和趣味性。首先,我们使用了 Perlin 噪声算法和 Diamond-Square 算法来生成随机地形数据,这些算法能够生成具有不同形状和复杂度的地形。然后,我们介绍了如何通过添加山脉、河流、湖泊、峡谷等地形特征来丰富地图内容,使地图更加多样化。接着,我们进一步讨论了如何添加自定义地形特征,比如树木、建筑物等,从而增强地图的视觉效果和趣味性。最后,通过综合运用这些技术,我们可以生成出各种形式的地形地图,满足不同应用场景下的需求,包括游戏开发、模拟实验、教学演示等。 Python 的丰富库和灵活性使得地图生成变得简单而有趣,同时也为我们提供了广阔的想象空间,可以创造出更加丰富多彩的地图作品。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用预训练模型构建自己的深度学习模型(迁移学习)

在深度学习的实际应用中&#xff0c;很少会去从头训练一个网络&#xff0c;尤其是当没有大量数据的时候。即便拥有大量数据&#xff0c;从头训练一个网络也很耗时&#xff0c;因为在大数据集上所构建的网络通常模型参数量很大&#xff0c;训练成本大。所以在构建深度学习应用时…

大数据学习第四天

文章目录 yaml 三大组件的方式交互流程hive 使用安装mysql(hadoop03主机)出现错误解决方式临时密码 卸载mysql (hadoop02主机)卸载mysql(hadoop01主机执行)安装hive上传文件解压解决版本差异修改hive-env.sh修改 hive-site.xml上传驱动包初始化元数据在hdfs 创建hive 存储目录启…

毫米波雷达模块在高精度人体姿态识别的应用

人体姿态识别是计算机视觉领域中的重要问题之一&#xff0c;具有广泛的应用前景&#xff0c;如智能安防、虚拟现实、医疗辅助等。毫米波雷达技术作为一种无需直接接触目标就能实现高精度探测的感知技术&#xff0c;在人体姿态识别领域具有独特的优势。本文将探讨毫米波雷达模块…

kubeadmin搭建自建k8s集群

一、安装要求 在开始之前&#xff0c;部署Kubernetes集群的虚拟机需要满足以下几个条件&#xff1a; 操作系统 CentOS7.x-86_x64硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU&#xff0c;硬盘30GB或更多【注意master需要两核】可以访问外网&#xff0c;需要…

Python 全栈体系【四阶】(三十四)

第五章 深度学习 六、PaddlePaddle 图像分类 4. 思路及实现 4.1 数据集介绍 来源&#xff1a;爬虫从百度图片搜索结果爬取 内容&#xff1a;包含 1036 张水果图片&#xff0c;共 5 个类别&#xff08;苹果 288 张、香蕉 275 张、葡萄 216 张、橙子 276 张、梨 251 张&#…

NVIDIA Jetson jtop查看资源信息

sudo -H pip install -U jetson-stats 安装好之后可能需要reboot 执行jtop&#xff1a; 时间久了可能会退出&#xff0c;可参考如下再次启动。 nvidiategra-ubuntu:~$ jtop The jtop.service is not active. Please run: sudo systemctl restart jtop.service nvidiategra-ub…

【古琴】倪诗韵古琴雷修系列(形制挺多的)

雷音系列雷修&#xff1a;“修”字取意善、美好的&#xff0c;更有“使之完美”之意。精品桐木或普通杉木制&#xff0c;栗壳色&#xff0c;纯鹿角霜生漆工艺。 方形龙池凤沼。红木配件&#xff0c;龙池上方有“倪诗韵”亲笔签名&#xff0c;凤沼下方&#xff0c;雁足上方居中位…

mPEG-Biotin,Methoxy PEG Biotin在免疫亲和层析、荧光标记和生物传感器等领域发挥关键作用

【试剂详情】 英文名称 mPEG-Biotin&#xff0c;Methoxy PEG Biotin 中文名称 聚乙二醇单甲醚生物素&#xff0c;甲氧基-聚乙二醇-生物素 外观性状 由分子量决定&#xff0c;固体或者粘稠液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.…

Activiti7基础

Activiti7 一、工作流介绍 1.1 概念 工作流(Workflow)&#xff0c;就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标…

2024-04-23 linux 查看内存占用情况的命令free -h和cat /proc/meminfo

一、要查看 Linux 系统中的内存占用大小&#xff0c;可以使用 free 命令或者 top 命令。下面是这两个命令的简要说明&#xff1a; 使用 free 命令&#xff1a; free -h这将显示系统当前的内存使用情况&#xff0c;包括总内存、已用内存、空闲内存以及缓冲区和缓存的使用情况。…

Git笔记-配置ssh

Git在Deepin中的ssh配置 一、环境二、安装1. 查看GitHub账户2. 配置 git3. 生成 ssh key 三、配置 一、环境 系统&#xff1a; Deepin v23 Git仓库&#xff1a;GitHub 二、安装 1. 查看GitHub账户 在设置界面看到自己的邮箱&#xff0c;这个邮箱就是后面会用到的邮箱 2. …

上位机图像处理和嵌入式模块部署(树莓派4b的一种固件部署方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果软件开发好了之后&#xff0c;下面就是实施和部署。对于树莓派4b来说&#xff0c;部署其实就是烧录卡和拷贝文件。之前我们烧录卡&#xff0c;…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器&#xff0c;这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 浏览器访问 http://10.85…

26版SPSS操作教程(高级教程第十三章)

前言 #今日世界读书日&#xff0c;宝子你&#xff0c;读书了嘛~ #本期内容&#xff1a;主成分分析、因子分析、多维偏好分析 #由于导师最近布置了学习SPSS这款软件的任务&#xff0c;因此想来平台和大家一起交流下学习经验&#xff0c;这期推送内容接上一次高级教程第十二章…

卓越体验的秘密武器:评测ToDesk云电脑、青椒云、天翼云的稳定性和流畅度

大家好&#xff0c;我是猫头虎。近两年随着大模型的火爆&#xff0c;我们本地环境常常难以满足运行这些大模型的硬件需求。因此&#xff0c;云电脑平台成为了一个理想的解决方案。今天&#xff0c;我将介绍并评测几款主流云电脑产品&#xff1a;ToDesk云电脑、天翼云电脑和青椒…

网络通信安全

一、网络通信安全基础 TCP/IP协议简介 TCP/IP体系结构、以太网、Internet地址、端口 TCP/IP协议简介如下&#xff1a;&#xff08;from文心一言&#xff09; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff0…

PVE虚拟机隐藏状态栏虚拟设备

虚拟机启动后&#xff0c;状态栏会出现一些虚拟设备&#xff0c;点击弹出会导致虚拟机无法使用。 解决方案&#xff1a; 1、在桌面新建disable_virtio_removale.bat文件&#xff0c;内容如下&#xff1a; ECHO OFF FOR /f %%A IN (reg query "HKLM\SYSTEM\CurrentContro…

Docker容器化技术

Docker容器化技术 1.Docker概念 Docker是一个开源的应用容器引擎基于go语言实现Docker可以让开发者们打包他们的应用以及依赖包到一个轻量级的、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上容器是完全使用沙箱机制&#xff0c;相互隔离容器性能开销极低Docke…

Facebook的时间机器:回溯社交媒体的历史

1. 社交媒体的起源与早期模式 社交媒体的历史可以追溯到互联网的早期发展阶段。在Web 1.0时代&#xff0c;互联网主要是一个信息发布平台&#xff0c;用户主要是被动地接收信息。但随着Web 2.0的兴起&#xff0c;互联网逐渐转变为一个互动和参与的平台&#xff0c;社交媒体应运…

HTTP与SOCKS-哪种协议更适合您的代理需求?

网络代理技术是我们日常使用网络时必不可少的一项技术&#xff0c;它可以为我们提供隐私保护和负载均衡的能力&#xff0c;从而保证我们的网络通信更加安全和顺畅。而其中最主流的两种协议就是HTTP和SOCKS。虽然它们都是用于网络代理的协议&#xff0c;但在实际应用中却存在着一…