一年多的python學習,繪製的圖形有點多,於是寫成一個類函數,已經開源到GitHub中, 完全免費,喜歡的就點個關注和贊吧!
本來最開始就是想總結一下,繪製愛心的各種方式,後來,有點剎不住了,就擴展了我自己畫的其他圖形,添加上去,讓這個項目更加完美一點。上面自己用ps摳出來的,不是很好看,別介意!
Mydraw開源項目:
項目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()
後記:
還是那句話,喜歡就給個關注和贊吧! 算支持我!