Python Turtle绘制ikun形象
用Python Turtle绘制ikun形象
在Python的图形绘制库中,turtle库以其简单直观的特点成为入门者的首选工具。本文将解析一段使用turtle库绘制ikun形象的代码,探讨其实现思路、技术细节和创作特点,展示如何通过代码将抽象形象转化为可视化作品。
项目基础设置与坐标系统
代码首先进行了基础环境配置,为后续绘制工作奠定基础:
import turtle as t
import math
t.setup(1000, 750) # 设置窗口大小
t.setworldcoordinates(-800,-600,800,600) # 设置坐标系
t.title('I am ikun!!')
t.width(8)
t.speed(0)
t.pencolor('black')
这段代码完成了三项关键工作:导入必要的库(turtle用于绘图,math用于数学计算);设置绘图窗口的物理尺寸和逻辑坐标系统,将坐标范围设定为(-800,-600)到(800,600),为精准绘图提供了便利;配置画笔基本属性,包括线宽、速度和颜色,其中speed(0)表示最快绘制速度。
核心绘图函数设计
为实现复杂图形的绘制,代码封装了三个核心函数,体现了模块化编程的思想:
1. 圆形绘制函数
def my_circle(rad,c_x,c_y,color=None):
if color is not None:
t.fillcolor(color)
t.begin_fill()
t.penup()
t.setheading(0)
t.goto(c_x,c_y-rad)
t.pendown()
t.circle(rad)
if color is not None:
t.end_fill()
该函数扩展了turtle库的circle方法,允许直接指定圆心坐标(c_x,c_y)和半径rad,并支持可选的填充颜色。通过penup()和pendown()方法控制画笔抬起和落下,实现了无痕迹移动到绘图起点。
2. 椭圆绘制函数
椭圆绘制是本项目的技术亮点,代码通过数学计算实现了任意角度椭圆的绘制:
def get_ellipse_xy(a,b,theta):
# 计算椭圆上指定角度的点坐标
if theta < 0:theta=theta+math.pi*2
x = a * b / math.sqrt(b * b + a * a * math.tan(theta) * math.tan(theta))
# 根据角度所在象限调整坐标符号
if theta < math.pi/2:
return {'x':x,'y':x*math.tan(theta)}
elif theta < math.pi:
return {'x':x*(-1),'y':x*(-1)*math.tan(theta)}
elif theta < math.pi*3/2:
return {'x':x*(-1),'y':x*(-1)*math.tan(theta)}
else:
return {'x': x, 'y': x*math.tan(theta)}
def draw_ellipse(shape, start_ang, end_ang, color=None):
if color is not None:
t.fillcolor(color)
t.begin_fill()
a = shape['a'] # 长半轴
b = shape['b'] # 短半轴
shape_ang = shape['angle'] # 椭圆旋转角度
theta = start_ang - shape_ang
# 计算起始点坐标
x1, y1 = get_ellipse_xy(a, b, theta).values()
x = shape['X0'] + x1 * math.cos(shape_ang) - y1 * math.sin(shape_ang)
y = shape['Y0'] + x1 * math.sin(shape_ang) + y1 * math.cos(shape_ang)
t.penup()
t.goto(x,y)
t.pendown()
step = math.pi/180*2 # 以2°为步长
num_steps = math.ceil((end_ang-start_ang)/step)
# 逐点绘制椭圆弧线
for i in range(num_steps):
theta = theta + step
x1, y1 = get_ellipse_xy(a, b, theta).values()
t.goto(shape['X0'] + x1 * math.cos(shape_ang) - y1 * math.sin(shape_ang),
shape['Y0'] + x1 * math.sin(shape_ang) + y1 * math.cos(shape_ang))
if color is not None:
t.end_fill()
这段代码通过解析椭圆的数学方程,实现了高度自定义的椭圆绘制。函数接受包含中心坐标(X0,Y0)、半轴长度(a,b)和旋转角度(angle)的参数集,能够绘制任意角度、任意范围的椭圆弧线,并支持填充颜色。
3. 多边形绘制函数
def draw_poly(poly_data,color=None):
x=poly_data['x']
y=poly_data['y']
t.penup()
t.goto(x[0], y[0])
t.pendown()
if color is not None:
t.fillcolor(color)
t.begin_fill()
for i in range(len(x)):
t.goto(x[i], y[i])
if color is not None:
t.end_fill()
该函数通过接收包含x坐标数组和y坐标数组的字典参数,绘制任意多边形。这种设计特别适合绘制头发、衣服等不规则形状,只需提供顶点坐标即可。
形象绘制实现过程
代码采用分层绘制的方式,从背景元素到主体形象,逐步构建完整画面:
1. 篮球元素绘制
# 画篮球
my_circle(150, -206, -212, '#BA7148')
baskt_line1 = {"X0": -120,"Y0": -34,"a": 186,"b": 162,"angle": 0}
draw_ellipse(baskt_line1, math.pi / 180 * 198, math.pi / 180 * 290)
baskt_line2 = {"X0": -294,"Y0": -402,"a": 186,"b": 162,"angle": 0}
draw_ellipse(baskt_line2, math.pi / 180 * 21, math.pi / 180 * 110)
t.penup()
t.goto(-346,-160)
t.pendown()
t.goto(-66,-274)
篮球作为标志性元素,通过一个填充棕色的圆形和几条椭圆弧线构成,弧线角度经过精心计算,以呈现篮球表面的经典纹路。
2. 面部特征绘制
面部绘制采用从整体到局部的顺序:
# 画脸蛋
face = {"X0": 80,"Y0": -22,"a": 256,"b": 198,"angle": 0}
draw_ellipse(face, 0, math.pi * 2, '#F5D477')
# 眼睛
my_circle(77, 63, 41, 'white')
my_circle(68, 217, 41, 'white')
my_circle(24, 100, 34, 'black')
my_circle(24, 244, 34, 'black')
# 嘴巴
t.width(5)
mouth = {"X0": 145, "Y0": -73, "a": 75, "b": 53, "angle": 0}
draw_ellipse(mouth, 0, math.pi * 2, '#F4A644')
mouse_line = {"X0": 138,"Y0": -40,"a": 92,"b": 53,"angle": 0}
draw_ellipse(mouse_line, math.pi / 180 * 208, math.pi / 180 * 342, '#F4A644')
# 腮红
t.width(1)
t.pencolor('#F5D477')
my_circle(62, -82, -62, 'red') # 左边
face_cheek = {"X0": 294,"Y0": -66,"a": 37,"b": 60,"angle": -math.pi/180*12}
draw_ellipse(face_cheek, 0, math.pi * 2, 'red') # 右边
首先绘制椭圆形的脸部轮廓,然后依次添加眼睛、嘴巴和腮红。值得注意的是,在绘制腮红后,代码重新绘制了部分脸部轮廓,以解决腮红遮挡轮廓线的问题,体现了细节处理的用心。
3. 头发与服饰绘制
头发和服饰采用多边形函数绘制,通过大量顶点坐标定义复杂形状:
# 画头发
poly_hair = {'x': [-258, -161, -74, 0, 55, 111, 211, 315, 362,
329, 293, 283, 269, 227, 269, 283, 208, 194,
160, 160, 85, 44, 61, 44, 31, 1, -33,
1, -60, -51, -60, -62, -129, -142, -144, -108,
-144, -142, -209, -216, -200, -216, -258],
'y': [57, 187, 238, 267, 251, 296, 260, 171, 47, -9, 29, 61, 110, 166, 110, 61, 72, 132,
178, 178, 174, 162, 206, 162, 29, 35, 54, 35, 4, 40, 4, -37, -45, -8, 71, 152, 71, -8, -31, 31, 90, 31, 57]
}
draw_poly(poly_hair, '#D0CED1')
# 衣服
poly_cloth = {'x': [-142, -112, -22, 50, 132, 218, 249, 247,
295, 328, 318, 321, 309, 338, 353, -167,
-150, -165, -166, -150, -162, -157, -142],
'y': [-135, -155, -144, -140, -150, -166, -163, -150,
-145, -165, -194, -233, -244, -290, -326, -328,
-248, -233, -209, -195, -167, -146, -135]
}
draw_poly(poly_cloth, '#222222')
这些顶点坐标经过精心调整,以呈现出符合特征的发型和服装样式。代码还通过绘制背带、装饰等细节,增强了整体形象的层次感。
4. 运行结果
最后,运行我们的代码:

技术特点与创作亮点
这段代码体现了多项编程与设计技巧:
-
数学与艺术的结合:通过椭圆方程实现复杂曲线绘制,将数学计算转化为视觉元素。
-
分层绘制思想:从底层元素到上层细节,逐步构建画面,确保元素叠加关系正确。
-
模块化设计:将重复操作封装为函数,提高代码复用性和可维护性。
-
细节处理:如重新绘制被遮挡的轮廓线,体现了对视觉效果的细致追求。
-
参数化设计:通过调整坐标、角度等参数,可以方便地修改形象特征。
结语
通过解析这段代码,我们不仅看到了用Python绘制复杂形象的实现方法,更感受到了编程与艺术结合的魅力。turtle库虽然简单,但通过精心的设计和数学计算,同样可以创作出富有表现力的作品。这种将抽象概念转化为具体代码,再将代码转化为视觉形象的过程,正是编程创意的有趣之处。对于初学者来说,这类项目不仅能提高编程技能,还能培养空间思维和审美能力,是值得尝试的实践练习。
更多推荐
所有评论(0)