当前位置 博文首页 > 1_bit 的博客:情人节,我表白了CSDN小姐姐后,竟然...【为表白

    1_bit 的博客:情人节,我表白了CSDN小姐姐后,竟然...【为表白

    作者:[db:作者] 时间:2021-06-02 15:58

    情人节,我表白了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:

    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方法进行颜色填充。

    这样一个点绘制的方法就完成了。

    1.2 完成线段的绘制

    点绘制完了接下来我们就需要绘制线了。线从点的基础上进行堆叠,并排排列那就是线。线的方向可以是上下左右,我们可以通过参数传递从而控制线段绘制方向,并且还可以使用对称方法,让我们减少绘制难度。对于对称来说,也有上下左右基于某个中心点的进行的中心对称。
    代码如下:

    	#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"
    
    下一篇:没有了