Python turtle绘制——癸卯(兔)年卯兔图

 2023年春节一到为“癸卯(兔)年”,期间绘制了一幅去年底发行的纪念币上的卯兔图,因琐事耽搁,今天与大家分享给大家。

图1 15克圆形银质癸卯兔年纪念币照片

海龟绘图(Turtle Graphics)是Python内置模块,是非常简单好玩的一个库。其动作主要有:抬笔,此后的动作只是移动画笔,画布上不会留下痕迹;落笔,只要移动画笔,画布上就会留下痕迹。画笔动作只绝对移动、相对移动、向前(后)移动、转向(绝对角度、相对角度)、圆或圆弧、点(实心圆),故画不了椭圆,绘制函数曲线困难。

一、导入库

import turtle

from turtle import *

二、turtle绘图

1. 设置画布大小

turtle.screensize()       # 返回默认大小(400, 300)

以默认绘图窗口大小显示窗口,窗口居屏幕中心。

turtle.screensize(width, hight[, bg])

其中:width——表示画布宽度(单位像素)

hight——表示画布高度(单位像素)

bg——画布背景颜色,该参数可缺省,缺省时为白色背景

如:turtle.screensize(800, 600, "green"),表示画布大小为800×600,绿色画布。

turtle.setup(width, hight[, x, y])

其中:width, height——表示画布宽和高。当为整数时表示像素;为小数时则表示占据计算机屏幕的比例

(x, y)——这一坐标表示矩形窗口左上角顶点在屏幕的位置(像素),如果缺省则窗口位于屏幕中心

画布上默认有一个坐标原点为画布中心的坐标轴,水平x轴向右为正方向,垂直y轴向上为正方向,初始坐标原点上有一只面朝x轴正方向。

2. turtle绘图的基本方法

(1) 画笔运动命令

画笔运动命令指用于绘制图像动作的指令。

画笔运动命令

(2) 画笔控制命令

画笔控制命令指用于设置画笔状态、颜色、填色等指令。

画笔控制命令

 (3) 全局控制命令

全局控制命令指用于设置画布、书写文字等指令。

全局控制命令

本例未用到用“全局控制命令”。Turtle绘图主要用直线、转角、圆(圆弧)、点绘制。所以绘图时要将图像转换为直线、圆弧去逼近图像轮廓。

注意:(1)抬笔时仍可以填色,但不绘制轮廓;(2)填色区域不封闭也可以填色,填色时起点与终点用直线自动封闭,但不绘制此直线;(3)用dot()画点时,抬笔、落笔都能画点;(4)画圆用半径、画点用直径。

三、制作作品

需绘制“癸卯兔”的兔头、兔手、兔腹、兔脚、兔背、兔尾、兔耳、兔嘴鼻和兔眼等,参照图1按顺序绘制。

完整的绘制程序如下:

############################################
# 设计 Zhang Ruilin  创建 2023-01-31 08:54 #
# 用 turtle 绘制卯兔年兔子,圆弧、圆、直线 #
############################################
import turtle as tl

tl.setup(430, 550)			# 设置画面尺寸
tl.title('海龟绘图——年画卯兔图')
tl.speed(0)				# 最快绘图速度
tl.pu()
R = 0.25					# 设置比例因子, 用数据的1/3大小绘制
tl.goto(R*300,R*475)
tl.width(2)
tl.pd()
tl.seth(110)
tl.circle(R*364,165)		# 画头部
tl.rt(60)
tl.circle(R*233,90)
tl.circle(R*438,65)
tl.lt(2)
tl.pu()
tl.fd(R*200)
tl.lt(3)
tl.circle(R*438,10)
tl.pd()
tl.circle(R*438,55)
tl.circle(R*233,90)
tl.pu()
tl.goto(-R*100,-R*280)	# 画前手(左前腿)
tl.seth(60)
tl.pd()
tl.circle(-R*340,90)
tl.circle(-R*212,15)
tl.circle(-R*77,135)
tl.circle(-R*176,65)
tl.rt(180)
tl.circle(R*176,30)
tl.rt(70)
tl.circle(-R*196,90)
tl.rt(168)
tl.pu()
tl.fd(R*400)
tl.rt(142)
tl.pd()
tl.circle(R*105,100)		# 画后手(左前腿)
tl.circle(R*65,85)
tl.circle(R*125,45)
tl.circle(R*196,90)
tl.lt(115)
tl.circle(-R*400,60)		# 画腹部
tl.circle(-R*280,50)		# 画前腿(左后腿)
tl.rt(120)
tl.circle(R*190,100)
tl.rt(180)
tl.circle(-R*190,130)
tl.circle(-R*320,80)
tl.rt(180)
tl.circle(R*320,80)
tl.circle(-R*190,65)
tl.rt(95)
tl.circle(-R*465,45)
tl.circle(-R*520,40)
tl.circle(-R*320,110)		# 画屁股
tl.circle(R*400,50)		# 画后背
tl.rt(180)
tl.circle(-R*400,50)
tl.circle(R*320,20)
tl.rt(110)
tl.fillcolor('#ed9e4c')	# 画尾巴
tl.begin_fill()
tl.circle(R*140,65)
tl.lt(150)
tl.circle(-R*60,120)
tl.end_fill()
tl.circle(R*140,135)
tl.rt(8)
tl.pu()
tl.fd(R*710)				# 画后腿(右后腿)
tl.pd()
tl.lt(10)
tl.circle(R*380,50)
tl.lt(95)
tl.circle(R*190,65)
tl.lt(167)
tl.circle(R*190,90)
tl.pu()
tl.goto(-R*410,R*400)		# 画耳朵
tl.lt(80)
tl.pd()
tl.fillcolor('#ffd7d7')	# 画右耳(左侧)
tl.begin_fill()
tl.circle(-R*270,45)
tl.circle(-R*320,45)
tl.circle(R*50,45)
tl.circle(-R*150,120)
tl.rt(180)
tl.circle(R*120,145)
tl.fd(R*150)
tl.circle(-R*235,66)
tl.end_fill()
tl.lt(146)
tl.circle(-R*360,15)
tl.lt(58)
tl.circle(R*235,37)		# 画左耳(右侧)
tl.circle(R*540,28)
tl.circle(-R*150,14)
tl.circle(-R*90,135)
tl.pu()
tl.fd(R*250)
tl.rt(50)
tl.pd()
tl.circle(-R*200,65)
tl.circle(R*340,46)
tl.lt(85)
tl.circle(-R*360,15)
tl.lt(130)
tl.begin_fill()
tl.circle(-R*180,40)
tl.circle(-R*280,30)
tl.circle(R*140,110)
tl.rt(180)
tl.circle(-R*140,67)
tl.circle(R*180,45)
tl.circle(-R*235,72)
tl.circle(-R*140,21)
tl.end_fill()
tl.pu()
tl.goto(-R*40,R*200)		#画鼻嘴
tl.seth(-20)
tl.pd()
tl.circle(R*230,30)
tl.rt(60)
tl.fd(R*30)
tl.fillcolor('red')
tl.begin_fill()
tl.circle(-R*40,170)
tl.rt(180)
tl.circle(R*40,80)
tl.rt(105)
tl.circle(R*230,15)
tl.circle(R*10,140)
tl.circle(R*230,15)
tl.rt(105)
tl.circle(R*40,80)
tl.rt(180)
tl.circle(-R*40,170)
tl.end_fill()
tl.fd(R*30)
tl.rt(50)
tl.circle(R*230,30)
tl.pu()
tl.goto(-R*140,R*120)		# 绘右须(左侧)
tl.seth(-175)
tl.pd()
tl.circle(R*1400,18)
tl.pu()
tl.goto(-R*150,R*95)
tl.seth(-165)
tl.pd()
tl.circle(R*1400,15)
tl.pu()
tl.goto(-R*135,R*82)
tl.seth(-155)
tl.pd()
tl.circle(R*1400,16)
tl.pu()
tl.goto(R*300,R*270)		# 绘左须(右侧)
tl.seth(30)
tl.pd()
tl.circle(-R*1400,13)
tl.pu()
tl.goto(R*310,R*250)
tl.seth(20)
tl.pd()
tl.circle(-R*1400,10)
tl.pu()
tl.goto(R*310,R*230)
tl.seth(10)
tl.pd()
tl.circle(-R*1400,11)
tl.pu()						# 画右眼(左侧)
tl.goto(-R*380,R*400)
tl.seth(15)
tl.pd()
#tl.color('black','red')
tl.begin_fill()
tl.circle(-R*150,100)
tl.circle(-R*55,60)
tl.circle(-R*35,90)
tl.lt(60)
tl.circle(-R*90,135)
tl.end_fill()
tl.lt(180)
tl.circle(R*110,130)
tl.circle(R*50,70)
tl.pu()
tl.goto(-R*340,R*340)
tl.dot(R*20,'white')
tl.goto(-R*320,R*300)
tl.dot(R*40,'white')
tl.goto(R*150,R*580)		# 画左眼(右侧)
tl.seth(-135)
tl.color('black','red')
tl.pd()
tl.begin_fill()
tl.circle(R*150,100)
tl.circle(R*55,60)
tl.circle(R*35,90)
tl.rt(60)
tl.circle(R*90,135)
tl.end_fill()
tl.lt(180)
tl.circle(-R*110,130)
tl.circle(-R*50,70)
tl.pu()
tl.goto(R*200,R*500)
tl.dot(R*20,'white')
tl.goto(R*220,R*460)
tl.dot(R*40,'white')
tl.goto(-R*100,R*550)
tl.pd()
tl.color('silver','#ed9e4c')	# 画小花
tl.rt(20)
tl.begin_fill()
for i in range(6):
   tl.lt(180)
   tl.circle(R*30)
   tl.lt(180)
   tl.circle(R*30,60)
tl.end_fill()
tl.begin_fill()
tl.color('white','#fb66a4')
tl.begin_fill()
tl.circle(R*30)
tl.end_fill()
tl.ht()

执行结果如图2所示。

图2 癸卯兔图

猜你喜欢

转载自blog.csdn.net/hz_zhangrl/article/details/129402272