【Python】Matplotlib:立体永生花绘制

news2025/4/29 5:35:22

本文代码部分实现参考自CSDN博客:https://blog.csdn.net/ak_bingbing/article/details/135852038

一、引言

Matplotlib作为Python生态中最著名的可视化库,其三维绘图功能可以创造出令人惊叹的数学艺术。本文将通过一个独特的参数方程,结合极坐标系转换与动画技术,演示如何用代码"栽培"一朵永恒旋转的立体永生花。该作品展现了数学之美与编程创意的完美结合。

二、实现原理

2.1 参数方程设计

永生花的形态由以下核心方程构建:

  • 时间维度t从-4π到26π渐变,形成螺旋生长轨迹
  • 衰减函数p = (π/2)*exp(-t/(8π))控制花瓣的展开程度
  • 振荡函数change = sin(20t)/50添加自然卷曲效果
  • 形态函数u = 1 - (1 - mod(3.3t, 2π)/π)^4/2 + change生成花瓣的波浪边缘

2.2 坐标变换

通过极坐标转换实现三维曲面:

x = linspace(0, 1, res_x)  # 径向采样
t = linspace(-4π, 26π, res_t)  # 角度采样
r = 1.5*u*(x*sin(p)+y*cos(p))  # 极径计算
h = u*(x*cos(p)-y*sin(p))      # 高度计算
X, Y = r*cos(t), r*sin(t)      # 转换为笛卡尔坐标

三、代码实现

3.1 曲面生成

def generate_surface(res_x=25, res_t=1151):
    """生成极坐标曲面数据"""
    x, t = np.meshgrid(
        np.linspace(0, 1, res_x),
        np.linspace(-4 * np.pi, 26 * np.pi, res_t)
    )
    p = (np.pi / 2) * np.exp(-t / (8 * np.pi))  # 衰减函数
    change = np.sin(20 * t) / 50                 # 振荡修正项
    u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi)**4 / 2 + change
    y = 2 * (x**2 - x)**2 * np.sin(p)            # 纵向偏移
    r = 1.5 * u * (x * np.sin(p) + y * np.cos(p)) # 极径计算
    h = u * (x * np.cos(p) - y * np.sin(p))       # 高度计算
    return r * np.cos(t), r * np.sin(t), h        # 笛卡尔坐标转换

3.2 动画创建

def create_animation(xyz, elev=30, angle_step=2, interval=50):
    """创建3D自动旋转动画"""
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(projection='3d')

    # 绘制彩色曲面
    ax.plot_surface(*xyz, cmap='magma', linewidth=0, antialiased=True)

    # 可视化优化
    ax.set_axis_off()
    plt.title('永生花开映挚爱', fontsize=16)

    # 动画旋转逻辑
    def _rotate(angle):
        ax.view_init(elev=elev, azim=angle)

    # 创建动画对象
    ani = animation.FuncAnimation(
        fig, _rotate,
        frames=np.arange(0, 360, angle_step),
        interval=interval
    )
    plt.show()

四、效果展示

在这里插入图片描述

  1. 色彩映射:使用magma色板实现熔岩渐变效果
  2. 动态效果:通过每50ms旋转2度实现平滑转动
  3. 视觉优化
    • 隐藏坐标轴(set_axis_off())
    • 抗锯齿处理(antialiased=True)
    • 白色背景配置

五、源码展示

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation

# 配置全局参数
plt.rcParams.update({
    'font.sans-serif': ['SimHei'],  # 中文字体
    'axes.facecolor': 'white',      # 坐标背景
    'savefig.facecolor': 'white'
})


def generate_surface(res_x=25, res_t=1151):
    """生成极坐标曲面数据"""
    x, t = np.meshgrid(
        np.linspace(0, 1, res_x),
        np.linspace(-4 * np.pi, 26 * np.pi, res_t)
    )
    p = (np.pi / 2) * np.exp(-t / (8 * np.pi))
    change = np.sin(20 * t) / 50
    u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi) ** 4 / 2 + change
    y = 2 * (x**2 - x)**2 * np.sin(p)
    r = 1.5 * u * (x * np.sin(p) + y * np.cos(p))
    h = u * (x * np.cos(p) - y * np.sin(p))
    return r * np.cos(t), r * np.sin(t), h


def create_animation(xyz, elev=30, angle_step=2, interval=50):
    """创建并播放3D自动旋转动画"""
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(projection='3d')

    # 绘制曲面
    ax.plot_surface(*xyz, cmap='magma', linewidth=0, antialiased=True)

    # 隐藏坐标轴和刻度
    ax.set_axis_off()
    plt.title('永生花开映挚爱', fontsize=16)

    # 旋转函数
    def _rotate(angle):
        ax.view_init(elev=elev, azim=angle)

    ani = animation.FuncAnimation(
        fig, _rotate,
        frames=np.arange(0, 360, angle_step),
        interval=interval
    )
    plt.show()


if __name__ == '__main__':
    xyz = generate_surface()
    create_animation(xyz)

六、总结

本文通过数学参数方程与Matplotlib三维可视化功能的结合,实现了一个富有艺术美感的数字永生花。该案例展示了如何将:

  1. 极坐标系转换
  2. 参数化曲面生成
  3. 三维动画控制
    等关键技术有机结合。读者可通过调整方程参数或更换色板(如viridisplasma),创造出独具个人风格的数字花卉。

完整代码及运行环境要求见原文开头部分。建议在Jupyter Notebook或支持交互绘图的IDE中运行以获得最佳动画效果。

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

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

相关文章

Unity AI-使用Ollama本地大语言模型运行框架运行本地Deepseek等模型实现聊天对话(一)

一、Ollama介绍 官方网页:Ollama官方网址 中文文档参考:Ollama中文文档 相关教程:Ollama教程 Ollama 是一个开源的工具,旨在简化大型语言模型(LLM)在本地计算机上的运行和管理。它允许用户无需复杂的配置…

SAP /SDF/SMON配置错误会导致HANA OOM以及Disk Full的情况

一般来说,为了保障每日信息收集,每个企业都会配置/SDF/SMON的监控。这样在出现性能问题时,可以通过收集到的snapshot进行分析检查。如果/SDF/SMON在配置时选取了过多的记录项,或者选择了过低的时间间隔[Interval in seconds],那显…

CMU和苹果公司合作研究机器人长序列操作任务,提出ManipGen

我们今天来介绍一项完成Long-horizon任务的一项新的技术:ManipGen。 什么叫Long-horizon?就是任务比较长。说到底,也是任务比较复杂。 那么这个技术就给我们提供了一个非常好的解决这类问题的思路,同时,也取得了不错的…

大模型(LLMs)强化学习—— PPO

一、大语言模型RLHF中的PPO主要分哪些步骤? 二、举例描述一下 大语言模型的RLHF? 三、大语言模型RLHF 采样篇 什么是 PPO 中 采样过程?介绍一下 PPO 中 采样策略?PPO 中 采样策略中,如何评估“收益”? …

Maven多模块工程版本管理:flatten-maven-plugin扁平化POM

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

视频汇聚平台EasyCVR赋能高清网络摄像机:打造高性价比视频监控系统

在现代视频监控系统中,高清网络摄像机作为核心设备,其性能和配置直接影响监控效果和整体系统的价值。本文将结合EasyCVR视频监控的功能,探讨如何在满足使用需求的同时,优化监控系统的设计,降低项目成本,并提…

Unity 接入阿里的全模态大模型Qwen2.5-Omni

1 参考 根据B站up主阴沉的怪咖 开源的项目的基础上修改接入 AI二次元老婆开源项目地址(unity-AI-Chat-Toolkit): Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-too…

Nginx知识点

Nginx发展历史 Nginx 是由俄罗斯程序员 Igor Sysoev 开发的高性能开源 Web 服务器、反向代理服务器和负载均衡器 ,其历史如下: 起源与早期开发(2002 - 2004 年) 2002 年,当时 Igor Sysoev 在为俄罗斯门户网站 Rambl…

Mysql从入门到精通day6————时间和日期函数精讲

关于Mysql的日期和时间计算函数种类非常繁多,此处我们对常用的一些函数的用法通过实例演示让读者体会他们的用法,文章末尾也给出了时间和日期计算的全部函数 函数1:curdate()和current_date()函数 作用:获取当前日期 select curdate(),current_date();运行效果:

逻辑漏洞安全

逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。 由于开发者/设计者在开发过程中,由于代码…

Github 热点项目 rowboat 一句话生成多AI智能体!5分钟搭建企业级智能工作流系统

今日高星项目推荐:rowboat凭借1705总星数成为智能协作工具黑马!亮点速递:①自然语言秒变AI流水线——只需告诉它“帮外卖公司处理配送异常”,立刻生成多角色协作方案;②企业工具库即插即用,Python包HTTP接口…

(26)VTK C++开发示例 ---将点坐标写入PLY文件

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本示例演示了将球体数据写入ply文件,并从ply文件读取显示; PLY 文件(Polygon Fil…

2025蓝桥省赛c++B组第二场题解

前言 这场的题目非常的简单啊,至于为什么有第二场,因为当时河北正在刮大风被迫停止了QwQ,个人感觉是历年来最简单的一场,如果有什么不足之处,还望补充。 试题 A: 密密摆放 【问题描述】 小蓝有一个大箱子&#xff0…

vue3 vite打包后动态修改打包后的请求路径,无需打多个包给后端

整体思路和需求 部署多个服务器环境的时候,需要多次打包很麻烦,所以需要打包之后动态的修改 1.创建一个webconfig文件夹 2.在自己封装的接口文件中 判断是否在生产环境,然后将数据保存到vuex 中 代码: // 创建axios服务的函数 …

Nacos-SpringBoot 配置无法自动刷新问题排查

背景 Nacos SpringBoot版本中,提供了NacosValue注解,支持控制台修改值时,自动刷新,但是今天遇见了无法自动刷新的问题。 环境 SpringBoot 2.2.x nacos-client:2.1.0 nacos-config-spring-boot-starter:0…

【RabbitMQ消息队列】详解(一)

初识RabbitMQ RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。 核心概念 生产者(Producer):创建消息并将其…

Jenkins Pipeline 构建 CI/CD 流程

文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…

AJAX 介绍

一、什么是AJAX ? AJAX 是 异步的 JavaScript 和 XML(Asynchronous JavaScript And XML) 的缩写,是一种实现浏览器与服务器进行数据通信的技术。其核心是通过 XMLHttpRequest 对象在不重新刷新页面的前提下,与服务器交换数据并更…

promis(resolve,reject)入门级别

JavaScript Promise 的定义 Promise 是一种用于处理异步操作的对象,表示一个可能已经完成或者尚未完成的操作的结果。它的核心作用在于简化复杂的回调嵌套问题(即所谓的“回调地狱”),使异步代码更加清晰易读。 Promise 的状态 …

w~嵌入式C语言~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870384 一、开源MCU简易数字示波器项目 这是一款采用STC8A8K MCU制造的简单示波器,只有零星组件,易于成型。这些功能可以涵盖简单的测量: 该作品主要的规格如下: 单片机…