通过Python绘制中国结的示例代码
作者:FrigidWinter 发布时间:2021-05-29 15:15:21
标签: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()
来源:https://blog.csdn.net/FRIGIDWINTER/article/details/122384902
0
投稿
猜你喜欢
- 要想成功的进行字符串的匹配需要使用到正则表达式模块,正则表达式匹配规则以及需要被匹配的字符串。在这三个条件中,模块与字符串都是准备好的,只有
- Mysql中Regexp常见用法模糊匹配,包含特定字符串# 查找content字段中包含“车友俱乐部”的记录select * from cl
- 细节汇总函数的形参列表可以是多个,返回值列表也可以是多个形参列表和返回值列表的数据类型,可以是值类型、也可以是引用类型函数的命名遵循标识符命
- 测试把txt文件导入至mysql数据库中: table: txt文件:D:/data.txt (txt文件下载)txt中使用 '\N
- 写在前面python-docx 不支持 doc 文档,一定要注意该点,如果使用 doc 文档,需要提前将其用 Word 相关软件转换为 do
- 前言在浏览博客时,偶然看到了用python将汉字转为拼音的第三方包,但是在实现的过程中发现一些参数已经更新,现在将两种方法记录一下。xpin
- 最近学习了python基础,写一下3大排序练练手:'''Created on 2013-8-23@author: c
- mysql> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) – TO_DAY
- 在一次ASP程序中不能正常连接MSSQL出现出错信息如下:以下为引用的内容:HTTP/1.1 200 OK S
- 百度文库分享平台大家都知道,今天小编通过一段实例代码给大家介绍基于js实现百度文库评分功能,先给大家展示效果图吧。具体代码如下所示:<
- 一、简介Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同
- 目录一.简介二.特色三.flask规模化四. flask Blueprint总结一.简介Flask是一个使用Python编写的轻量级Web应
- 题目:求一个3*3矩阵对角线元素之和。程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。 def two_dime
- 问题近日在做一组声纹聚类时,使用了另一团队同学开发的声纹距离算法。该算法对外提供的是一组so包,需要使用方自己去使用。在python中调用纯
- DQL(Data Query Language),数据查询语言,主要是用来查询数据的,这也是SQL中最重要的部分!简单查询#DQL操作之基本
- 基本模块 python爬虫,web spider。爬取网站获取网页数据,并进行分析提取。基本模块使用的是 urllib,urlli
- 做一个简单的小实例:目录结构如下:demo1.pyclass MyClass():def __init__(self,x,y):  
- 在服务器上,通常为了快速登录数据库,我们会使用mysql -hhost -uusername -ppassword db的方式登录数据库,如
- 代码如下:function checkip(checkstring)'用正则判断IP是否合法 dim re1 set re1=new
- 前言pymssql模块是用于sql server数据库(一种数据库通用接口标准)的连接。另外pyodbc不仅限于SQL server,还包括