最近你是否也被李峋的爱心跳动代码所感动,心动不如行动,相同的代码很多,我们今天换一个玩法!构建一个三维的跳动爱心!嗯!这篇博客本着开源的思想!不是说谁对浪漫过敏的

目录

  • 环境介绍
  • 一、绘制一个三维的爱心
  • 二、细节点
    • 1.加入时间序列
    • 2.加入心脏的跳动
  • 一个好的展示
  • 完整代码

环境介绍

python3.8

numpy

matplotlib

一、绘制一个三维的爱心

关于这一步,我采用的是大佬博客中的最后一种绘制方法。当然,根据我的代码习惯,我还是稍做了一点点修改的。

class Guess:def __init__(self, bbox=(-1.5, 1.5), resolution=50, lines=20) -> None:"""bbox: 控制画格的大小resolution: 控制爱心的分辨率lines: 控制等高线的数量"""self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax = bbox*3A = np.linspace(self.xmin, self.xmax, resolution)self.B = np.linspace(self.xmin, self.xmax, lines)self.A1, self.A2 = np.meshgrid(A, A)def coordinate(self, x, y, z):"""生成坐标"""return (x**2+(9/4)*y**2+z**2-1)**3-x**2*z**3-(9/80)*y**2*z**3def draw(self, ax):"""绘制坐标"""for z in self.B:X, Y = self.A1, self.A2Z = self.coordinate(X, Y, z)+zcset = ax.contour(X, Y, Z, [z], zdir='z', colors=('pink',))for y in self.B:X, Z = self.A1, self.A2Y = self.coordinate(X, y, Z)+ycset = ax.contour(X, Y, Z, [y], zdir='y', colors=('pink',))for x in self.B:Y, Z = self.A1, self.A2X = self.coordinate(x, Y, Z) + xcset = ax.contour(X, Y, Z, [x], zdir='x', colors=('pink',))def run(self):fig = plt.figure()ax = fig.add_subplot(projection='3d')ax.set_zlim3d(self.zmin, self.zmax)ax.set_xlim3d(self.xmin, self.xmax)ax.set_ylim3d(self.ymin, self.ymax)plt.show()

但是这可以达到我们想要的效果吗?

显然不能!于是我们开始加入亿点点细节!

二、细节点

1.加入时间序列

想要心脏跳起来,我们就需要有时间维度的变化。那怎么做最合理呢?这里仅展示修改的代码位置。

代码如下(示例):

class Guess:def __init__(self, bbox=(-1.5, 1.5), resolution=50, lines=20) -> None:plt.ion()                                         # 开启画布的动态图模式self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax = bbox*3self.time = time.time()                           # 这里有一个衡量的时间坐标,很合理吧A = np.linspace(self.xmin, self.xmax, resolution)self.B = np.linspace(self.xmin, self.xmax, lines)self.A1, self.A2 = np.meshgrid(A, A)def run(self, count):"""加入count是我们想循环的次数"""fig = plt.figure()for i in range(count):plt.clf()                               # 每次清除画布ax = fig.add_subplot(projection='3d')ax.set_zlim3d(self.zmin, self.zmax)ax.set_xlim3d(self.xmin, self.xmax)ax.set_ylim3d(self.ymin, self.ymax)times = time.time()-self.t/ime          # 计算画布的当前时间状态self.draw(ax, coef)plt.show()

2.加入心脏的跳动

心脏的跳动当然不会是线性的了,我们需要心脏的跳动是有层次感的,并且还是可以做往返运动的。

emmmmm… 这么说来,cos是不是就是做这个用的?

于是…
代码如下(示例):

def __init__(self, bbox=(-1.5, 1.5), resolution=50, lines=20, scale=1.2) ->None:"""scale: 心脏缩放的系数"""self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax = bbox*3plt.ion() self.scale = scale   # scale: 心脏缩放的系数 设置为全局变量self.time = time.time()A = np.linspace(self.xmin, self.xmax, resolution)self.B = np.linspace(self.xmin, self.xmax, lines)self.A1, self.A2 = np.meshgrid(A, A)def draw(self, ax, coef):"""coef: 使得心脏可以按照时间跳动"""for z in self.B:X, Y = self.A1, self.A2Z = self.coordinate(X, Y, z)+zcset = ax.contour(X * coef, Y * coef, Z * coef, [z * coef], zdir='z', colors=('pink',))for y in self.B:X, Z = self.A1, self.A2Y = self.coordinate(X, y, Z)+ycset = ax.contour(X * coef, Y * coef, Z * coef, [y * coef], zdir='y', colors=('pink',))for x in self.B:Y, Z = self.A1, self.A2X = self.coordinate(x, Y, Z) + xcset = ax.contour(X * coef, Y * coef, Z * coef, [x * coef], zdir='x', colors=('pink',))def run(self, count):"""加入count是我们想循环的次数"""fig = plt.figure()for i in range(count):plt.clf()                               # 每次清除画布ax = fig.add_subplot(projection='3d')ax.set_zlim3d(self.zmin, self.zmax)ax.set_xlim3d(self.xmin, self.xmax)ax.set_ylim3d(self.ymin, self.ymax)times = time.time()-self.timecoef = np.cos(times) * (self.scale-1) + 1# coef 是用来放缩心脏的大小的,加入cos来使它有节奏的跳动self.draw(ax, coef)plt.pause(0.01)plt.show()

很好,这样我们就有了一个可以跳动的心脏,那么到这结束了嘛?


一个好的展示

当然没有!我们希望对象看到的时候他稍微有点东西,所以让它跳动却不能改变方向,岂不是看的不够全面?所以我们在加最后亿点点细节:

    def run(self, count):fig = plt.figure()for i in range(count):plt.clf()ax = fig.add_subplot(projection='3d')ax.set_title("你对象的名字?")              # 加上你对象的小nameax.set_zlim3d(self.zmin, self.zmax)ax.set_xlim3d(self.xmin, self.xmax)ax.set_ylim3d(self.ymin, self.ymax)times = time.time()-self.timeax.view_init(10, 100+np.cos(times) * 10)   # 让三维坐标图可以变换坐标展示coef = np.cos(times) * (self.scale-1) + 1self.draw(ax, coef)plt.pause(0.01)  # 让绘制出来的心脏可以显示plt.show()

完整代码

import time
import numpy as np
import matplotlib.pyplot as pltclass Guess:def __init__(self, bbox=(-1.5, 1.5), resolution=50, lines=20, scale=1.2) -> None:self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax = bbox*3plt.ion() self.scale = scaleself.time = time.time()A = np.linspace(self.xmin, self.xmax, resolution)self.B = np.linspace(self.xmin, self.xmax, lines)self.A1, self.A2 = np.meshgrid(A, A)def coordinate(self, x, y, z):return (x**2+(9/4)*y**2+z**2-1)**3-x**2*z**3-(9/80)*y**2*z**3def draw(self, ax, coef):for z in self.B:X, Y = self.A1, self.A2Z = self.coordinate(X, Y, z)+zcset = ax.contour(X * coef, Y * coef, Z * coef, [z * coef], zdir='z', colors=('pink',))for y in self.B:X, Z = self.A1, self.A2Y = self.coordinate(X, y, Z)+ycset = ax.contour(X * coef, Y * coef, Z * coef, [y * coef], zdir='y', colors=('pink',))for x in self.B:Y, Z = self.A1, self.A2X = self.coordinate(x, Y, Z) + xcset = ax.contour(X * coef, Y * coef, Z * coef, [x * coef], zdir='x', colors=('pink',))def run(self, count):fig = plt.figure()for i in range(count):plt.clf()ax = fig.add_subplot(projection='3d')ax.set_title("2LiuYu")ax.set_zlim3d(self.zmin, self.zmax)ax.set_xlim3d(self.xmin, self.xmax)ax.set_ylim3d(self.ymin, self.ymax)times = time.time()-self.timeax.view_init(10, 100+np.cos(times) * 10)coef = np.cos(times) * (self.scale-1) + 1self.draw(ax, coef)plt.pause(0.01)plt.show()if __name__ == '__main__':demo = Guess()demo.run(1000)

利用Python实现绘制3D爱心的代码分享相关推荐

  1. 利用Python+Turtle绘制简易爱心表白小程序

    完整代码位于文末 效果 快放10倍 总共分为三部分,左上角的正文,下方的心形和右下角的署名 特别需要注意的一点是这种东西不但要装Python,还与分辨率有关(换个屏幕可能效果雪崩,因为用的是绝对坐标) ...

  2. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  3. python代码示例图形-Python使用matplotlib绘制3D图形(代码示例)

    本篇文章给大家带来的内容是关于Python使用matplotlib绘制3D图形(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 3D图形在数据分析.数据建模.图形和图像处理 ...

  4. python制作3d相册代码_Python使用matplotlib绘制3D图形(代码示例)

    本篇文章给大家带来的内容是关于Python使用matplotlib绘制3D图形(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 3D图形在数据分析.数据建模.图形和图像处理 ...

  5. python绘制3d图形-python matlibplot绘制3D图形

    本文实例为大家分享了python matlibplot绘制3D图形的具体代码,供大家参考,具体内容如下 1.散点图使用scatter from mpl_toolkits.mplot3d import ...

  6. python如何做散点图-matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatte ...

  7. python画三维温度散点图-matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatte ...

  8. python绘制散点图-matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatte ...

  9. python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatte ...

最新文章

  1. Android之自定义ViewPager实现图片的无线轮播
  2. 《Groovy官方指南》目录
  3. 如何建立拨号上网连接
  4. 怎么搞技术呢?我觉得最简单的方法
  5. 【java/C# 服务器】IOS 配置推送证书 p12文件流程 - 勿以己悲
  6. VC资源分配、释放表
  7. Mac OS使用技巧十七:丰富多彩的花哨输入法
  8. 两个富翁打赌_打赌您无法解决这个Google面试问题。
  9. python点对点传输_python点对点简单实现
  10. html调用本地电脑应用,实现HTML调用打开本地软件文件
  11. 电脑计算机配置应用程序兼容性,软件和系统不兼容怎么办 电脑禁用程序兼容助手服务的操作方法...
  12. ML机器学习基础的编程技巧:
  13. ubuntu进程管理方法(转)
  14. HDU 6082 度度熊与邪恶大魔王(01背包)
  15. linux安装qq 中文乱码,在Deepin系统下用Wine运行的QQ音乐界面出现乱码的解决
  16. Resharper上手指南
  17. 西门子6ES70变频器速度控制的参数设置
  18. USB联机线编程接口(API)
  19. 怎样在新窗口中打开 jsp页面
  20. System.loadLibrary动态库加载

热门文章

  1. 富文本编辑器 mysql_富文本编辑器汇总
  2. 采用计算机进行图像处理的公司,计算机网页设计图像处理技术应用
  3. Python运行闪退问题
  4. webrtc技术名词和关键技术要点:SVC,REMB,SVC...
  5. 实用计算机知识,25个电脑实用知识
  6. [极客大挑战 2019]LoveSQL1 个人李姐
  7. Problem D: 欠债还钱 (多重背包)
  8. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解
  9. python 中setattr()函数
  10. EasyExcel复杂excel导入