python畫愛心
- 背景
- 效果圖
- 思路及設計
- 完整代碼
- 代碼解讀
背景
鵲橋仙·七夕 ——(宋/秦觀) 纖雲弄巧,飛星傳恨,銀漢迢迢暗渡。 金風玉露一相逢,便勝卻人間無數。 柔情似水,佳期如夢,忍顧鵲橋歸路。 兩情若是長久時,又豈在朝朝暮暮。
又是牛郎織女相會的日子,佳人何期,舉首望,便信得了愛情。今天教大家用python畫一顆熱情似火的愛心,總有一天,心上人會懂。
效果圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPRJjY2RWbixGZzIWak1mYsB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwUzM4MTM1AjM2ADOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
思路及設計
首先,我們要知道三維空間中愛心的方程是
( 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個散點,繪制出來的效果比較飽滿,愛心也完美。