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()

後記:

還是那句話,喜歡就給個關注和贊吧! 算支持我!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章