通过Python绘制中国结的示例代码

 更新时间:2022年01月20日 09:44:35   作者:FrigidWinter  
再过不久就要到新年了,所以这篇文章将为大家介绍一下如何通过Python代码绘制一个中国结,文中的示例代码讲解详细,感兴趣的可以动手试一试

1 中国结的组成部分

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

2 设计中国结对象

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

3 绘制结体

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)

    # 左侧
    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)

5 绘制挂耳和流苏

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)

6 完整代码,一键运行

import turtle as t
from 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()

到此这篇关于通过Python绘制中国结的示例代码的文章就介绍到这了,更多相关Python绘制中国结内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • echarts动态获取Django数据的实现示例

    echarts动态获取Django数据的实现示例

    本文主要介绍了echarts动态获取Django数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • python基础学习之如何对元组各个元素进行命名详解

    python基础学习之如何对元组各个元素进行命名详解

    python的元祖和列表类似,不同之处在于元祖的元素不能修改,下面这篇文章主要给大家介绍了关于python基础学习之如何对元组各个元素进行命名的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • Python pickle模块常用方法代码实例

    Python pickle模块常用方法代码实例

    这篇文章主要介绍了Python pickle模块常用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Python datetime模块的使用示例

    Python datetime模块的使用示例

    这篇文章主要介绍了Python datetime模块的使用示例,帮助大家更好的理解和使用python处理时间,感兴趣的朋友可以了解下
    2021-02-02
  • Python爬虫之Selenium中frame/iframe表单嵌套页面

    Python爬虫之Selenium中frame/iframe表单嵌套页面

    这篇文章主要介绍了Python爬虫之Selenium中frame/iframe表单嵌套页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python标准库之多进程(multiprocessing包)介绍

    Python标准库之多进程(multiprocessing包)介绍

    这篇文章主要介绍了Python标准库之多进程(multiprocessing包)介绍,本文讲解了进程池、共享资源、共享内存、Manager等内容,需要的朋友可以参考下
    2014-11-11
  • 浅谈Python中的数据类型

    浅谈Python中的数据类型

    Python很重要的的那几个数据类型:字符串,列表,字典,元组,经常有网友问他们之间重要的区别的是什么?能否举几个例子来说明下!下嘛我们就来探讨下。
    2015-05-05
  • Django Paginator分页器的使用示例

    Django Paginator分页器的使用示例

    django内置的分页器组件,能够帮我们实现对查询的数据进行自动分页,并返回分页对象,本文讲解分页器的用法
    2021-06-06
  • python使用matplotlib画柱状图、散点图

    python使用matplotlib画柱状图、散点图

    这篇文章主要为大家详细介绍了python使用matplotlib画柱状图、散点图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Python实现PDF页面的删除与添加功能

    Python实现PDF页面的删除与添加功能

    在处理PDF文档的过程中,我们时常会需要对PDF文档中的页面进行编辑操作的情况,如插入和删除页面,通过添加和删除PDF页面,我们可以增加内容或对不需要的内容进行删除,本文将介绍如何使用Python代码实现在PDF文档中添加和删除页面
    2024-04-04

最新评论