python画爱心
- 背景
- 效果图
- 思路及设计
- 完整代码
- 代码解读
背景
鹊桥仙·七夕 ——(宋/秦观) 纤云弄巧,飞星传恨,银汉迢迢暗渡。 金风玉露一相逢,便胜却人间无数。 柔情似水,佳期如梦,忍顾鹊桥归路。 两情若是长久时,又岂在朝朝暮暮。
又是牛郎织女相会的日子,佳人何期,举首望,便信得了爱情。今天教大家用python画一颗热情似火的爱心,总有一天,心上人会懂。
效果图
思路及设计
首先,我们要知道三维空间中爱心的方程是
( x 2 + 9 4 y 2 + z 2 − 1 ) 3 − 9 80 y 2 z 3 − x 2 z 3 = 0 (x^2+\frac{9}{4}y^2+z^2-1)^3-\frac{9}{80}y^2z^3-x^2z^3=0 (x2+49y2+z2−1)3−809y2z3−x2z3=0
然后用这个方程构造一个封闭超平面,将三维空间所有点都分成两类,一个是超平面里面的点,一类是超平面外面的点,然后用里面的点填充成一颗爱心。
完整代码
# -*- coding: utf-8 -*-"""
Created on Sat Aug 3 20:14:30 2019
project name:love
@author: 帅帅de三叔
"""
import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块
#start generating points
x_lim=np.linspace(-10,10,520)
y_lim=np.linspace(-10,10,520)
z_lim=np.linspace(-10,10,520)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_points=[] #用来存放绘图点Z坐标
for x in x_lim:
for y in y_lim:
for z in z_lim:
if (x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3<=0:
X_points.append(x)
Y_points.append(y)
Z_points.append(z)
###start plot love
fig=plt.figure() #画布初始化
ax=fig.add_subplot(111,projection='3d') #采用3d绘图
ax.scatter(X_points,Y_points,Z_points,s=20,alpha=0.5,color="red") #3d散点图填充
plt.show()
代码解读
实现过程可以分成两步,第一步利用3个循环语句加一个判断语句把爱心里面的点给生成出来组成3个数组分别作为三维空间中填充点的坐标数据,第二步是利用第一步生成的坐标数据绘图,这里采用的是绘制散点图的scatter()函数,就是尽可能让这些散点把爱心填充满,散点的个数可以通过前面的np.linspace()函数的第三个参数控制,这里取520,一共生成58444个散点,绘制出来的效果比较饱满,爱心也完美。