作者 |FrigidWinter
来源 | CSDN博客
新年快到了,今天博主教大家用Python编织中国结~
中国结的组成部分
中国结是一种手工编织工艺品,它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致,可以代表汉族悠久的历史,符合中国传统装饰的习俗和审美观念,故命名为中国结。中国结代表着团结幸福平安,特别是在民间,它精致的做工深受大众的喜爱。其主要组成部分如下图所示。
设计中国结对象
基于Python Turtle库实现绘制,首先设计一个中国结对象,画笔颜色就选择中国红。再定义一个__goto()函数封装turtle库对画笔移动的操作。
import turtle as tclass chineseKnot:'''* @breif: 中国结'''def __init__(self) -> None:# 画笔初始化self.t = tself.t.pensize(10)self.t.setup(700, 700)self.t.pencolor("red")self.t.speed(14)# 结心坐标self.x = 0self.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()
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)
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)# 左侧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)# 右侧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)
def drawAdorn(self):# 上侧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)# 下侧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)
import turtle as tfrom math import sqrtclass chineseKnot:'''* @breif: 中国结'''def __init__(self) -> None:# 画笔初始化self.t = tself.t.pensize(10)self.t.setup(700, 700)self.t.pencolor("red")self.t.speed(14)# 结心坐标self.x = 0self.y = 200'''* @breif: 画中国结* @param[in]: None* @retval: None'''def drawKnot(self) -> None:self.drawBody()self.drawEdge()self.drawAdorn()self.t.hideturtle()self.t.done()'''* @breif: 画中国结主体部分* @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: 画中国结边缘部分* @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)# 左侧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)# 右侧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: 画中国结装饰部分* @param[in]: None* @retval: None'''def drawAdorn(self):# 上侧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)# 下侧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()
分享
点收藏
点点赞
点在看
文章转发自AI科技大本营微信公众号,版权归其所有。文章内容不代表本站立场和任何投资暗示。
Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM