一、基础爱心:用最简单的方式入门
1. ASCII 字符爱心(零依赖,纯字符)
无需任何库,用字符拼出爱心,适合理解 "形状由基础元素构成" 的逻辑。
python
# ASCII爱心
print(" ♥♥ ")
print("♥ ♥")
print("♥ ♥")
print(" ♥♥ ")
# 进阶版:带文字的字符爱心
print("\n".join([
" ♥♥♥♥ ",
"♥ ♥",
"♥ 爱 ♥",
"♥ ♥",
" ♥♥♥♥ "
]))
![]()
运行后会在控制台输出由♥和空格组成的爱心,核心是通过字符的 "位置排列" 模拟爱心的对称形状(上窄下宽,左右对称)。
2. turtle 库绘制基础爱心(几何构造法)
turtle是 Python 自带的绘图库,适合通过 "笔画" 直观理解爱心的几何结构:爱心可拆解为 "两个半圆 + 一个三角形底部"。
python
import turtle
# 初始化画笔
t = turtle.Turtle()
t.speed(2) # 绘图速度(1最慢,10最快)
t.color('red') # 颜色
# 绘制爱心(几何逻辑:左半圆→右半圆→底部三角形)
t.begin_fill() # 开始填充颜色
t.left(45) # 左转45度
t.forward(100) # 向前画100像素(右半部分斜边)
t.circle(50, 180) # 画半圆(半径50,角度180度)
t.right(90) # 右转90度
t.circle(50, 180) # 画另一个半圆
t.forward(100) # 向前画100像素(左半部分斜边)
t.end_fill() # 结束填充
turtle.done() # 保持窗口不关闭
原理:通过调整画笔角度和画圆 / 直线的组合,让左右两个半圆对称拼接,底部用直线闭合,形成爱心轮廓。
二、数学驱动的爱心:用方程画更精准的形状
爱心的本质是一种 "心形曲线",可以用数学方程描述。下面用matplotlib(绘图库)绘制基于方程的爱心,更具数学美感。
1. 极坐标心形线(最经典的爱心方程)
极坐标下的爱心方程为:r = a(1 + sinθ)(a为缩放系数,θ为角度)。
python
import numpy as np
import matplotlib.pyplot as plt
# 生成角度(0到2π,共1000个点,确保曲线平滑)
theta = np.linspace(0, 2*np.pi, 1000)
a = 10 # 缩放系数(值越大爱心越大)
r = a * (1 + np.sin(theta)) # 极坐标方程
# 极坐标转笛卡尔坐标(x=rcosθ,y=rsinθ)
x = r * np.cos(theta)
y = r * np.sin(theta)
# 绘图
plt.figure(figsize=(6, 6))
plt.plot(x, y, color='red', linewidth=3)
plt.fill(x, y, color='pink', alpha=0.5) # 填充颜色(alpha控制透明度)
plt.axis('equal') # 等比例显示,避免爱心变形
plt.title('极坐标心形线')
plt.show()
特点:形状圆润,左右对称,是数学中最经典的爱心表达。
2. 笛卡尔坐标系爱心(更 "尖锐" 的爱心)
方程:(x² + y² - 1)³ - x²y³ = 0,形状比极坐标心形线更尖锐。
python
import numpy as np
import matplotlib.pyplot as plt
# 生成网格点(x和y的范围)
x = np.linspace(-2, 2, 1000)
y = np.linspace(-2, 2, 1000)
X, Y = np.meshgrid(x, y) # 生成网格
# 笛卡尔爱心方程
equation = (X**2 + Y**2 - 1)** 3 - X**2 * Y**3
# 绘图(用等高线取方程=0的曲线)
plt.figure(figsize=(6, 6))
plt.contour(X, Y, equation, levels=[0], colors='red', linewidths=3)
plt.fill_contour(X, Y, equation <= 0, colors='pink', alpha=0.5) # 填充内部
plt.axis('equal')
plt.title('笛卡尔坐标系爱心')
plt.show()
原理:通过网格点计算方程值,取=0的曲线即为爱心轮廓,适合理解 "方程与图形的对应关系"。
三、进阶创意:让爱心动起来、变起来
在基础形状上添加动态效果、颜色变化或交互,让爱心更有生命力。
1. 动态生长的爱心(turtle 库动画)
让爱心从一个点逐渐 "生长" 出来,配合颜色渐变。
python
import turtle
import time
t = turtle.Turtle()
t.hideturtle() # 隐藏画笔
turtle.bgcolor('black') # 背景色黑色
# 动态绘制函数(size控制爱心大小,color控制颜色)
def draw_growing_heart(size, color):
t.color(color)
t.begin_fill()
t.left(45)
t.forward(size)
t.circle(size/2, 180)
t.right(90)
t.circle(size/2, 180)
t.forward(size)
t.end_fill()
# 让爱心从10像素生长到100像素(每次清除重画)
for s in range(10, 101, 5):
t.clear() # 清除上一次的画
# 颜色随大小变化(从粉色到红色,用RGB值控制)
r = min(1.0, s/100) # 红色分量随size增大
g = 0.5 - s/200 # 绿色分量随size减小
b = 0.8 - s/150 # 蓝色分量随size减小
draw_growing_heart(s, (r, g, b))
time.sleep(0.1) # 暂停0.1秒
turtle.done()
亮点:通过循环改变爱心大小,并用 RGB 颜色分量随大小动态调整,实现 "生长 + 变色" 的动画效果。
2. 随机爱心云(多个爱心组合艺术)
用matplotlib生成大量随机大小、颜色的爱心,组成 "爱心云",适合艺术化创作。
python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import hsv_to_rgb
plt.figure(figsize=(10, 10))
plt.axis('off') # 隐藏坐标轴
# 生成50个随机爱心
for _ in range(50):
# 随机参数:位置、大小、旋转角度、颜色
x0 = np.random.uniform(-5, 5) # 中心x坐标
y0 = np.random.uniform(-5, 5) # 中心y坐标
size = np.random.uniform(0.5, 2) # 大小
angle = np.random.uniform(0, 2*np.pi) # 旋转角度
hue = np.random.uniform(0, 0.2) # 色调(0-0.2为红色系)
# 极坐标心形线方程
theta = np.linspace(0, 2*np.pi, 200)
r = size * (1 + np.sin(theta + angle)) # 加入旋转角度
x = x0 + r * np.cos(theta)
y = y0 + r * np.sin(theta)
# 随机颜色(HSV转RGB,保证红色系)
color = hsv_to_rgb((hue, 0.7, 0.9))
plt.fill(x, y, color=color, alpha=np.random.uniform(0.3, 0.8)) # 随机透明度
plt.show()
创意点:通过随机化位置、大小、角度和颜色,让多个爱心无序组合,形成富有层次感的 "爱心云",适合用作壁纸或装饰图。
四、艺术级创作:像素画与分形爱心
1. 像素风格爱心(PIL 库图像处理)
用Pillow库(PIL)生成像素风爱心,模拟复古游戏画面的质感。
python
from PIL import Image, ImageDraw
# 创建50x50像素的图片(黑色背景)
img = Image.new('RGB', (50, 50), color='black')
draw = ImageDraw.Draw(img)
# 定义像素爱心的"掩码"(1表示填充,0表示不填充)
# 手动设计50x50的像素分布(对称结构)
heart_mask = []
for y in range(50):
row = []
for x in range(50):
# 简化逻辑:基于距离中心的位置判断是否填充
cx, cy = 25, 30 # 爱心中心(稍微偏下更自然)
dx = x - cx
dy = y - cy
# 用简单方程模拟像素范围
if (dx**2 + dy**2)**0.5 < 20 - y/5 and y > 10:
row.append(1)
else:
row.append(0)
heart_mask.append(row)
# 填充像素(用红白相间的像素模拟复古风)
for y in range(50):
for x in range(50):
if heart_mask[y][x] == 1:
# 隔行变色(红白交替)
color = (255, 0, 0) if y % 2 == 0 else (255, 100, 100)
draw.point((x, y), fill=color)
img.save('pixel_heart.png') # 保存图片
img.show()
效果:生成由红白像素块组成的爱心,边缘有明显的 "像素感",适合复古风格设计。
2. 分形爱心(自相似结构)
分形的核心是 "局部与整体相似",用递归方法绘制分形爱心(每个爱心的角落再生成小爱心)。
python
import turtle
def draw_fractal_heart(t, size, depth):
if depth == 0: # 递归终止条件:深度为0时画基础爱心
t.begin_fill()
t.left(45)
t.forward(size)
t.circle(size/2, 180)
t.right(90)
t.circle(size/2, 180)
t.forward(size)
t.end_fill()
return
# 画当前爱心
t.begin_fill()
t.left(45)
t.forward(size)
t.circle(size/2, 180)
t.right(90)
t.circle(size/2, 180)
t.forward(size)
t.end_fill()
t.right(45) # 恢复角度
# 在三个"角落"递归画小爱心(缩小0.4倍,深度-1)
small_size = size * 0.4
# 左上角小爱心
t.penup()
t.left(135)
t.forward(size * 0.6)
t.pendown()
draw_fractal_heart(t, small_size, depth-1)
# 右上角小爱心(回到原点后移动)
t.penup()
t.backward(size * 0.6)
t.right(90)
t.forward(size * 0.6)
t.pendown()
draw_fractal_heart(t, small_size, depth-1)
# 底部小爱心(回到原点后移动)
t.penup()
t.backward(size * 0.6)
t.left(45)
t.backward(size * 0.8)
t.pendown()
draw_fractal_heart(t, small_size, depth-1)
# 回到初始位置和角度
t.penup()
t.forward(size * 0.8)
t.right(45)
t.pendown()
# 初始化
t = turtle.Turtle()
t.speed(0) # 最快速度
t.color('red', 'pink') # 线条红,填充粉
t.penup()
t.goto(0, -100) # 下移一点,避免超出窗口
t.pendown()
# 绘制深度为2的分形爱心(深度越大越复杂)
draw_fractal_heart(t, 100, 2)
turtle.done()
特点:整体是一个大爱心,在它的左上角、右上角和底部各有一个小爱心,小爱心的角落还有更小的爱心,形成 "自相似" 的艺术效果,极具视觉冲击力。
总结
从基础的字符拼接到数学方程,再到动态动画和分形艺术,Python 绘制爱心的核心是 "用代码描述形状逻辑"。你可以根据需求选择工具:
- 入门:用
turtle或 ASCII 理解形状构造; - 进阶:用
matplotlib结合数学方程画精准爱心; - 创作:用
PIL做图像处理,或用递归实现分形效果。
尝试修改参数(如大小、颜色、角度),还能衍生出更多个性化的爱心作品!