Python中如何用代码画一朵玫瑰
听说 python 还能画画?是的,今天亲手画一朵玫瑰给你。
turtle 是 python 中一个强大的绘制图像的库,可以用来绘制各种图像,使用起来很方便。
但是需要计算各种角度、距离等,所以要想完成一幅复杂的图像还是有一定的难度的。
今天我们来画一朵玫瑰试试,有兴趣的可以自己去调整下源码的参数,或者可以尝试画出你心中不一样的玫瑰花。
由于代码量比较多,而且大多数都是类似的功能,所以这里就不贴完整的源码了,挑一些主要的函数说明一下即可。
写这些文章主要目的还是为了说明 python 还是挺好玩的,希望能激发大家学习 python 的兴趣。
对了,想要完整源码的同学可以在公众号 [谭某人] 后台回复关键字 [玫瑰花] 即可。
turtle.speed(5) #画笔移动的速度
turtle.penup() #提起画笔,移动画笔但并不会绘制图形
turtle.pendown() #放下画笔,移动画笔即开始绘制
turtle.left(90) #逆时针转动画笔 90 度
turtle.right(90) #顺时针时针转动画笔 90 度
turtle.fd(25) #向前移动指定距离 fd=forward
turtle.bd(30) #向后移动指定距离 bd=backward
turtle.fillcolor(“red”) #填充颜色
turtle.begin_fill() #开始填充
turtle.end_fill() #结束填充
turtle.circle(200,50) #画一个圆 200 是半径,50 是弧度
#在程序的最后一行加一行
#不然画画结束后会自动退出
turtle.done()
一朵玫瑰花其实主要就是上面这几个函数来实现的,不过是参数不同罢了,在实现的过程中也可以调整参数然后看下具体的效果。
再提醒一个小问题,也是我自己在写这篇文章时遇到的问题,由于我把这个 python 脚本也命名为 turtle.py ,结果在运行程序的时候就报错找不到 turtle 对应模块之类的。
后来才发现这样写的话,import turtle 这个语句其实是会导入脚本自身的,并没有导入 turtle 这个库,所以把脚本重命名一下就好了。
Python中如何用代码画一朵玫瑰
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import PathPatch
from matplotlib.path import Path
def draw_rose():
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_aspect('equal')
ax.axis('off')
# 绘制花瓣
theta = np.linspace(0, 2*np.pi, 1000)
k = 5 # 花瓣数量参数
r = np.sin(k * theta) # 玫瑰线极坐标方程
# 转换为笛卡尔坐标
x = r * np.cos(theta)
y = r * np.sin(theta)
# 调整大小和位置
scale = 3
x = x * scale
y = y * scale
# 绘制玫瑰线
ax.fill(x, y, color='#FF69B4', alpha=0.8, linewidth=2)
# 添加花蕊
circle = plt.Circle((0, 0), 0.5, color='#FFD700', zorder=2)
ax.add_patch(circle)
# 添加花茎
stem_y = np.linspace(-8, -3, 100)
stem_x = 0.2 * np.sin(10 * stem_y)
ax.plot(stem_x, stem_y, color='#228B22', linewidth=3)
# 添加叶子
leaf_theta = np.linspace(0, np.pi, 50)
leaf_r = 2 * np.sin(2 * leaf_theta)
leaf_x = leaf_r * np.cos(leaf_theta)
leaf_y = leaf_r * np.sin(leaf_theta) - 5
# 旋转叶子
from matplotlib.transforms import Affine2D
import matplotlib.transforms as transforms
# 左叶子
t = Affine2D().rotate_deg(30).translate(-1.5, -4.5)
left_leaf = PathPatch(Path(np.column_stack([leaf_x, leaf_y])),
facecolor='#32CD32',
transform=t + ax.transData)
ax.add_patch(left_leaf)
# 右叶子
t = Affine2D().rotate_deg(-30).translate(1.5, -4.5)
right_leaf = PathPatch(Path(np.column_stack([-leaf_x, leaf_y])),
facecolor='#32CD32',
transform=t + ax.transData)
ax.add_patch(right_leaf)
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.title('Python Rose', fontsize=16, color='#8B0000')
plt.show()
if __name__ == "__main__":
draw_rose()
这段代码用matplotlib画了一朵数学玫瑰。核心是玫瑰线极坐标方程 r = sin(kθ),这里k=5控制花瓣数量。花蕊用金色圆点,花茎用绿色曲线,叶子通过坐标变换实现旋转。
运行需要安装matplotlib和numpy:pip install matplotlib numpy
建议:调整k值可以改变花瓣数量。

