当前位置 博文首页 > 1_bit 的博客:情人节,我表白了CSDN小姐姐后,竟然...【为表白
情人节,我表白了CSDN小姐姐后,竟然…竟然有人看了这篇文。
以下图片素材由一个还没写完的工具绘制,稍后会放在CSDN的代码仓库(现在能用了,还没时间改,颜色填充算法还没写,有能力的朋友可以修改一下):https://codechina.csdn.net/A757291228/draw_pixel/-/tree/master
很快呀,啪的一下又一年情人节又来了,本来我压根记不住的,但是CSDN竟然告诉我有情人节活动。怎么办?这不能忍,那就只能表白CSDN的小姐姐了。你们要不要一起表白?评论区一起表白吧!
表白肯定要写写情书了。结果…一看征文字数要求,竟然600字!你是看不起我吗?
一封情书根本用不到600字,我200字就写完了。为什么才写200字?不要问,问就是是写不出来600字。
这还要想?当然是全都要了!小孩子才做选择。
例如小婷婷、小慧慧,这可都是集美貌、才华于一身的女子。
小婷婷是谁?小婷婷就是前几天博客之星直播中的主持之一!还记得的弹幕中刷屏的“小婷露脸 流量百万”吗?在CSDN社群中有一个付费专栏群,小婷婷可是付费专栏群中的第一女神。只要小婷婷在线,群里必是最热闹的时候。
那小慧慧又是谁?在微信群中,有一个经常公布信息,到处活跃的运营还记得吗?名字叫做CSDN博客。她就是小慧慧。小慧慧时而性格温柔,时而高冷,就像一个冰雪女王!气质十足!
那怎么样表白这两个小姐姐呢?当然是…写!代!码!生为一个程序直男一定要把这优点发扬光大!
表白CSDN来一幅图~
颜色填充还没写完,不然肯定这图片是漂漂亮亮dev~
毕竟是要画画,首选比较简单的那就是turtle了。但是turtle画东西好麻烦,本身自己就是个手残党,线条都不懂怎么弄。那怎么办?那我们就是用“俄罗斯方块”的画法吧,那就是叠积木~
我们以方块作为线条,进行堆叠就可以完成了。
我们先引入turtle库,然后新建一个类,名为core:
from turtle import *
class Core:
随后新建一个core类的方法point,作为基本的方块点,作为一个线条的基本单位:
'''
设置
'''
#填充颜色色值
#@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方法进行颜色填充。
这样一个点绘制的方法就完成了。
点绘制完了接下来我们就需要绘制线了。线从点的基础上进行堆叠,并排排列那就是线。线的方向可以是上下左右,我们可以通过参数传递从而控制线段绘制方向,并且还可以使用对称方法,让我们减少绘制难度。对于对称来说,也有上下左右基于某个中心点的进行的中心对称。
代码如下:
#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的坐标:
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负。随后我们开始进行循环点的个数,多长就循环多少次:
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:
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"