python实现多种爱心绘制和其他绘图秀! (项目已开源)

一年多的python学习,绘制的图形有点多,于是写成一个类函数,已经开源到GitHub中, 完全免费,喜欢的就点个关注和赞吧!

在这里插入图片描述


本来最开始就是想总结一下,绘制爱心的各种方式,后来,有点刹不住了,就扩展了我自己画的其他图形,添加上去,让这个项目更加完美一点。上面自己用ps抠出来的,不是很好看,别介意!


项目API:

对应序号 函数 说明
1-2-3-4 get_plt_heart() 使用plt绘制的散点图
函数只给出了4种方式
更多方式请参考散点图文档API
5 get_draw_heart() 使用turtle绘制的红色爱心
无参数,调用即可
6 get_draw_double_heart() 使用turtle绘制的丘比特爱心
原理就是在一个爱心的基础上
进行改造升级
7 get_fill_string_heart(string) 使用* 打印出来的爱心
输入爱心中间填充的话
绘制爱心,字符存在范围
最大支持输入五个字符
8 get_draw_cherry_tree() 绘制一个樱花树
这个我之前发过的博客
绘制樱花
9 get_draw_rose(string=None) 使用turtle绘制的玫瑰花
可以输入三句话用来绘制其中
默认为我设置的个签
10 get_draw_KochSnow() 使用turtle库绘制的科赫雪花
调用计科
11-12 get_string_heart(string) 使用参数string 打印的爱心
输入string 用空格隔开
换句话说,有多少个单词,打印多少个爱心

项目介绍:

本项目已经开源到GitHub中: 地址 python-draw 喜欢的可以点进去看看,记得fork, 点赞下,多谢!,如果你有更好的图案分享,也可以添加到我的仓库里面, 不甚感激!

写这个也就是当作一次总结, 练练手, 熟悉了一下git的使用,然后如何开发一个简易api文档,这也算一次尝试吧!


看完别白嫖,顺手点个关注和赞, 不过分吧?

初始化函数:

函数不是模块化, 需要调用到class的其他方法,其他方法先挂这里!

 	def __init__turtle(self, speed=1, screen_color="white"):
        # 实例化一些turtle相对应的控件
        self.t = T.Turtle()
        self.w = T.Screen()
        # self.w.screensize(bg='wheat')  # 画布颜色小麦色
        self.w.screensize(bg=screen_color)
        # t.speed(0)  # 速度最快
        self.t.getscreen().tracer(speed, 0)  # 返回正在绘制的对象 并且加速5
        self.t.pensize(2)
        self.t.hideturtle()

    def get_math_fun(self, x, y):
        """
        return heart math fun
        """
        return (pow(x * 0.05, 2) + pow(y * 0.1, 2) - 1) ** 3 - pow(x * 0.05, 2) * pow(y * 0.1, 3)


get_plt_heart():

在这里插入图片描述
本来我记得,用plt也是可以绘制一个动态的爱心的,想了一晚上,卡住了,就太监了这个方法。

    def get_plt_heart(self):
        """
        使用plt绘制一个彩色爱心
        原理也是心形方程
        """
        style = {"渐变橙色": "autumn",
                 "渐变紫色": "cool",
                 "渐变晚霞": "magma",
                 "渐变彩虹": "rainbow"}
        print("更多色调选择, 请访问plt散点图API")
        for key, values in style.items():
            print(f'系列:{key} 关键词:{values}')
        choose = input("输入选择的系列的关键词:")
        x_np = np.linspace(- 100, 100, 500)
        y_np = np.linspace(- 100, 100, 500)
        points = []
        for y in y_np:
            for x in x_np:
                if self.get_math_fun(x, y) <= 0:
                    points.append({"x": x, "y": y})
        heart_x = list(map(lambda point: point["x"], points))
        heart_y = list(map(lambda point: point["y"], points))
        plt.scatter(heart_x, heart_y, s=10, alpha=0.5, c=range(len(heart_x)), cmap=choose)
        plt.show()

get_draw_heart():

学会这个爱心的绘制,那么那个丘比特爱心就很简单了。

在这里插入图片描述

    def draw_loop(self):
        """
        绘制一个爱心的循环
        """
        for i in range(200):
            self.t.right(1)
            self.t.fd(1)

    def get_draw_heart(self):
        """
        return draw heart
        using the turtle show heart
        """
        self.__init__turtle()
        self.t.color('gold', 'red')
        self.t.begin_fill()
        self.t.left(140)
        self.t.fd(111.65)
        self.draw_loop()  # 调用循环
        self.t.left(120)
        self.draw_loop()  # 调用循环
        self.t.fd(111.65)
        self.t.end_fill()
        self.w.exitonclick()  # 关闭画布

get_draw_double_heart():

丘比特爱心, biubiubiu-----

在这里插入图片描述

    def get_draw_double_heart(self):
        """
        绘制一个丘比特之间爱心
        (一个箭头射穿二个爱心)
        调用即可
        """
        self.__init__turtle()
        self.t.color('black', 'red')
        self.t.pensize(5)
        #  绘制二个粘连爱心
        self.t.begin_fill()
        self.t.penup()
        self.t.goto(50, 50)
        self.t.pendown()
        self.t.right(45)
        self.t.goto(100, 0)
        self.t.left(90)
        self.t.fd(120)
        self.t.circle(50, 225)
        self.t.penup()
        self.t.goto(0, 0)
        self.t.pendown()
        self.t.left(135)
        self.t.fd(120)
        self.t.circle(50, 225)
        self.t.seth(90)
        self.t.circle(50, 225)
        self.t.fd(121)
        self.t.end_fill()
        # 绘制丘比特之剑
        self.t.left(56)
        # self.t.pencolor('black')
        # self.t.pensize(3)
        self.t.penup()
        self.t.goto(-210, 40)
        self.t.pendown()
        self.t.goto(0, 80)
        self.t.penup()
        self.t.goto(160, 110)
        self.t.pendown()
        self.t.goto(320, 140)
        # 绘制箭头
        self.t.left(150)
        self.t.fd(50)
        self.t.penup()
        self.t.goto(320, 140)
        self.t.pendown()
        self.t.left(60)
        self.t.fd(50)
        self.w.exitonclick()

get_fill_string_heart(string):

可以填充你想表达的句子, 由于这个是在linux中实现的, 换到window就会感觉有点丑爆了。

在这里插入图片描述

    def get_fill_string_heart(self, string):
        """
        输入爱心中间填充的话
        绘制爱心, 中间可以添加字符
        字符 范围 [1 5]
        最大支持输入五个字符
        """
        string = list(string)
        # 对列表进行动态填满5个位置  否则 pop 会出错
        if len(string) < 5:
            index_sub = 5 - len(string)  # 差值
            for i in range(index_sub):  # 向后插
                string.append(' ')
        a2 = []
        for y in range(15, -15, -1):
            a1 = []
            for x in range(-30, 30):
                if -0.75 <= ((x * 0.05) ** 2 + (y * 0.1) ** 2 - 1) ** 3 - (x * 0.05) ** 2 * (y * 0.1) ** 3 <= 0:
                    a1.append('\033[30;47m*\033[0m')
                elif (x == -15) and (y == (10 or 9)):
                    a1.append('\b\033[31;47m')
                elif (x == -16) and (y == (9 or 8)):
                    a1.append('\b\033[31;47m')
                elif (x == -17) and (y == (8 or 7)):
                    a1.append('\b\033[31;47m')
                elif (x == 14) and (y == (10 or 9)):
                    a1.append('\b\033[31;47m')
                elif (x == 15) and (y == (9 or 8)):
                    a1.append('\b\033[31;47m')
                elif (x == 16) and (y == (8 or 7)):
                    a1.append('\b\033[31;47m')
                elif (x == 0) and (y == 2):
                    sts = string.pop(0)
                    a1.append(f'\b\033[31;47m{sts}\033[0m')
                elif (x == 0) and (y == 1):
                    sts = string.pop(0)
                    a1.append(f'\b\033[31;47m{sts}\033[0m')
                elif (x == 0) and (y == 0):
                    sts = string.pop(0)
                    a1.append(f'\b\033[31;47m{sts}\033[0m')
                elif (x == 0) and (y == -1):
                    sts = string.pop(0)
                    a1.append(f'\b\033[31;47m{sts}\033[0m')
                elif (x == 0) and (y == -2):
                    sts = string.pop(0)
                    a1.append(f'\b\033[31;47m{sts}\033[0m')
                else:
                    a1.append(' ')
            a2.append(''.join(a1))

        b = '\n'.join(a2)
        print(b)

get_draw_cherry_tree():

在这里插入图片描述

这个我就给链接了, 喜欢的可以跳转:
樱花树绘制


get_draw_rose(string=None):

string默认是我的个签, 如果想改动,就给出参数string;

在这里插入图片描述

   def ggg(self, n, r, d=1):
        """
        玫瑰花曲线绘制
        """
        for i in range(n):
            self.t.left(d)
            self.t.circle(r, abs(d))

    def get_draw_rose(self, string=None):
        """
        扩展
        绘制玫瑰
        params:    默认为我自己设置的话, 如果想打印你自己的
        传参数 string  用空格隔开,默认三句话,
        """
        if string == None:
            print_str = "我们不需要过多解释 只需要一如既往 奔跑、奔跑、继续奔跑!!"
        else:
            print_str = string
        s1, s2, s3 = print_str.split()[0], print_str.split()[1], print_str.split()[2]
        self.__init__turtle(screen_color="wheat")
        # 初始位置设置
        s = 0.2  # size
        self.t.pencolor("Tan")
        self.t.fillcolor("red")
        self.t.speed(100)
        self.t.penup()
        self.t.goto(0, 900 * s)
        self.t.pendown()
        # 绘制花朵形状
        self.t.begin_fill()
        self.t.circle(200 * s, 30)
        self.ggg(60, 50 * s)
        self.t.circle(200 * s, 30)
        self.ggg(4, 100 * s)
        self.t.circle(200 * s, 50)
        self.ggg(50, 50 * s)
        self.t.circle(350 * s, 65)
        self.ggg(40, 70 * s)
        self.t.circle(150 * s, 50)
        self.ggg(20, 50 * s, -1)
        self.t.circle(400 * s, 60)
        self.ggg(18, 50 * s)
        self.t.fd(250 * s)
        self.t.right(150)
        self.t.circle(-500 * s, 12)
        self.t.left(140)
        self.t.circle(500 * s, 110)
        self.t.left(27)
        self.t.circle(650 * s, 100)
        self.t.left(130)
        self.t.circle(-300 * s, 20)
        self.t.right(123)
        self.t.circle(220 * s, 57)
        self.t.end_fill()
        # 绘制花枝
        self.t.left(120)
        self.t.fd(280 * s)
        self.t.left(115)
        self.t.circle(300 * s, 33)
        self.t.left(180)
        self.t.circle(-300 * s, 33)
        self.ggg(70, 225 * s, -1)
        self.t.circle(350 * s, 104)
        self.t.left(90)
        self.t.circle(200 * s, 105)
        self.t.circle(-500 * s, 63)
        self.t.penup()
        self.t.goto(150 * s, -10 * s)
        self.t.pendown()
        self.t.left(160)
        self.ggg(20, 2400 * s)
        self.ggg(220, 250 * s, -1)
        # 绘制一个绿色叶子
        self.t.fillcolor("green")
        self.t.penup()
        self.t.goto(670 * s, -180 * s)
        self.t.pendown()
        self.t.right(140)
        self.t.begin_fill()
        self.t.circle(300 * s, 120)
        self.t.left(60)
        self.t.circle(300 * s, 120)
        self.t.end_fill()
        self.t.penup()
        self.t.goto(180 * s, -550 * s)
        self.t.pendown()
        self.t.right(85)
        self.t.circle(600 * s, 40)
        # 绘制第二个绿色叶子
        self.t.penup()
        self.t.goto(-150 * s, -1000 * s)
        self.t.pendown()
        self.t.begin_fill()
        self.t.right(120)
        self.t.circle(300 * s, 115)
        self.t.left(75)
        self.t.circle(300 * s, 100)
        self.t.end_fill()
        self.t.penup()
        self.t.goto(430 * s, -1070 * s)
        self.t.pendown()
        self.t.right(30)
        self.t.circle(-600 * s, 35)
        # 文字部分
        self.t.pensize(4)
        self.t.pencolor("purple")
        self.t.penup()
        self.t.goto(-800 * s, -200 * s)
        self.t.pendown()
        self.t.write(f"{s1}", align="left", font=("arial", 10, "normal"))
        self.t.penup()
        self.t.goto(-800 * s, -300 * s)
        self.t.pendown()
        self.t.write(f"{s2}", align="left", font=("arial", 10, "normal"))
        self.t.penup()
        self.t.goto(-750 * s, -400 * s)
        self.t.pendown()
        self.t.write(f"{s3}", align="left", font=("arial", 10, "normal"))
        self.w.exitonclick()

get_draw_KochSnow():

使用递归和turtle绘制

在这里插入图片描述

 def koch(self, length, n):
        # 长度 和 阶数
        if n == 0:
            self.t.fd(length)
        else:
            for i in [0, 60, -120, 60]:
                self.t.left(i)
                self.koch(length / 3, n - 1)

    def get_draw_KochSnow(self):
        """
        扩展
        这是一个科赫雪花的实例
        默认递归阶数已给
        可修改
        """
        self.__init__turtle(speed=30, screen_color="wheat")
        self.t.penup()
        self.t.pensize(2)
        self.t.goto(-200, 100)
        self.t.down()
        Leave = 8
        self.koch(400, Leave)
        self.t.right(120)
        self.koch(400, Leave)
        self.t.right(120)
        self.koch(400, Leave)
        self.t.right(120)
        self.w.exitonclick()

get_string_heart(string):

这个算是最简单的一个吧 ? 我是这样觉得的;

在这里插入图片描述
在这里插入图片描述

    def get_string_heart(self, string):
        """
        params: 输入你需要绘制的话 这个暂时只支持 英文字符串 不支持汉字
        return:  string heart
        """
        print('开始绘制(3s一个)'.center(60, '-'))
        for char in string.split():
            time.sleep(1.5)
            print('\n'.join([''.join([(char[(x - y) % len(char)] if self.get_math_fun(x, y) <= 0 else ' ') for x in range(-30, 30)]) for y in range(12, -12, -1)]))
            time.sleep(2)
            print()
            print('-' * 60)
            print()

后记:

还是那句话,喜欢就给个关注和赞吧! 算支持我!

猜你喜欢

转载自blog.csdn.net/qq_45906219/article/details/107021632