情人节,我表白了CSDN小姐姐后,竟然…竟然有人看了这篇文。 以下图片素材由一个还没写完的工具绘制,稍后会放在CSDN的代码仓库(现在能用了,还没时间改,颜色填充算法还没写,有能力的朋友可以修改一下):https://codechina.csdn.net/A757291228/draw_pixel/-/tree/master
无情!竟然告诉我有情人节活动
很快呀,啪的一下又一年情人节又来了,本来我压根记不住的,但是CSDN竟然告诉我有情人节活动。怎么办?这不能忍,那就只能表白CSDN的小姐姐了。你们要不要一起表白?评论区一起表白吧!
表白肯定要写写情书了。结果…一看征文字数要求,竟然600字!你是看不起我吗? 一封情书根本用不到600字,我200字就写完了。为什么才写200字?不要问,问就是是写不出来600字。
我们要表白哪个小姐姐?
这还要想?当然是全都要了!小孩子才做选择。 例如小婷婷、小慧慧,这可都是集美貌、才华于一身的女子。
沉鱼落雁 小婷婷 闭月羞花 小慧慧
小婷婷是谁?小婷婷就是前几天博客之星直播中的主持之一!还记得的弹幕中刷屏的“小婷露脸 流量百万”吗?在CSDN社群中有一个付费专栏群,小婷婷可是付费专栏群中的第一女神。只要小婷婷在线,群里必是最热闹的时候。
那小慧慧又是谁?在微信群中,有一个经常公布信息,到处活跃的运营还记得吗?名字叫做CSDN博客。她就是小慧慧。小慧慧时而性格温柔,时而高冷,就像一个冰雪女王!气质十足!
那怎么样表白这两个小姐姐呢?当然是…写!代!码!生为一个程序直男一定要把这优点发扬光大!
表白CSDN来一幅图~
颜色填充还没写完,不然肯定这图片是漂漂亮亮dev~
一、技术实现(这个工具我本人会不断的迭代更新,包括素材绘制逻辑,因为我要用来画自媒体素材)
毕竟是要画画,首选比较简单的那就是turtle了。但是turtle画东西好麻烦,本身自己就是个手残党,线条都不懂怎么弄。那怎么办?那我们就是用“俄罗斯方块”的画法吧,那就是叠积木~
我们以方块作为线条,进行堆叠就可以完成了。
1.1 完成点绘制
我们先引入turtle库,然后新建一个类,名为core:
代码语言:javascript复制from turtle import *
class Core:
随后新建一个core类的方法point,作为基本的方块点,作为一个线条的基本单位:
代码语言:javascript复制 '''
设置
'''
#填充颜色色值
#@fcolor=点填充颜色
def fillcolor_set(self,fcolor="black"):
fillcolor(fcolor)
#笔杆颜色设置
#@fcolor=点填充颜色
#@pcolor=线颜色
def pencolor_set(self,fcolor="black",pcolor="1"):
if pcolor=="1":
pcolor=fcolor
pencolor(pcolor)
else:
pencolor(pcolor)
#笔杆尺寸
#@psize=线尺寸
def pensize_set(self,psize=1):
pensize(psize)
#绘制点
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def point(self,plenght=10,fcolor="black",pcolor="1",psize=1):
poslist=[]
self.fillcolor_set(fcolor)
self.pencolor_set(fcolor,pcolor)
self.pensize_set(psize)
begin_fill()
for i in range(0,4):
poslist.append(pos())
fd(plenght)
right(90)
end_fill()
return poslist
point方法默认plenght为10。也就是说基本方块为一个正方形,长宽都为plenght;fcolor为填充的颜色,默认为黑色;pcolor为线条的颜色,其实也就是pen color;psize为相对应的笔的粗细。
在方法中,我们使用poslist记录我们点的每次绘制的位置,这样的话我们在某些时候就可以使用poslist来进行精确定位了。我们再通过fillcolor_set、pencolor_set、pensize_set方法来设置填充色、线条色、现调大小。
在正式绘制方块时开启填充使用begin_fill方法,随后开始绘制一个“点”。这个“点”的绘制也是非常简单,直接循环4次,画出一个矩形即可。并且使用pos方法获取当前的坐标,随后结束绘制“点”后使用end_fill方法进行颜色填充。
这样一个点绘制的方法就完成了。
1.2 完成线段的绘制
点绘制完了接下来我们就需要绘制线了。线从点的基础上进行堆叠,并排排列那就是线。线的方向可以是上下左右,我们可以通过参数传递从而控制线段绘制方向,并且还可以使用对称方法,让我们减少绘制难度。对于对称来说,也有上下左右基于某个中心点的进行的中心对称。 代码如下:
代码语言:javascript复制 #step方法的绘图跳转控制
#@lenght=总长
#@blenght=bit一个位长度
#@plenght=点长度
#@direction1=横线绘制方向
#@direction2=竖线绘制方向
#@fcolor=填充颜色
#@pcolor=笔颜色
#@psize=笔大小
#@gotopos=如何跳转pos位置
#@cout_i=循环控制变量i
def step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):
print('-----------',blenght)
posdict={}
posdict['line' str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.loc_goto(gotopos1)
posdict['vline' str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)
if cout_i!=(lenght-1):
self.loc_goto(gotopos2)
return posdict
#绘制线段
#@lenght=线长度
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def line(self,lenght=1,plenght=10,direction="right",fcolor="white",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):
posdict={}
symmetrical_point="f"
if symmetrical!="f":
if symmetrical_direction=="right":
symmetrical_point=pos() (int(symmetrical)*plenght,0)
elif symmetrical_direction=="left":
symmetrical_point=pos() (-int(symmetrical)*plenght,0)
elif symmetrical_direction=="up":
symmetrical_point=pos() (0,int(symmetrical)*plenght)
elif symmetrical_direction=="down":
symmetrical_point=pos() (0,-int(symmetrical)*plenght)
for i in range(0,lenght):
posdict['point' str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.line_control_func_draw_move(i,direction,lenght,plenght)
if symmetrical!="f":
self.goto_(symmetrical_point)
posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")
self.goto_(posdict['point' str(lenght-1)][3])
return posdict
以上代码我们主要看line方法。line方法参数plenght为需要传入的点的边长大小,lenght为这个线有多长;direction为需要从哪边开始绘制,从左到右绘制,还是从上到下绘制;symmetrical为对称的位置,symmetrical_direction表示是左右对称,还是右坐对称;symmetrical_direction默认为右,表示左边的绘制线段,将会镜像到左侧,若symmetrical为10,那么对称位置就是10*边长大小为对称位置。
我们接下来看line方法中的代码,其中symmetrical_point默认为f,若symmetrical传入参数则表示有对称需求,这时将会通过传入对称位置从而计算x与y的坐标:
代码语言:javascript复制symmetrical_point="f"
if symmetrical!="f":
if symmetrical_direction=="right":
symmetrical_point=pos() (int(symmetrical)*plenght,0)
elif symmetrical_direction=="left":
symmetrical_point=pos() (-int(symmetrical)*plenght,0)
elif symmetrical_direction=="up":
symmetrical_point=pos() (0,int(symmetrical)*plenght)
elif symmetrical_direction=="down":
symmetrical_point=pos() (0,-int(symmetrical)*plenght)
其中左右对称,那么就是左右两边x的正负,如果是上下对称则需要对y进行操作,上对称y则正,下对称则y负。随后我们开始进行循环点的个数,多长就循环多少次:
代码语言:javascript复制for i in range(0,lenght):
posdict['point' str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.line_control_func_draw_move(i,direction,lenght,plenght)
以上代码主要查看line_control_func_draw_move方法。line_control_func_draw_move作为控制线段绘制的方法,而point就直接绘制出一个点,如何使绘制开始位置进行控制,就需要查看line_control_func_draw_move:
代码语言:javascript复制def line_control_func_draw_move(self,cout_i,direction,lenght,plenght):
if cout_i!=(lenght-1):
if direction=="right":
self.loc_goto((plenght,0))
elif direction=="left":
self.loc_goto((-plenght,0))
elif direction=="up":
self.loc_goto((0,plenght))
elif direction=="down":
self.loc_goto((0,-plenght))
elif cout_i==(lenght-1):
if direction=="left":
self.loc_goto((plenght,0))
if direction=="up":
self.loc_goto((0,-plenght))
line_control_func_draw_move中,如果是从左往右绘制,只需要通过loc_goto方法直接跳转到当前位置增加1个基本单位plenght处即可完成下一个绘制位置的控制,loc_goto方法如下:
代码语言:javascript复制 #跳转
def loc_goto(self,movepos):
penup()
goto(pos() movepos)
pendown()
最后,我们查看对称线段的如何绘制,代码如下:
代码语言:javascript复制if symmetrical!="f":
self.goto_(symmetrical_point)
posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")
self.goto_(posdict['point' str(lenght-1)][3])
其实对称线段绘制就很简单了,直接传入需要从哪个点开始绘制,随后调用line方法就可以了,这个时候关闭对称参数即可。
1.3 完成阶梯的绘制
在方块堆叠的实现的内容中,绘制出来的效果更像是马赛克风格的图像,那么阶梯的绘制是较为常见的。代码如下:
代码语言:javascript复制 #step方法的绘图跳转控制
#@lenght=总长
#@blenght=bit一个位长度
#@plenght=点长度
#@direction1=横线绘制方向
#@direction2=竖线绘制方向
#@fcolor=填充颜色
#@pcolor=笔颜色
#@psize=笔大小
#@gotopos=如何跳转pos位置
#@cout_i=循环控制变量i
def step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):
print('-----------',blenght)
posdict={}
posdict['line' str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.loc_goto(gotopos1)
posdict['vline' str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)
if cout_i!=(lenght-1):
self.loc_goto(gotopos2)
return posdict
#绘制线段
#@lenght=线长度
#@height=线高度
#@blenght=bit一个位长度
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def step(self,lenght=1,height=1,blenght=1,plenght=10,direction="right",fcolor="black",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):
posdict={}
symmetrical_point="f"
symmetrical_draw_direction=''
if symmetrical!="f":
if symmetrical_direction=="right":
symmetrical_point=pos() (int(symmetrical)*plenght,0)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="left":
symmetrical_point=pos() (-int(symmetrical)*plenght,0)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="rightdown":
symmetrical_point=pos() (0,int(symmetrical)*plenght)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="leftdown":
symmetrical_point=pos() (0,-int(symmetrical)*plenght)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
for i in range(0,lenght):
if direction=="right":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)
elif direction=="left":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)
elif direction=="rightdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)
elif direction=="leftdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)
#对称
if symmetrical!="f":
self.goto_(symmetrical_point)
posdict['symmetrical_step']=self.step(lenght=lenght,height=height,blenght=blenght,plenght=plenght,direction=symmetrical_draw_direction,fcolor=fcolor,pcolor=pcolor,psize=psize)
print(posdict)
self.goto_(posdict['step' str(lenght-1)]['vline' str(lenght-1)]['point' str(height-1)][0])
return posdict
其实阶梯的绘制方法跟线段原理是一致的。首先看一下绘制控制:
代码语言:javascript复制for i in range(0,lenght):
if direction=="right":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)
elif direction=="left":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)
elif direction=="rightdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)
elif direction=="leftdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)
阶梯的绘制方向我们有左上、左下、右上和右下,这个时候直接判断绘制内容,随后使用控制方法控制即可:
代码语言:javascript复制 #step方法的绘图跳转控制
#@lenght=总长
#@blenght=bit一个位长度
#@plenght=点长度
#@direction1=横线绘制方向
#@direction2=竖线绘制方向
#@fcolor=填充颜色
#@pcolor=笔颜色
#@psize=笔大小
#@gotopos=如何跳转pos位置
#@cout_i=循环控制变量i
def step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):
print('-----------',blenght)
posdict={}
posdict['line' str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.loc_goto(gotopos1)
posdict['vline' str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)
if cout_i!=(lenght-1):
self.loc_goto(gotopos2)
return posdict
控制方法此时就不像线段那样只移动一个坐标位置,阶梯需要x和y坐标都进行增删才可以实现,同理可得就不再赘述内容了。
1.4完整的core类代码
至此,完整的core类基本代码就已经写完了,代码如下:
代码语言:javascript复制from turtle import *
class Core:
'''
设置
'''
#填充颜色色值
#@fcolor=点填充颜色
def fillcolor_set(self,fcolor="black"):
fillcolor(fcolor)
#笔杆颜色设置
#@fcolor=点填充颜色
#@pcolor=线颜色
def pencolor_set(self,fcolor="black",pcolor="1"):
if pcolor=="1":
pcolor=fcolor
pencolor(pcolor)
else:
pencolor(pcolor)
#笔杆尺寸
#@psize=线尺寸
def pensize_set(self,psize=1):
pensize(psize)
'''
other func
'''
#跳转
def loc_goto(self,movepos):
penup()
goto(pos() movepos)
pendown()
def goto_(self,pos_):
penup()
goto(pos_)
pendown()
#line方法的绘图跳转控制
def line_control_func_draw_move(self,cout_i,direction,lenght,plenght):
if cout_i!=(lenght-1):
if direction=="right":
self.loc_goto((plenght,0))
elif direction=="left":
self.loc_goto((-plenght,0))
elif direction=="up":
self.loc_goto((0,plenght))
elif direction=="down":
self.loc_goto((0,-plenght))
elif cout_i==(lenght-1):
if direction=="left":
self.loc_goto((plenght,0))
if direction=="up":
self.loc_goto((0,-plenght))
#step方法的绘图跳转控制
#@lenght=总长
#@blenght=bit一个位长度
#@plenght=点长度
#@direction1=横线绘制方向
#@direction2=竖线绘制方向
#@fcolor=填充颜色
#@pcolor=笔颜色
#@psize=笔大小
#@gotopos=如何跳转pos位置
#@cout_i=循环控制变量i
def step_control_func_draw_move(self,lenght,blenght,plenght,direction1,direction2,fcolor,pcolor,psize,gotopos1,gotopos2,cout_i,height):
print('-----------',blenght)
posdict={}
posdict['line' str(cout_i)]=self.line(lenght=blenght,plenght=plenght,direction=direction1,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.loc_goto(gotopos1)
posdict['vline' str(cout_i)]=self.line(lenght=height,plenght=plenght,direction=direction2,fcolor=fcolor,pcolor=pcolor,psize=psize)
if cout_i!=(lenght-1):
self.loc_goto(gotopos2)
return posdict
'''
绘制
'''
#绘制点
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def point(self,plenght=10,fcolor="black",pcolor="1",psize=1):
poslist=[]
self.fillcolor_set(fcolor)
self.pencolor_set(fcolor,pcolor)
self.pensize_set(psize)
begin_fill()
for i in range(0,4):
poslist.append(pos())
fd(plenght)
right(90)
end_fill()
return poslist
#绘制线段
#@lenght=线长度
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def line(self,lenght=1,plenght=10,direction="right",fcolor="white",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):
posdict={}
symmetrical_point="f"
if symmetrical!="f":
if symmetrical_direction=="right":
symmetrical_point=pos() (int(symmetrical)*plenght,0)
elif symmetrical_direction=="left":
symmetrical_point=pos() (-int(symmetrical)*plenght,0)
elif symmetrical_direction=="up":
symmetrical_point=pos() (0,int(symmetrical)*plenght)
elif symmetrical_direction=="down":
symmetrical_point=pos() (0,-int(symmetrical)*plenght)
for i in range(0,lenght):
posdict['point' str(i)]=self.point(plenght=plenght,fcolor=fcolor,pcolor=pcolor,psize=psize)
self.line_control_func_draw_move(i,direction,lenght,plenght)
if symmetrical!="f":
self.goto_(symmetrical_point)
posdict['symmetrical_point']=self.line(lenght=lenght,plenght=plenght,direction=direction,fcolor=fcolor,pcolor=pcolor,psize=psize,symmetrical="f")
self.goto_(posdict['point' str(lenght-1)][3])
return posdict
#绘制线段
#@lenght=线长度
#@height=线高度
#@blenght=bit一个位长度
#@plenght=点长度
#@fcolor=点填充颜色
#@pcolor=线颜色
#@psize=线尺寸
def step(self,lenght=1,height=1,blenght=1,plenght=10,direction="right",fcolor="black",pcolor="1",psize=1,symmetrical="f",symmetrical_direction="right"):
posdict={}
symmetrical_point="f"
symmetrical_draw_direction=''
if symmetrical!="f":
if symmetrical_direction=="right":
symmetrical_point=pos() (int(symmetrical)*plenght,0)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="left":
symmetrical_point=pos() (-int(symmetrical)*plenght,0)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="rightdown":
symmetrical_point=pos() (0,int(symmetrical)*plenght)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
elif symmetrical_direction=="leftdown":
symmetrical_point=pos() (0,-int(symmetrical)*plenght)
if direction=="right":
symmetrical_draw_direction="left"
elif direction=="left":
symmetrical_draw_direction="right"
elif direction=="rightdown":
symmetrical_draw_direction="leftdown"
elif direction=="leftdown":
symmetrical_draw_direction="rightdown"
for i in range(0,lenght):
if direction=="right":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,direction,"up",fcolor,pcolor,psize,(plenght,plenght),(plenght,plenght*2),i,height)
elif direction=="left":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","up",fcolor,pcolor,psize,(-plenght*2,plenght),(-plenght,plenght*2),i,height)
elif direction=="rightdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"right","down",fcolor,pcolor,psize,(plenght,-plenght),(plenght,-plenght),i,height)
elif direction=="leftdown":
posdict["step" str(i)]=self.step_control_func_draw_move(lenght,blenght,plenght,"left","down",fcolor,pcolor,psize,(-plenght*2,-plenght),(-plenght,-plenght),i,height)
#对称
if symmetrical!="f":
self.goto_(symmetrical_point)
posdict['symmetrical_step']=self.step(lenght=lenght,height=height,blenght=blenght,plenght=plenght,direction=symmetrical_draw_direction,fcolor=fcolor,pcolor=pcolor,psize=psize)
print(posdict)
self.goto_(posdict['step' str(lenght-1)]['vline' str(lenght-1)]['point' str(height-1)][0])
return posdict
1.5再次封装,逻辑绘图
但是我们的绘制方法需要自己敲代码,是不是觉得很麻烦?我们那么懒,那么就再写个方法封装一下,让我们直接使用比较轻松的方式进行线段绘制吧。新建一个文件,叫做drawTools,引入core类以及turtle:
代码语言:javascript复制from core import Core
from turtle import *
我们新建一个类,继承Core,叫做Tools:
代码语言:javascript复制class Tools(Core):
我们甚至可以直接做辅助线,如何做?很简单,画格子就可以了,直接把辅助线的绘制方法写在init方法中吧:
代码语言:javascript复制width,height=0,0
def __init__(self,open=False,helperline='red'):
width=window_width()
height=window_height()
#行列
lines=int(height/10)
rows=int(width/10)
#左上角
leftx=-int(width/2)
topy=int(height/2)
self.goto_((leftx,topy))
if open==True:
for l in range(lines):
nowpos=pos()-(0,0)
self.line(rows,10,pcolor=helperline)
topy-=10
self.goto_((leftx,topy))
qx,qy=-160,160
self.goto_((qx,qy))
for l in range(32):
nowpos=pos()-(0,0)
self.line(32,10,pcolor="blue")
qy-=10
self.goto_((qx,qy))
qx,qy=-80,80
self.goto_((qx,qy))
for l in range(16):
nowpos=pos()-(0,0)
self.line(16,10,pcolor="green")
qy-=10
self.goto_((qx,qy))
qx,qy=-20,20
self.goto_((qx,qy))
for l in range(4):
nowpos=pos()-(0,0)
self.line(4,10,pcolor="red")
qy-=10
self.goto_((qx,qy))
self.goto_((0,0))
init接收2个参数,一个是open,决定是否开启辅助线,helperline则是辅助线的颜色。 我们首先需要获取整个canvas画布的长宽,以及我们辅助线可以有多长,还有就是左上角绘制起始点的位置,随后跳到该位置准备进行绘制:
代码语言:javascript复制 width=window_width()
height=window_height()
#行列
lines=int(height/10)
rows=int(width/10)
#左上角
leftx=-int(width/2)
topy=int(height/2)
self.goto_((leftx,topy))
随后就是简单的代码进行画格子了,为了比较清晰,我们可以分别用不同颜色进行区分:
代码语言:javascript复制if open==True:
for l in range(lines):
nowpos=pos()-(0,0)
self.line(rows,10,pcolor=helperline)
topy-=10
self.goto_((leftx,topy))
qx,qy=-160,160
self.goto_((qx,qy))
for l in range(32):
nowpos=pos()-(0,0)
self.line(32,10,pcolor="blue")
qy-=10
self.goto_((qx,qy))
qx,qy=-80,80
self.goto_((qx,qy))
for l in range(16):
nowpos=pos()-(0,0)
self.line(16,10,pcolor="green")
qy-=10
self.goto_((qx,qy))
qx,qy=-20,20
self.goto_((qx,qy))
for l in range(4):
nowpos=pos()-(0,0)
self.line(4,10,pcolor="red")
qy-=10
self.goto_((qx,qy))
self.goto_((0,0))
以上代码中的qx,qy则是到达该区域后进行的不同颜色的绘制,代码没有优化,所以就将就着看着吧。(可以用我就懒了,哈哈哈)最后跳转到0,0中心点。
那么接下来我们需要使用比较简单的方式进行绘制内容了。新建一个方法叫做drawlines:
代码语言:javascript复制#绘制线段 'length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13'
def drawlines(self,drawcon=[],startpos=(0,0)):
for c in drawcon:
c_val=c.split(';')
length=0
direction=''
fcolor=''
posv=None
symmetrical='f'
symmetrical_direction="right"
line_type='line'
for v in c_val:
demens=v.split(':')
if demens[0]=='length':
length=int(demens[1])
elif demens[0]=='direction':
direction=demens[1]
elif demens[0]=='fcolor':
fcolor=demens[1]
elif demens[0]=='pos':
posval=demens[1].split(',')
posv=(int(posval[0]) startpos[0],int(posval[1]) startpos[1])
elif demens[0]=='symmetrical':
symmetrical=int(demens[1])
elif demens[0]=='symmetrical_direction':
symmetrical_direction=demens[1]
elif demens[0]=='line_type':
line_type=demens[1]
self.goto_(posv)
if line_type=='line':
self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
接收参数drawcon为一个列表,列表里面包含了绘制逻辑,绘制逻辑示例为:length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13
,length表示长度多少,direction表示从绘制点往下画还是往左、往右、往上画,fcolor为填充颜色yay,pos为其实绘制点,symmetrical表示对称位置,默认对称为右对称镜像。
我们的命令是使用分号进行分隔,由于我们的一张图片不止一条线段,所以我们直接使用循环遍历列表的内容。遍历内容时,使用split分隔字符即可。
for c in drawcon:
c_val=c.split(';')
length=0
direction=''
fcolor=''
posv=None
symmetrical='f'
symmetrical_direction="right"
line_type='line'
以上一些变量是作为局部变量方便接下来使用而已,用法基础,内容就不再赘述了。随后使用分号进行分隔后得到一组一组的数据,例如length:2、direction:down…他们之间使用的是冒号进行分隔,那么再遍历内容,进行冒号分隔即可。这个时候获取他们的第0维度的文本就可以知道是什么数据了,随后使用局部变量赋值,最后传入到line方法中,这样的话就可以通过字符串形式调用lline方法了,而且及其简单:
代码语言:javascript复制for v in c_val:
demens=v.split(':')
if demens[0]=='length':
length=int(demens[1])
elif demens[0]=='direction':
direction=demens[1]
elif demens[0]=='fcolor':
fcolor=demens[1]
elif demens[0]=='pos':
posval=demens[1].split(',')
posv=(int(posval[0]) startpos[0],int(posval[1]) startpos[1])
elif demens[0]=='symmetrical':
symmetrical=int(demens[1])
elif demens[0]=='symmetrical_direction':
symmetrical_direction=demens[1]
elif demens[0]=='line_type':
line_type=demens[1]
self.goto_(posv)
if line_type=='line':
self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
1.6完整的逻辑绘图类代码
这个时候再次封装将会使我们的代码变得十分简单。完整的代码如下:
代码语言:javascript复制from core import Core
from turtle import *
class Tools(Core):
width,height=0,0
def __init__(self,open=False,helperline='red'):
width=window_width()
height=window_height()
#行列
lines=int(height/10)
rows=int(width/10)
#左上角
leftx=-int(width/2)
topy=int(height/2)
self.goto_((leftx,topy))
if open==True:
for l in range(lines):
nowpos=pos()-(0,0)
self.line(rows,10,pcolor=helperline)
topy-=10
self.goto_((leftx,topy))
qx,qy=-160,160
self.goto_((qx,qy))
for l in range(32):
nowpos=pos()-(0,0)
self.line(32,10,pcolor="blue")
qy-=10
self.goto_((qx,qy))
qx,qy=-80,80
self.goto_((qx,qy))
for l in range(16):
nowpos=pos()-(0,0)
self.line(16,10,pcolor="green")
qy-=10
self.goto_((qx,qy))
qx,qy=-20,20
self.goto_((qx,qy))
for l in range(4):
nowpos=pos()-(0,0)
self.line(4,10,pcolor="red")
qy-=10
self.goto_((qx,qy))
self.goto_((0,0))
#绘制线段 'length:2;direction:down;fcolor:black;pos:(0,-100);symmetrical:13'
def drawlines(self,drawcon=[],startpos=(0,0)):
for c in drawcon:
c_val=c.split(';')
length=0
direction=''
fcolor=''
posv=None
symmetrical='f'
symmetrical_direction="right"
line_type='line'
for v in c_val:
demens=v.split(':')
if demens[0]=='length':
length=int(demens[1])
elif demens[0]=='direction':
direction=demens[1]
elif demens[0]=='fcolor':
fcolor=demens[1]
elif demens[0]=='pos':
posval=demens[1].split(',')
posv=(int(posval[0]) startpos[0],int(posval[1]) startpos[1])
elif demens[0]=='symmetrical':
symmetrical=int(demens[1])
elif demens[0]=='symmetrical_direction':
symmetrical_direction=demens[1]
elif demens[0]=='line_type':
line_type=demens[1]
self.goto_(posv)
if line_type=='line':
self.line(length,fcolor=fcolor,direction=direction,symmetrical=symmetrical,symmetrical_direction=symmetrical_direction)
1.7 实例
现在我想画个狗头,只需要编写出绘制逻辑,如下:
代码语言:javascript复制#dog face
dog_face=[
#耳朵
'length:9;direction:down;fcolor:black;pos:0,0;symmetrical:20;',
'length:2;direction:right;fcolor:black;pos:10,10;symmetrical:17;',
'length:1;direction:right;fcolor:black;pos:30,0;symmetrical:14;',
'length:1;direction:right;fcolor:black;pos:40,-10;symmetrical:12;',
'length:11;direction:right;fcolor:black;pos:50,-20;',
'length:1;direction:right;fcolor:black;pos:40,-30;symmetrical:12;',
'length:2;direction:down;fcolor:black;pos:30,-40;symmetrical:14;',
'length:2;direction:right;fcolor:black;pos:10,-60;symmetrical:17;',
#脸蛋
'length:7;direction:down;fcolor:black;pos:-10,-90;symmetrical:22;',
'length:2;direction:down;fcolor:black;pos:0,-160;symmetrical:20;',
'length:2;direction:right;fcolor:black;pos:10,-180;symmetrical:17;',
'length:2;direction:down;fcolor:black;pos:30,-190;symmetrical:14;',
'length:1;direction:down;fcolor:black;pos:40,-210;',
'length:2;direction:right;fcolor:black;pos:150,-210;',
'length:10;direction:right;fcolor:black;pos:50,-220;',
#眼眶
'length:2;direction:down;fcolor:black;pos:0,-110;symmetrical:12;',
'length:6;direction:right;fcolor:black;pos:10,-100;symmetrical:12;',
'length:2;direction:down;fcolor:black;pos:70,-110;symmetrical:12;',
'length:6;direction:right;fcolor:black;pos:10,-130;symmetrical:12;',
#眼珠
'length:2;direction:down;fcolor:black;pos:60,-110;symmetrical:12;',
'length:1;direction:down;fcolor:gray;pos:50,-110;symmetrical:12;',
'length:1;direction:down;fcolor:black;pos:50,-120;symmetrical:12;',
#鼻子嘴巴
'length:2;direction:down;fcolor:black;pos:70,-150;symmetrical:2;',
'length:5;direction:down;fcolor:black;pos:80,-150;',
'length:7;direction:right;fcolor:black;pos:60,-200;',
'length:1;direction:right;fcolor:black;pos:130,-190;',
'length:1;direction:right;fcolor:black;pos:140,-180;',
]
然后引入库:
代码语言:javascript复制from drawTools import Tools
from turtle import *
调用工具即可:
代码语言:javascript复制tool=Tools()
tracer(5,1)
tool.drawlines(zan)
狗头就完成了:
再画个程序员吧:
逻辑如下:
代码语言:javascript复制#programer
programer=[
#头发
'length:3;direction:right;fcolor:black;pos:0,0;',
'length:11;direction:right;fcolor:black;pos:30,10;',
'length:2;direction:right;fcolor:black;pos:140,0;',
'length:1;direction:right;fcolor:black;pos:160,-10;',
'length:3;direction:right;fcolor:black;pos:170,-20;',
'length:4;direction:down;fcolor:black;pos:200,-30;',
'length:2;direction:left;fcolor:black;pos:190,-70;',
'length:2;direction:left;fcolor:black;pos:170,-80;',
'length:5;direction:up;fcolor:black;pos:150,-70;',
'length:2;direction:up;fcolor:black;pos:140,-70;',
'length:3;direction:left;fcolor:black;pos:140,-70;',
'length:3;direction:left;fcolor:black;pos:110,-80;',
'length:1;direction:left;fcolor:black;pos:80,-70;',
'length:2;direction:left;fcolor:black;pos:70,-80;',
'length:1;direction:left;fcolor:black;pos:50,-70;',
'length:3;direction:down;fcolor:black;pos:40,-60;',
'length:4;direction:left;fcolor:black;pos:30,-80;',
'length:5;direction:down;fcolor:black;pos:-10,-80;',#左侧脸最左侧坐标
'length:2;direction:up;fcolor:black;pos:-20,-110;',
'length:8;direction:up;fcolor:black;pos:-30,-100;',
'length:1;direction:up;fcolor:black;pos:-20,-20;',
'length:1;direction:up;fcolor:black;pos:-10,-10;',
#脸廓
'length:2;direction:down;fcolor:black;pos:0,-130;',
'length:6;direction:down;fcolor:black;pos:10,-150;',
'length:1;direction:down;fcolor:black;pos:20,-210;',
'length:12;direction:right;fcolor:black;pos:30,-220;',
'length:1;direction:right;fcolor:black;pos:150,-210;',
'length:1;direction:right;fcolor:black;pos:160,-200;',
'length:11;direction:up;fcolor:black;pos:170,-190;',
#眼睛
'length:4;direction:right;fcolor:black;pos:40,-105;symmetrical:8;',
#眉毛
'length:2;direction:down;fcolor:black;pos:70,-125;symmetrical:5;',
#嘴巴
'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;',
'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;',
'length:7;direction:right;fcolor:black;pos:60,-195;',
]
再点个赞:
逻辑:
代码语言:javascript复制#赞
zan=[
#袖子
'length:6;direction:down;fcolor:black;pos:0,0;symmetrical:3;',
'length:4;direction:right;fcolor:black;pos:0,10;symmetrical:7;symmetrical_direction:down;',
#拇指
'length:1;direction:down;fcolor:black;pos:40,10;',
'length:1;direction:down;fcolor:black;pos:50,20;symmetrical:4;',
'length:1;direction:down;fcolor:black;pos:60,30;',
'length:3;direction:up;fcolor:black;pos:70,40;',
'length:1;direction:up;fcolor:black;pos:80,70;symmetrical:2;',
'length:2;direction:right;fcolor:black;pos:90,80;',
'length:6;direction:down;fcolor:black;pos:100,80;',
#握拳
'length:6;direction:right;fcolor:black;pos:80,10;',
'length:6;direction:down;fcolor:black;pos:140,10;',
'length:1;direction:down;fcolor:black;pos:130,-50;',
'length:9;direction:left;fcolor:black;pos:120,-60;',
]
当然还有更多的逻辑代码如下:
代码语言:javascript复制drawcon=['length:4;direction:down;fcolor:black;pos:0,0',
'length:6;direction:down;fcolor:black;pos:-10,-40',
'length:2;direction:down;fcolor:black;pos:0,-100;symmetrical:13',
'length:2;direction:right;fcolor:black;pos:10,-120;symmetrical:10',
'length:8;direction:right;fcolor:black;pos:30,-130',
'length:8;direction:down;fcolor:black;pos:140,-20',
'length:2;direction:down;fcolor:black;pos:130,0',
'length:3;direction:right;fcolor:black;pos:100,10',
'length:2;direction:down;fcolor:black;pos:90,0',
'length:5;direction:left;fcolor:black;pos:90,-20',
'length:2;direction:up;fcolor:black;pos:40,-20',
'length:3;direction:left;fcolor:black;pos:30,0',
'length:1;direction:left;fcolor:black;pos:0,-60;symmetrical:13',
'length:1;direction:down;fcolor:black;pos:0,-80;symmetrical:13',
'length:2;direction:down;fcolor:black;pos:30,-70;symmetrical:7',
'length:2;direction:right;fcolor:black;pos:60,-90',
]
drawcon1=['length:1;direction:down;fcolor:black;pos:0,0',
'length:3;direction:down;fcolor:black;pos:-10,-10',
'length:2;direction:right;fcolor:black;pos:0,-40',
'length:2;direction:right;fcolor:black;pos:10,-20',
'length:1;direction:right;fcolor:black;pos:20,-30',
'length:1;direction:right;fcolor:black;pos:20,-30',
'length:2;direction:right;fcolor:black;pos:30,-40',
'length:1;direction:right;fcolor:black;pos:40,-50',
'length:2;direction:right;fcolor:black;pos:50,-60',
'length:1;direction:right;fcolor:black;pos:70,-50',
'length:3;direction:up;fcolor:black;pos:80,-40',
'length:2;direction:left;fcolor:black;pos:70,-10',
'length:2;direction:down;fcolor:black;pos:50,-20',
'length:2;direction:left;fcolor:black;pos:40,-10',
'length:2;direction:up;fcolor:black;pos:20,0',
'length:1;direction:left;fcolor:black;pos:10,10',
]
human_head=[
'length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;',
'length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;',
'length:1;direction:down;fcolor:black;pos:120,-152;symmetrical:2;symmetrical_direction:down;',
'length:1;direction:down;fcolor:black;pos:110,-162;symmetrical:2;symmetrical_direction:down;',
'length:3;direction:right;fcolor:black;pos:120,-192;',
]
web=[
'length:32;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:31;',
'length:4;direction:down;fcolor:black;pos:160,-210;',
'length:17;direction:right;fcolor:black;pos:80,-250;',
'length:6;direction:right;fcolor:blue;pos:20,-50;',
'length:6;direction:right;fcolor:blue;pos:50,-70;',
]
phone=[
'length:16;direction:right;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:down',
'length:20;direction:down;fcolor:black;pos:0,0;symmetrical:15;',
'length:16;direction:right;fcolor:black;pos:0,-170;',
'length:1;direction:right;fcolor:black;pos:75,-185;',
]
spider=[
'length:17;direction:right;fcolor:black;pos:0,0;symmetrical:11;symmetrical_direction:down',
'length:11;direction:down;fcolor:black;pos:0,0;symmetrical:16;',
'length:6;direction:right;fcolor:black;pos:20,-20;symmetrical:6;symmetrical_direction:down',
'length:6;direction:down;fcolor:black;pos:20,-20;symmetrical:5;',
'length:6;direction:right;fcolor:black;pos:90,-20;symmetrical:6;symmetrical_direction:down',
'length:6;direction:down;fcolor:black;pos:90,-20;symmetrical:5;',
'length:2;direction:right;fcolor:black;pos:40,-40;symmetrical:7;',
'length:2;direction:right;fcolor:black;pos:40,-50;symmetrical:7;',
'length:6;direction:left;fcolor:black;pos:0,-20;symmetrical:22;',#第一根腿
'length:3;direction:down;fcolor:black;pos:-60,-20;symmetrical:28;',
'length:7;direction:left;fcolor:black;pos:0,-60;symmetrical:23;',#中间腿
'length:8;direction:left;fcolor:black;pos:0,-80;symmetrical:24;',#最前面的腿
'length:4;direction:down;fcolor:black;pos:-80,-80;symmetrical:32;',
]
camera=[
'length:26;direction:right;fcolor:black;pos:0,0;symmetrical:14;symmetrical_direction:down',
'length:14;direction:down;fcolor:black;pos:0,0;symmetrical:25;',
'length:6;direction:right;fcolor:black;pos:20,-30;symmetrical:4;symmetrical_direction:down',
'length:4;direction:down;fcolor:black;pos:20,-30;symmetrical:5;',
'length:3;direction:right;fcolor:black;pos:200,-20;',
]
led=[
'length:8;direction:right;fcolor:black;pos:0,0',
'length:1;direction:right;fcolor:black;pos:-10,-10;symmetrical:9;',
'length:9;direction:down;fcolor:black;pos:-20,-20;symmetrical:11;',
'length:1;direction:down;fcolor:black;pos:-10,-110;symmetrical:9;',
'length:1;direction:down;fcolor:black;pos:0,-120;symmetrical:7;',
'length:1;direction:down;fcolor:black;pos:10,-130;symmetrical:5;',
'length:4;direction:right;fcolor:black;pos:20,-150;symmetrical:2;symmetrical_direction:down',#灯座
'length:2;direction:up;fcolor:black;pos:0,20',#灯光
'length:2;direction:up;fcolor:black;pos:20,20',
'length:2;direction:up;fcolor:black;pos:40,20',
'length:2;direction:up;fcolor:black;pos:60,20',
'length:2;direction:up;fcolor:black;pos:80,20',
]
#----------------------------
#哭脸
cry_face=[
'length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;',
'length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;',
'length:12;direction:down;fcolor:black;pos:20,-105;symmetrical:14;',
'length:12;direction:down;fcolor:black;pos:80,-105;symmetrical:14;',
'length:5;direction:right;fcolor:black;pos:100,-145;',
]
#苹果
apple=[
'length:2;direction:right;fcolor:black;pos:0,0;symmetrical:10;symmetrical_direction:down',
'length:1;direction:right;fcolor:black;pos:20,-10;symmetrical:8;symmetrical_direction:down',#苹果凹坑
'length:3;direction:right;fcolor:black;pos:30,0;symmetrical:10;symmetrical_direction:down',
'length:1;direction:right;fcolor:black;pos:-10,-10;symmetrical:8;symmetrical_direction:down',
'length:1;direction:right;fcolor:black;pos:-20,-20;symmetrical:6;symmetrical_direction:down',
'length:5;direction:down;fcolor:black;pos:-30,-30;',
'length:1;direction:right;fcolor:black;pos:60,-10;symmetrical:8;symmetrical_direction:down',#咬痕
'length:1;direction:right;fcolor:black;pos:50,-20;symmetrical:6;symmetrical_direction:down',
'length:1;direction:left;fcolor:black;pos:40,-30;symmetrical:4;symmetrical_direction:down',
'length:3;direction:down;fcolor:black;pos:30,-40;',
'length:1;direction:down;fcolor:black;pos:20,20;',#叶子
'length:2;direction:right;fcolor:black;pos:30,30;',
'length:1;direction:down;fcolor:black;pos:50,40;',
]
#书本
notebook=[
'length:12;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down',
'length:1;direction:right;fcolor:black;pos:120,-10;symmetrical:21;symmetrical_direction:down',#凹
'length:13;direction:right;fcolor:black;pos:130,0;symmetrical:21;symmetrical_direction:down',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;',
'length:5;direction:down;fcolor:black;pos:120,-10;',#中间
]
#字母
letter_p=[
'length:21;direction:down;fcolor:black;pos:0,0;',
'length:6;direction:right;fcolor:black;pos:0,0;symmetrical:8;symmetrical_direction:down',
'length:1;direction:right;fcolor:black;pos:60,-10;symmetrical:6;symmetrical_direction:down',
'length:5;direction:down;fcolor:black;pos:70,-20;',
]
letter_h=[
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:13;symmetrical_direction:right',
'length:13;direction:right;fcolor:black;pos:0,-80;',
]
letter_t=[
'length:13;direction:right;fcolor:black;pos:0,0;',
'length:18;direction:down;fcolor:black;pos:60,0;',
]
letter_m=[
'length:20;direction:right;fcolor:black;pos:0,0;',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:right',
'length:21;direction:down;fcolor:black;pos:100,0;',
]
letter_l=[
'length:21;direction:down;fcolor:black;pos:0,0;',
'length:14;direction:right;fcolor:black;pos:0,-210;',
]
letter_s=[
'length:10;direction:right;fcolor:black;pos:0,0;',
'length:10;direction:down;fcolor:black;pos:0,0;',
'length:10;direction:right;fcolor:black;pos:0,-100;symmetrical:9;symmetrical_direction:down',
'length:10;direction:down;fcolor:black;pos:100,-100;',
]
letter_q=[
'length:10;direction:right;fcolor:black;pos:0,0;symmetrical:20;symmetrical_direction:down',
'length:20;direction:down;fcolor:black;pos:0,0;symmetrical:10;symmetrical_direction:right',
'length:5;direction:right;fcolor:black;pos:80,-150;',
]
letter_j=[
'length:7;direction:right;fcolor:black;pos:0,0;',
'length:18;direction:down;fcolor:black;pos:70,0;',
'length:1;direction:down;fcolor:black;pos:60,-180;',
'length:1;direction:down;fcolor:black;pos:50,-190;',
'length:3;direction:left;fcolor:black;pos:40,-200;',
'length:1;direction:left;fcolor:black;pos:10,-190;',
'length:2;direction:up;fcolor:black;pos:0,-180;',
]
#笑脸
happy_face=[
'length:26;direction:right;fcolor:black;pos:0,0;symmetrical:21;symmetrical_direction:down',
'length:21;direction:down;fcolor:black;pos:0,0;symmetrical:25;',
'length:7;direction:right;fcolor:black;pos:20,-85;symmetrical:14;',
'length:9;direction:right;fcolor:black;pos:80,-175;',#笑脸嘴
'length:1;direction:right;fcolor:black;pos:70,-165;symmetrical:10;symmetrical_direction:right',
'length:1;direction:right;fcolor:black;pos:60,-155;symmetrical:12;symmetrical_direction:right',
]
#dog face
dog_face=[
#耳朵
'length:9;direction:down;fcolor:black;pos:0,0;symmetrical:20;',
'length:2;direction:right;fcolor:black;pos:10,10;symmetrical:17;',
'length:1;direction:right;fcolor:black;pos:30,0;symmetrical:14;',
'length:1;direction:right;fcolor:black;pos:40,-10;symmetrical:12;',
'length:11;direction:right;fcolor:black;pos:50,-20;',
'length:1;direction:right;fcolor:black;pos:40,-30;symmetrical:12;',
'length:2;direction:down;fcolor:black;pos:30,-40;symmetrical:14;',
'length:2;direction:right;fcolor:black;pos:10,-60;symmetrical:17;',
#脸蛋
'length:7;direction:down;fcolor:black;pos:-10,-90;symmetrical:22;',
'length:2;direction:down;fcolor:black;pos:0,-160;symmetrical:20;',
'length:2;direction:right;fcolor:black;pos:10,-180;symmetrical:17;',
'length:2;direction:down;fcolor:black;pos:30,-190;symmetrical:14;',
'length:1;direction:down;fcolor:black;pos:40,-210;',
'length:2;direction:right;fcolor:black;pos:150,-210;',
'length:10;direction:right;fcolor:black;pos:50,-220;',
#眼眶
'length:2;direction:down;fcolor:black;pos:0,-110;symmetrical:12;',
'length:6;direction:right;fcolor:black;pos:10,-100;symmetrical:12;',
'length:2;direction:down;fcolor:black;pos:70,-110;symmetrical:12;',
'length:6;direction:right;fcolor:black;pos:10,-130;symmetrical:12;',
#眼珠
'length:2;direction:down;fcolor:black;pos:60,-110;symmetrical:12;',
'length:1;direction:down;fcolor:gray;pos:50,-110;symmetrical:12;',
'length:1;direction:down;fcolor:black;pos:50,-120;symmetrical:12;',
#鼻子嘴巴
'length:2;direction:down;fcolor:black;pos:70,-150;symmetrical:2;',
'length:5;direction:down;fcolor:black;pos:80,-150;',
'length:7;direction:right;fcolor:black;pos:60,-200;',
'length:1;direction:right;fcolor:black;pos:130,-190;',
'length:1;direction:right;fcolor:black;pos:140,-180;',
]
#programer
programer=[
#头发
'length:3;direction:right;fcolor:black;pos:0,0;',
'length:11;direction:right;fcolor:black;pos:30,10;',
'length:2;direction:right;fcolor:black;pos:140,0;',
'length:1;direction:right;fcolor:black;pos:160,-10;',
'length:3;direction:right;fcolor:black;pos:170,-20;',
'length:4;direction:down;fcolor:black;pos:200,-30;',
'length:2;direction:left;fcolor:black;pos:190,-70;',
'length:2;direction:left;fcolor:black;pos:170,-80;',
'length:5;direction:up;fcolor:black;pos:150,-70;',
'length:2;direction:up;fcolor:black;pos:140,-70;',
'length:3;direction:left;fcolor:black;pos:140,-70;',
'length:3;direction:left;fcolor:black;pos:110,-80;',
'length:1;direction:left;fcolor:black;pos:80,-70;',
'length:2;direction:left;fcolor:black;pos:70,-80;',
'length:1;direction:left;fcolor:black;pos:50,-70;',
'length:3;direction:down;fcolor:black;pos:40,-60;',
'length:4;direction:left;fcolor:black;pos:30,-80;',
'length:5;direction:down;fcolor:black;pos:-10,-80;',#左侧脸最左侧坐标
'length:2;direction:up;fcolor:black;pos:-20,-110;',
'length:8;direction:up;fcolor:black;pos:-30,-100;',
'length:1;direction:up;fcolor:black;pos:-20,-20;',
'length:1;direction:up;fcolor:black;pos:-10,-10;',
#脸廓
'length:2;direction:down;fcolor:black;pos:0,-130;',
'length:6;direction:down;fcolor:black;pos:10,-150;',
'length:1;direction:down;fcolor:black;pos:20,-210;',
'length:12;direction:right;fcolor:black;pos:30,-220;',
'length:1;direction:right;fcolor:black;pos:150,-210;',
'length:1;direction:right;fcolor:black;pos:160,-200;',
'length:11;direction:up;fcolor:black;pos:170,-190;',
#眼睛
'length:4;direction:right;fcolor:black;pos:40,-105;symmetrical:8;',
#眉毛
'length:2;direction:down;fcolor:black;pos:70,-125;symmetrical:5;',
#嘴巴
'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;',
'length:2;direction:down;fcolor:black;pos:50,-175;symmetrical:8;',
'length:7;direction:right;fcolor:black;pos:60,-195;',
]
#赞
zan=[
#袖子
'length:6;direction:down;fcolor:black;pos:0,0;symmetrical:3;',
'length:4;direction:right;fcolor:black;pos:0,10;symmetrical:7;symmetrical_direction:down;',
#拇指
'length:1;direction:down;fcolor:black;pos:40,10;',
'length:1;direction:down;fcolor:black;pos:50,20;symmetrical:4;',
'length:1;direction:down;fcolor:black;pos:60,30;',
'length:3;direction:up;fcolor:black;pos:70,40;',
'length:1;direction:up;fcolor:black;pos:80,70;symmetrical:2;',
'length:2;direction:right;fcolor:black;pos:90,80;',
'length:6;direction:down;fcolor:black;pos:100,80;',
#握拳
'length:6;direction:right;fcolor:black;pos:80,10;',
'length:6;direction:down;fcolor:black;pos:140,10;',
'length:1;direction:down;fcolor:black;pos:130,-50;',
'length:9;direction:left;fcolor:black;pos:120,-60;',
]