• 元宇宙:本站分享元宇宙相关资讯,资讯仅代表作者观点与平台立场无关,仅供参考.

新年快到了,让我们一起用 Python 编织中国结吧

  • AI科技大本营
  • 2022年1月27日03时

作者 |FrigidWinter

来源 | CSDN博客

新年快到了,今天博主教大家用Python编织中国结~

中国结的组成部分

中国结是一种手工编织工艺品,它身上所显示的情致与智慧正是汉族古老文明中的一个侧面。因为其外观对称精致,可以代表汉族悠久的历史,符合中国传统装饰的习俗和审美观念,故命名为中国结。中国结代表着团结幸福平安,特别是在民间,它精致的做工深受大众的喜爱。其主要组成部分如下图所示。

设计中国结对象

基于Python Turtle库实现绘制,首先设计一个中国结对象,画笔颜色就选择中国红。再定义一个__goto()函数封装turtle库对画笔移动的操作。

import turtle as t
class chineseKnot: ''' * @breif: 中国结 ''' def __init__(self) -> None: # 画笔初始化 self.t = t self.t.pensize(10) self.t.setup(700, 700) self.t.pencolor("red") self.t.speed(14) # 结心坐标 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()

绘制结体

  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 sqrt
class chineseKnot: ''' * @breif: 中国结 ''' def __init__(self) -> None: # 画笔初始化 self.t = t self.t.pensize(10) self.t.setup(700, 700) self.t.pencolor("red") self.t.speed(14) # 结心坐标 self.x = 0 self.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()

技术

100行python代码制作鞭炮

资讯

大型模型语言能够理解吗?

技术

创意十足的Python命令行工具

资讯

游戏圈地震级消息,微软收购动视暴雪


分享

点收藏

点点赞

点在看

Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM