脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 通过Python绘制中国结的示例代码

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

2022-08-27 10:46FrigidWinter Python

再过不久就要到新年了,所以这篇文章将为大家介绍一下如何通过Python代码绘制一个中国结,文中的示例代码讲解详细,感兴趣的可以动手试一试

1 中国结的组成部分

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

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

2 设计中国结对象

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 绘制结体

?
1
2
3
4
5
6
7
8
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 绘制耳翼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 绘制挂耳和流苏

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 完整代码,一键运行

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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绘制中国结内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/FRIGIDWINTER/article/details/122384902

延伸 · 阅读

精彩推荐
  • Python用Python构建API的八大流行框架

    用Python构建API的八大流行框架

    本文将和您讨论八种可将API的开发过程变得简单且快捷的Python框架。其中,Hug和Eve等框架更适合于小型项目,而Django、Flask和Falcon则适合于大型的应用程序...

    运维派8852021-12-07
  • PythonPython 调用API发送邮件

    Python 调用API发送邮件

    这篇文章主要介绍了Python 调用API发送邮件的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    honeymoose5212021-09-28
  • Python详解Selenium 元素定位和WebDriver常用方法

    详解Selenium 元素定位和WebDriver常用方法

    这篇文章主要介绍了详解Selenium 元素定位和WebDriver常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    程序猿杂记11402021-08-08
  • PythonPython实现提取XML内容并保存到Excel中的方法

    Python实现提取XML内容并保存到Excel中的方法

    这篇文章主要介绍了Python实现提取XML内容并保存到Excel中的方法,涉及Python针对xml文件的读取、解析以及Excel文件的写入、保存等相关操作技巧,需要的朋友可...

    每天19907372021-03-31
  • PythonPython3+selenium配置常见报错解决方案

    Python3+selenium配置常见报错解决方案

    这篇文章主要介绍了Python3+selenium配置常见报错解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    罗维翩6372020-08-28
  • Python瞧瞧,这样的代码才叫 Pythonic

    瞧瞧,这样的代码才叫 Pythonic

    要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些大牛代码,这里明哥收集了一些比较常见的 Pythonic 写法,帮助你养成写优秀代码的习惯...

    Python编程时光4372020-10-27
  • Python在Python 不同级目录之间模块的调用方法

    在Python 不同级目录之间模块的调用方法

    今天小编就为大家分享一篇在Python 不同级目录之间模块的调用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    沙漠中的雨滴7392021-05-18
  • Python浅析Python 实现一个自动化翻译和替换的工具

    浅析Python 实现一个自动化翻译和替换的工具

    这篇文章主要介绍了Python 实现一个自动化翻译和替换的工具,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    学好Python吧4412021-06-15