【CSDN 编者按】七夕是中国民间的传统节日,不同时代、不同地域的人们给这个节日赋予了不同的含义。在漫长的演变过程中,七夕成了牛郎织女相会的日子。正因为这个美丽的爱情传说,七夕被视为中国最具浪漫色彩的、象征爱情的节日。在西风东渐的背景下,七夕又成了中国的“情人节”。

作者 | 许向武       责编 | 张红月

出品 | CSDN(ID:CSDNnews)

既然是情人节,浪漫的程序员总喜欢搞点花样出来,为紧张且平淡的生活添点色彩。今天给各位带来的是3D动画版的丘比特爱情之箭:一只金色的丘比特爱情之箭以慢镜头方式缓缓刺中一个脉动的红心,红心的主人将会无法控制地爱上TA所看到第一个人。

我猜,当初牛郎和织女一定是被丘比特的爱情之箭射中以后才相爱的,毕竟,他们都生活的天上——西方文化中,木星(Jupiter)就是小爱神丘比特,金星(Venus)则是大爱神维纳斯。

在丘比特的出场爱情之箭前,先用matplotlib绘制一个2D的红心热热身。

import numpy as np
import matplotlib.pyplot as pltx = np.linspace(-np.pi/2, np.pi/2, 1000)
y1 = np.power(np.cos(x),0.5) * np.cos(200*x) + np.power(np.absolute(x),0.5) - 0.7
y2 = np.power(4-np.power(x, 2), 0.01)plt.plot(x, y1*y2, c='r')
plt.show()

上下波动的曲线形成的心形

放大一点看的话,就会发现上面这个红心其实是一条连续上下波动的曲线。下面的红心,是一个真正封闭的心形,只不过是由四条曲线首尾相连组成的。

import numpy as np
import matplotlib.pyplot as pltx1 = np.linspace(0, 2, 300)
x2 = np.linspace(0, -2, 300)y11 = (np.power(x1, 2/3) + np.power(np.power(x1, 4/3)-4*np.power(x1, 2)+4, 0.5))/2 - 0.12
y12 = (np.power(x1, 2/3) - np.power(np.power(x1, 4/3)-4*np.power(x1, 2)+4, 0.5))/2
y21 = (np.power(-x2, 2/3) + np.power(np.power(-x2, 4/3)-4*np.power(-x2, 2)+4, 0.5))/2 - 0.12
y22 = (np.power(-x2, 2/3) - np.power(np.power(-x2, 4/3)-4*np.power(-x2, 2)+4, 0.5))/2plt.plot(x1, y11, c='r')
plt.plot(x1, y12, c='r')
plt.plot(x2, y21, c='r')
plt.plot(x2, y22, c='r')
plt.show()

四条曲线首尾相连组成的心形

那么,可用用一笔画一个心形吗?当然可以,极坐标方程 r = Arccos(sinθ)就是一条心形线,只是形状不够完美而已。

import numpy as np
import matplotlib.pyplot as plttheta = np.linspace(0, 2*np.pi, 1000)
x = np.arccos(np.sin(theta)) * np.cos(theta)
y = np.arccos(np.sin(theta)) * np.sin(theta)plt.plot(x, y, c='r')
plt.show()

心形线

是时候展示3D版的红心了。运行下面的代码,除了需要numpy模块,还需要安装wxgl模块——基于PyOpenGL的三维数据绘图工具包。

pip install wxgl

关于wxgl模块的更多详情,请点击十分钟玩转3D绘图:WxGL完全手册,这里是中文文档。

下面是3D版的红心的绘制代码:

import numpy as np
import wxgl.glplot as glta = np.linspace(0, 2*np.pi, 500)
b = np.linspace(0.5*np.pi, -0.5*np.pi, 500)
lons, lats = np.meshgrid(a, b)
w = np.sqrt(np.abs(a - np.pi)) * 2
x = 2 * np.cos(lats) * np.sin(lons) * w
y = -2 * np.cos(lats) * np.cos(lons) * w
z = 2 * np.sin(lats)glt.mesh(x, y, z, color='crimson') # crimson - 绯红
glt.show()

是不是很简单?wxgl的使用风格几乎和matplotlib完全一致。拖动鼠标,就可以看到这个3D版的红心的前后左右了。

3D红心

接下来,这段代码将红心数据的生成封装了一个函数,然后调用自定义的模型变换函数,这颗红心就跳动起来了。

import numpy as np
import wxgl.glplot as gltdef red_heart(r, slices=100, thick=2.0, shift=(0,0,0)):"""返回红心顶点数据"""a = np.linspace(0, 2*np.pi, slices)b = np.linspace(0.5*np.pi, -0.5*np.pi, slices)lons, lats = np.meshgrid(a, b)w = np.sqrt(np.abs(a - np.pi)) * thickx = r * np.cos(lats) * np.sin(lons) * w + shift[0]y = -r * np.cos(lats) * np.cos(lons) * w + shift[1]z = r * np.sin(lats) + shift[2]return x, y, zdef heart_beat(t):"""心跳函数"""t %= 1000if t < 300:scale = 1 + t/3000elif t > 700:scale = 1 + (1000-t)/3000else:scale = 1.1return (scale,)glt.mesh(*red_heart(2), color='crimson', transform=heart_beat)
glt.show()

点击左侧工具条上的播放按钮,这颗红心就会按照60次/秒的心率跳动起来。熟悉了wxgl的使用,不难读懂下面这个完整的丘比特爱情之箭的代码。

import numpy as np
import wxgl
import wxgl.glplot as gltdef red_heart(r, slices=100, thick=2.0, shift=(0,0,0)):"""返回红心顶点数据"""a = np.linspace(0, 2*np.pi, slices)b = np.linspace(0.5*np.pi, -0.5*np.pi, slices)lons, lats = np.meshgrid(a, b)w = np.sqrt(np.abs(a - np.pi)) * thickx = r * np.cos(lats) * np.sin(lons) * w + shift[0]y = -r * np.cos(lats) * np.cos(lons) * w + shift[1]z = r * np.sin(lats) + shift[2]return x, y, zdef heart_beat(t):"""心跳函数"""t %= 1000if t < 300:scale = 1 + t/3000elif t > 700:scale = 1 + (1000-t)/3000else:scale = 1.1return (scale,)def arrow_fly(t):"""丘比特之箭飞行函数"""t %= 4000if t > 2000:return ((0,-2,40-t/100),)else:return ((0,-2,0),)def heart_fly(t):"""丘比特之箭飞行函数"""t %= 4000if t > 2000:return ((0,0,1,90), (0,-2,40-t/100))else:return ((0,0,1,90), (0,-2,0))glt.figure(azim=50, elev=16, style='gray') # 设置初始方位角、高度角、背景色
glt.mesh(*red_heart(2), color='crimson', transform=heart_beat) # 绘制跳动的红心x, y, z = red_heart(0.2, thick=3.0, shift=(0,-8,0)) # 生成心形箭头顶点数据
glt.mesh(x, -z, y, color='crimson', transform=heart_fly) # 绘制心形箭头light = wxgl.SunLight(roughness=0, metalness=0, shininess=0.5) # 箭杆灯光
glt.cylinder((0,0,-8), (0,0,9), 0.1, color='goldenrod', transform=arrow_fly, light=light) # 绘制箭杆vs = [(-1,1,11), (1,-1,11), (1,-1,6), (-1,1,6),(-1,-1,11), (1,1,11), (1,1,6), (-1,-1,6)] # 箭尾顶点数据
texture = wxgl.Texture(r'res\feather.png') # 箭尾羽毛纹理
texcoord = [(0,1), (0,0), (1,0), (1,1),(0,1), (0,0), (1,0), (1,1)] # 箭尾纹理坐标
light = wxgl.BaseLight() # 箭尾灯光
glt.quad(vs, texture=texture, texcoord=texcoord, transform=arrow_fly, light=light) # 绘制箭尾glt.show()

wxgl的工具条提供了录制gif和MP4文件的功能,下面的gif就是使用wxgl自带的录制功能生成的。

代码中用到了羽毛的纹理,请下载这个图片,并保存到代码指定的位置。

— 推荐阅读 —

☞奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
☞越来越火的图数据库到底能做什么?
☞“我用 400 行 Swift 代码给破旧的自行车加了一个动感单车计步器!”

— 活动推荐 —

不止七夕,让《新程序员》陪伴你每个朝夕!

凡在七夕当日订阅《新程序员》的朋友

都将获得CSDN赠送的定制马克杯一个!

扫描下方二维码立即订阅

60几行代码绘制丘比特爱情之箭!相关推荐

  1. python画五角星代码_Python如何使用27行代码绘制星星图

    Python如何使用27行代码绘制星星图,代码,如何使用,星星,满天星,效果 Python如何使用27行代码绘制星星图 易采站长站,站长之家为您整理了Python如何使用27行代码绘制星星图的相关内容 ...

  2. 用python画满天星花朵_Python用27行代码绘制一幅满天星

    前言 每一个孩子都像星空中的一颗星星,散发着自己所特有的光芒照亮着整个夜空.今天就带大家用27行Python代码绘制一幅满天星吧. 全局设置 在绘制满天星的过程中要运用到turtle工具,它是Pyth ...

  3. 不用某度、某德个性地图编辑器,用Python几行代码绘制任何地区的风格化城市肌理

    原创:Ing_ideas 话不多说先上图: 1.OSMnx 简介 OSMnx 是Python的一个包,建立在 GeoPandas.NetworkX 和 matplotlib 之上,可以调用 OpenS ...

  4. 【用pandas_alive几行代码绘制竞赛动图】8.城市人口(测试代码+数据集+绘图参数解析)

    目录 8.城市人口 城市人口API说明: 城市人口数据集 城市人口图例程 总结 欢迎关注 『pandas_alive绘制竞赛动图』 专栏,持续更新中 欢迎关注 『pandas_alive绘制竞赛动图』 ...

  5. 【用pandas_alive几行代码绘制竞赛动图】10.新南威尔士州 COVID 可视化(测试代码+数据集+绘图参数解析)

    目录 10.新南威尔士州 COVID 可视化 新南威尔士州 COVID 可视化API说明: 新南威尔士州 COVID 可视化数据集 新南威尔士州 COVID 可视化例程 总结 欢迎关注 『pandas ...

  6. Python实战:200行代码绘制个人足迹地图!

    前两年,足迹地图小程序风靡朋友圈,一时间大家都流行晒自己的旅行地图.但是,笔者最近体验了好几款足迹地图的小程序,发现这些小程序虽然号称是足迹地图,但最多只是展示到省级别,无法精确到市级别,因此,笔者周 ...

  7. 【Python黑科技】几行代码绘制gif动图(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实际效果不美观--因为我找的图片不太行··· ...

  8. 用C语言50行代码绘制一朵玫瑰花

    先看看效果图 代码在这里奥 #include <stdio.h> #include <math.h>const int max_iterations = 128; const ...

  9. 【用pandas_alive几行代码绘制竞赛动图】全网首发pandas_alive数据可视化中文学习笔记合集,学不会来打我(配置好的venv虚拟环境+拿来即用测试代码+测试数据集+参数api解析)

    目录 专栏说明 一.效果图展示 1.1 水平条形图 1.2 竖直条形图 2. 折线图 3. 散点图 4.饼状图 5. 气泡图 6.1 地理空间点图 6.2 多边形地理空间图 7.多个图表 8.城市人口 ...

最新文章

  1. linux的mount(挂载)命令详解
  2. windows server 查看 删除事件_蓝队护网 之Windows服务器加固
  3. python编程题-100道Python编程题及答案(一)
  4. Module 'matplotlib' has no 'contourf' member 使用Python导入matplotlib模块报错
  5. Mac~git学习和应用需要注意的几个点
  6. g30u盘启动 中科曙光1620_I620-G30
  7. linux下log日志乱码_如何用 Linux 技巧大大提高工作效率?
  8. php页面设置密码,PHP页面输入密码才能访问加密代码
  9. 数学表达式3+(a+b)2对应的python表达式是_与数学表达式cd/2ab对应的Python表达式中,不正确的是:...
  10. 物流配送软件测试,物流配送最优路径规划
  11. 【T3】将“恢复记账前状态”按钮放置到工作台,一直显示。
  12. rxbus 源码_Rxbus事件交互
  13. vue中eslint报Disallow self-closing on HTML void elements格式错误时的解决方案
  14. 微信小程序自定义导航栏(带汉堡包菜单)
  15. Android开源经典项目
  16. QPS达到30万的elasticsearch架设之道
  17. 华硕电脑无线网卡代码10
  18. python怎么运行代码-python如何运行代码
  19. linux 音频文件格式,Linux音频驱动-WAV文件格式分析
  20. 误删文件夹但是回收站没有找到怎么恢复?

热门文章

  1. 0033__PDM,全称为 Persepolis Download Manager
  2. [React 基础系列] 受控表单 vs 不受控表单
  3. 华为平板计算机的隐藏功能,华为平板MatePad的3种隐藏玩法,你都不知道呢
  4. ESP32片外PSRAM
  5. 计算机行知行业英语教材,“三教”改革的先声——《行知行业英语》
  6. 计算机专业英语口语app,强烈推荐4款学英语必备的英语口语APP
  7. elasticsearch-7.17.4 基础班升级到白金版本
  8. 关于不同体系结构风格的简单认识
  9. bcdedit用法详解
  10. Shiro的在Springboot中的使用