通過Python繪制中國結(jié)的示例代碼
1 中國結(jié)的組成部分
中國結(jié)是一種手工編織工藝品,它身上所顯示的情致與智慧正是漢族古老文明中的一個側(cè)面。因為其外觀對稱精致,可以代表漢族悠久的歷史,符合中國傳統(tǒng)裝飾的習俗和審美觀念,故命名為中國結(jié)。中國結(jié)代表著團結(jié)幸福平安,特別是在民間,它精致的做工深受大眾的喜愛。其主要組成部分如下圖所示。

2 設計中國結(jié)對象
基于Python Turtle庫實現(xiàn)繪制,首先設計一個中國結(jié)對象,畫筆顏色就選擇中國紅。再定義一個__goto()函數(shù)封裝turtle庫對畫筆移動的操作。
import turtle as t
class chineseKnot:
? '''
? * @breif: 中國結(jié)
? ''' ?
? def __init__(self) -> None:
? ? # 畫筆初始化
? ? self.t = t
? ? self.t.pensize(10)
? ? self.t.setup(700, 700)
? ? self.t.pencolor("red")
? ? self.t.speed(14)
? ? # 結(jié)心坐標
? ? self.x = 0
? ? self.y = 200
? ??
? '''
? * @breif: 畫筆移動到指定位置
? * @param[in]: x -> 畫筆移動位置橫坐標
? * @param[in]: y -> 畫筆移動位置縱坐標
? * @retval: None
? ''' ?
? def __goto(self, x: int, y: int) -> None:
? ? self.t.penup()
? ? self.t.goto(x,y)
? ? self.t.pendown()3 繪制結(jié)體
def drawBody(self) -> None:
for i in range(11):
self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
self.t.seth(-45)
self.t.fd(200)
self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
self.t.seth(-135)
self.t.fd(200)
4 繪制耳翼
def drawEdge(self) -> None: ? ? for i in range(4): ? ? ? # 左上角 ? ? ? self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2), ? ? ? ? ? ? ? ? ? 200 - 10 * sqrt(2) - i * 20 * sqrt(2)) ? ? ? self.t.seth(135) ? ? ? self.t.fd(20) ? ? ? self.t.circle(10, 180) ? ? ? self.t.fd(20) ? ? ? # 右上角 ? ? ? self.__goto(10 * sqrt(2) + i * 20 * sqrt(2), ? ? ? ? ? ? ? ? ? 200 - 10 * sqrt(2) - i * 20 * sqrt(2)) ? ? ? self.t.seth(45) ? ? ? self.t.fd(20) ? ? ? self.t.circle(-10, 180) ? ? ? self.t.fd(20) ? ? ? # 左下角 ? ? ? self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2), ? ? ? ? ? ? ? ? ? 200 - 190 * sqrt(2) + i * 20 * sqrt(2)) ? ? ? self.t.seth(-135) ? ? ? self.t.fd(20) ? ? ? self.t.circle(-10, 180) ? ? ? self.t.fd(20) ? ? ? ? ? ? ? # 右下角 ? ? ? self.__goto(10 * sqrt(2) + i * 20 * sqrt(2), ? ? ? ? ? ? ? ? ? 200 - 190 * sqrt(2) + i * 20 * sqrt(2)) ? ? ? self.t.seth(-45) ? ? ? self.t.fd(20) ? ? ? self.t.circle(10, 180) ? ? ? self.t.fd(20) ? ? # 左側(cè) ? ? self.t.seth(-45) ? ? self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2)) ? ? ? self.t.circle(20,270) ? ? self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2)) ? ? self.t.circle(-20,270) ? ?? ? ? # 右側(cè) ? ? self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2)) ? ? self.t.circle(40,270) ? ? self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2)) ? ? self.t.circle(-40,270)
5 繪制掛耳和流蘇
def drawAdorn(self): ? ? # 上側(cè) ? ? self.__goto(self.x, self.y) ? ? self.t.pensize(14) ? ? self.t.seth(90) ? ? self.t.fd(60) ? ? self.__goto(0,320) ? ? self.t.seth(180) ? ? self.t.circle(30,360) ? ? # 下側(cè) ? ? self.__goto(0,200 - 200 * sqrt(2)) ? ? self.t.pensize(40) ? ? self.t.seth(-90) ? ? self.t.fd(20) ? ? self.t.pensize(2) ? ? for i in range(11): ? ? ? ? self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2)) ? ? ? ? self.t.seth(-90) ? ? ? ? self.t.fd(200)
6 完整代碼,一鍵運行
import turtle as t
from math import sqrt
class chineseKnot:
? '''
? * @breif: 中國結(jié)
? ''' ?
? def __init__(self) -> None:
? ? # 畫筆初始化
? ? self.t = t
? ? self.t.pensize(10)
? ? self.t.setup(700, 700)
? ? self.t.pencolor("red")
? ? self.t.speed(14)
? ? # 結(jié)心坐標
? ? self.x = 0
? ? self.y = 200
? '''
? * @breif: 畫中國結(jié)
? * @param[in]: None
? * @retval: None
? '''
? def drawKnot(self) -> None:
? ? self.drawBody()
? ? self.drawEdge()
? ? self.drawAdorn()
? ? self.t.hideturtle()
? ? self.t.done()
? '''
? * @breif: 畫中國結(jié)主體部分
? * @param[in]: None
? * @retval: None
? '''
? def drawBody(self) -> None:
? ? for i in range(11):
? ? ? ? self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
? ? ? ? self.t.seth(-45)
? ? ? ? self.t.fd(200)
? ? ? ? self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
? ? ? ? self.t.seth(-135)
? ? ? ? self.t.fd(200)
? '''
? * @breif: 畫中國結(jié)邊緣部分
? * @param[in]: None
? * @retval: None
? ''' ? ? ??
? def drawEdge(self) -> None:
? ? for i in range(4):
? ? ? # 左上角
? ? ? self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
? ? ? ? ? ? ? ? ? 200 - 10 * sqrt(2) - i * 20 * sqrt(2))
? ? ? self.t.seth(135)
? ? ? self.t.fd(20)
? ? ? self.t.circle(10, 180)
? ? ? self.t.fd(20)
? ? ? # 右上角
? ? ? self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
? ? ? ? ? ? ? ? ? 200 - 10 * sqrt(2) - i * 20 * sqrt(2))
? ? ? self.t.seth(45)
? ? ? self.t.fd(20)
? ? ? self.t.circle(-10, 180)
? ? ? self.t.fd(20)
? ? ? # 左下角
? ? ? self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
? ? ? ? ? ? ? ? ? 200 - 190 * sqrt(2) + i * 20 * sqrt(2))
? ? ? self.t.seth(-135)
? ? ? self.t.fd(20)
? ? ? self.t.circle(-10, 180)
? ? ? self.t.fd(20)
? ? ? ?
? ? ? # 右下角
? ? ? self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
? ? ? ? ? ? ? ? ? 200 - 190 * sqrt(2) + i * 20 * sqrt(2))
? ? ? self.t.seth(-45)
? ? ? self.t.fd(20)
? ? ? self.t.circle(10, 180)
? ? ? self.t.fd(20)
? ? # 左側(cè)
? ? self.t.seth(-45)
? ? self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2)) ?
? ? self.t.circle(20,270)
? ? self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2))
? ? self.t.circle(-20,270)
? ??
? ? # 右側(cè)
? ? self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2))
? ? self.t.circle(40,270)
? ? self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2))
? ? self.t.circle(-40,270)
? '''
? * @breif: 畫中國結(jié)裝飾部分
? * @param[in]: None
? * @retval: None
? ''' ?
? def drawAdorn(self):
? ? # 上側(cè)
? ? self.__goto(self.x, self.y)
? ? self.t.pensize(14)
? ? self.t.seth(90)
? ? self.t.fd(60)
? ? self.__goto(0,320)
? ? self.t.seth(180)
? ? self.t.circle(30,360)
? ? # 下側(cè)
? ? self.__goto(0,200 - 200 * sqrt(2))
? ? self.t.pensize(40)
? ? self.t.seth(-90)
? ? self.t.fd(20)
? ? self.t.pensize(2)
? ? for i in range(11):
? ? ? ? self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2))
? ? ? ? self.t.seth(-90)
? ? ? ? self.t.fd(200)
? '''
? * @breif: 畫筆移動到指定位置
? * @param[in]: x -> 畫筆移動位置橫坐標
? * @param[in]: y -> 畫筆移動位置縱坐標
? * @retval: None
? ''' ?
? def __goto(self, x: int, y: int) -> None:
? ? self.t.penup()
? ? self.t.goto(x,y)
? ? self.t.pendown()
? ? ? ??
if __name__ == '__main__':
? knot = chineseKnot()
? knot.drawKnot()到此這篇關于通過Python繪制中國結(jié)的示例代碼的文章就介紹到這了,更多相關Python繪制中國結(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python判斷文件夾內(nèi)是否存在指定后綴文件的實例
今天小編就為大家分享一篇python判斷文件夾內(nèi)是否存在指定后綴文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
pycharm中下載的包但是import還是無法使用/報紅的解決方法
用pycharm開發(fā)時,在導入自己寫的python文件時出現(xiàn)模塊名爆紅的情況,下面這篇文章主要給大家介紹了關于pycharm中下載包但是import還是無法使用/報紅的解決方法,需要的朋友可以參考下2023-02-02
Python面向?qū)ο缶幊讨庋b的藝術(shù)你了解嗎
這篇文章主要為大家詳細介紹了Python面向?qū)ο缶幊讨庋b的藝術(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02

