创意 Python 爱心代码分享:从基础绘制到艺术创作

发布于:2025-08-15 ⋅ 阅读:(81) ⋅ 点赞:(0)

一、基础爱心:用最简单的方式入门

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做图像处理,或用递归实现分形效果。

尝试修改参数(如大小、颜色、角度),还能衍生出更多个性化的爱心作品!


网站公告


今日签到

点亮在社区的每一天
去签到