用Python Turtle画一个中国结

news2025/1/15 6:39:20

 中国结,作为中华民族传统文化的象征之一,以其独特的编织技艺和深厚的文化内涵,深受人们喜爱。今天,我们就来用Python的turtle模块,尝试绘制一个充满韵味的中国结。

    我们先来看看整个中国结生成的过程:

中国节

首先,我们需要了解turtle模块。turtle是Python中一个非常有趣的绘图库,它使用一个小海龟在屏幕上爬行来绘制图形。通过控制海龟的速度、方向、颜色等属性,我们可以绘制出各种复杂的图案。

(1)首先,我们需要导入turtle模块,并设置窗口大小,颜色,画笔粗细,等参数

import turtle

# 初始化海龟屏幕大小,颜色,速度等参数
turtle.setup(800, 800)
turtle.pensize(10)
turtle.pencolor("red")
turtle.speed(14)

# 主函数
def main():
    turtle.penup()  # 提起画笔,移动不留痕迹
    turtle.pendown()  # 放下画笔,移动留下痕迹
    draw_knot()  # 自定义方法--调用绘制中国结的函数
    turtle.hideturtle()  # 隐藏海龟图标
    turtle.done()  # 结束绘制,等待用户关闭窗口

# 绘制中国结的函数
def draw_knot():
    print('--这里是画中国结的主函数')

if __name__ == "__main__":
    main()

 运行效果:可以看到,我们生成了一个800 x 800的正方形框,我们将在正方形框中画我们的中国结

2)我们开始画中国结


# 绘制中国结的总函数
def draw_knot():
    jiexin()  # 画中国结的结心(一共画22条斜线)
    jiexiaoban()  # 画中国结四个边上的边
    waiyuan()  # 画中国结两边的圆
    shengzi()  # 画中国结上面的绳子
    hanzi()  # 在中国结的最上方写下"我的中国梦"
    
# 画中国结的结心(一共画22条斜线)
def jiexin():
    m, n = 0, 200
    # 从 0-11(不包含11)也就是11条线
    for i in range(11):
        goto(m, n)
        turtle.seth(-45)
        turtle.fd(200)
        m -= 20 / pow(2, 0.5)
        n -= 20 / pow(2, 0.5)
    # 反向正画11条线
    m, n = 0, 200
    for j in range(11):
        goto(m, n)
        turtle.seth(-135)
        turtle.fd(200)
        m += 20 / pow(2, 0.5)
        n -= 20 / pow(2, 0.5)


# 画中国结四个边上的边
def jiexiaoban():
    m = -20 / pow(2, 0.5)
    n = 200 - 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(135)
        turtle.fd(20)
        turtle.circle(10, 180)
        turtle.fd(20)
        m -= 40 / pow(2, 0.5)
        n -= 40 / pow(2, 0.5)

    m = 20 / pow(2, 0.5)
    n = 200 - 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(45)
        turtle.fd(20)
        turtle.circle(-10, 180)
        turtle.fd(20)
        m += 40 / pow(2, 0.5)
        n -= 40 / pow(2, 0.5)

    m = 20 / pow(2, 0.5)
    n = 200 - 200 * pow(2, 0.5) + 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(-45)
        turtle.fd(20)
        turtle.circle(10, 180)
        turtle.fd(20)
        m += 40 / pow(2, 0.5)
        n += 40 / pow(2, 0.5)

    m = -20 / pow(2, 0.5)
    n = 200 - 200 * pow(2, 0.5) + 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(-135)
        turtle.fd(20)
        turtle.circle(-10, 180)
        turtle.fd(20)
        m -= 40 / pow(2, 0.5)
        n += 40 / pow(2, 0.5)


# 画中国结两边的圆
def waiyuan():
    goto(90 * pow(2, 0.5), 200 - 110 * pow(2, 0.5))
    turtle.seth(-45)
    turtle.circle(20, 270)

    goto(-90 * pow(2, 0.5), 200 - 110 * pow(2, 0.5))
    turtle.seth(-135)
    turtle.circle(-20, 270)

    goto(80 * pow(2, 0.5), 200 - 120 * pow(2, 0.5))
    turtle.seth(-45)
    turtle.circle(40, 270)

    goto(-80 * pow(2, 0.5), 200 - 120 * pow(2, 0.5))
    turtle.seth(-135)
    turtle.circle(-40, 270)


# 画中国结上面的绳子
def shengzi():
    goto(0, 200)
    turtle.pensize(20)
    turtle.seth(90)
    turtle.fd(60)
    goto(0, 320)
    turtle.pensize(12)
    turtle.seth(180)
    turtle.circle(30, 360)

    goto(0, 200 - 200 * pow(2, 0.5))
    turtle.pensize(40)
    turtle.seth(-90)
    turtle.fd(20)
    turtle.pensize(2)
    s = -20
    for i in range(11):
        goto(s, 200 - 200 * pow(2, 0.5))
        turtle.seth(-90)
        turtle.fd(200)
        s += 4


# 在中国结的最上方写下"我的中国梦"
def hanzi():
    goto(-100, 325)
    turtle.write("我的中国梦", font=("Arial", 40, "normal"))

运行代码后,你将看到一个红色的中国结在屏幕上慢慢绘制出来。你可以调整turtle模块的各种参数,如速度、颜色、线条粗细等,来优化你的作品。来一起看看效果图吧   

整个项目的完整代码(如果第一行报错,说明没有安装turtle模块, 我们使用命令

pip install turtle 来安装模块即可)


import turtle

# 初始化海龟屏幕大小,颜色,速度等参数
turtle.setup(800, 800)
turtle.pensize(10)
turtle.pencolor("red")
turtle.speed(14)


# 主函数
def main():
    turtle.penup()  # 提起画笔,移动不留痕迹
    turtle.pendown()  # 放下画笔,移动留下痕迹
    draw_knot()  # 自定义方法--调用绘制中国结的函数
    turtle.hideturtle()  # 隐藏海龟图标
    turtle.done()  # 结束绘制,等待用户关闭窗口


# 绘制中国结的函数
def draw_knot():
    jiexin()  # 画中国结的结心(一共画22条斜线)
    jiexiaoban()  # 画中国结四个边上的边
    waiyuan()  # 画中国结两边的圆
    shengzi()  # 画中国结上面的绳子
    hanzi()  # 在中国结的最上方写下"我的中国梦"


# 将海龟移动到指定位置开始绘制
def goto(x, y):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()


# 画中国结的结心(一共画22条斜线)
def jiexin():
    m, n = 0, 200
    # 从 0-11(不包含11)也就是11条线
    for i in range(11):
        goto(m, n)
        turtle.seth(-45)
        turtle.fd(200)
        m -= 20 / pow(2, 0.5)
        n -= 20 / pow(2, 0.5)
    # 反向正画11条线
    m, n = 0, 200
    for j in range(11):
        goto(m, n)
        turtle.seth(-135)
        turtle.fd(200)
        m += 20 / pow(2, 0.5)
        n -= 20 / pow(2, 0.5)


# 画中国结四个边上的边
def jiexiaoban():
    m = -20 / pow(2, 0.5)
    n = 200 - 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(135)
        turtle.fd(20)
        turtle.circle(10, 180)
        turtle.fd(20)
        m -= 40 / pow(2, 0.5)
        n -= 40 / pow(2, 0.5)

    m = 20 / pow(2, 0.5)
    n = 200 - 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(45)
        turtle.fd(20)
        turtle.circle(-10, 180)
        turtle.fd(20)
        m += 40 / pow(2, 0.5)
        n -= 40 / pow(2, 0.5)

    m = 20 / pow(2, 0.5)
    n = 200 - 200 * pow(2, 0.5) + 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(-45)
        turtle.fd(20)
        turtle.circle(10, 180)
        turtle.fd(20)
        m += 40 / pow(2, 0.5)
        n += 40 / pow(2, 0.5)

    m = -20 / pow(2, 0.5)
    n = 200 - 200 * pow(2, 0.5) + 20 / pow(2, 0.5)
    for k in range(4):
        goto(m, n)
        turtle.seth(-135)
        turtle.fd(20)
        turtle.circle(-10, 180)
        turtle.fd(20)
        m -= 40 / pow(2, 0.5)
        n += 40 / pow(2, 0.5)


# 画中国结两边的圆
def waiyuan():
    goto(90 * pow(2, 0.5), 200 - 110 * pow(2, 0.5))
    turtle.seth(-45)
    turtle.circle(20, 270)

    goto(-90 * pow(2, 0.5), 200 - 110 * pow(2, 0.5))
    turtle.seth(-135)
    turtle.circle(-20, 270)

    goto(80 * pow(2, 0.5), 200 - 120 * pow(2, 0.5))
    turtle.seth(-45)
    turtle.circle(40, 270)

    goto(-80 * pow(2, 0.5), 200 - 120 * pow(2, 0.5))
    turtle.seth(-135)
    turtle.circle(-40, 270)


# 画中国结上面的绳子
def shengzi():
    goto(0, 200)
    turtle.pensize(20)
    turtle.seth(90)
    turtle.fd(60)
    goto(0, 320)
    turtle.pensize(12)
    turtle.seth(180)
    turtle.circle(30, 360)

    goto(0, 200 - 200 * pow(2, 0.5))
    turtle.pensize(40)
    turtle.seth(-90)
    turtle.fd(20)
    turtle.pensize(2)
    s = -20
    for i in range(11):
        goto(s, 200 - 200 * pow(2, 0.5))
        turtle.seth(-90)
        turtle.fd(200)
        s += 4


# 在中国结的最上方写下"我的中国梦"
def hanzi():
    goto(-100, 325)
    turtle.write("我的中国梦", font=("Arial", 40, "normal"))


if __name__ == "__main__":
    main()

 通过用Python的turtle模块绘制中国结,我们不仅可以锻炼编程能力,还可以更深入地了解中华民族传统文化的魅力。希望这篇文章能给你带来一些启发和乐趣!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 | 准确率、召回率、精准率、特异度傻傻分不清?ROC曲线怎么看?一篇文章帮你搞定

一、真正类、假负类、假正类与真负类 二、准确率、召回率、精准率、特异度与假正率 1. 准确率 (Accuracy) 准确率表明成功预测(预测为负或为正)的结果占总样本的百分比。 准确率 , 2. 召回率/查全率/灵敏度/真正率(Recall&a…

C语言进阶|双链表

✈链表的分类 链表的结构非常多样,以下情况组合起来就有8种(2x22)链表结构: 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:单链表和双向带头循环链表 1.无头单向非循环链表:结构简单&…

springboot基于SpringBoot的网上订餐系统开题报告+1w字文档+ppt

项目演示视频: 【源码免费送】基于SpringBoot的网上订餐系统录像 摘 要 随着我国经济的飞速发展,人们的生活速度明显加快,在餐厅吃饭排队的情况到处可见,近年来由于新兴IT行业的空前发展,它与传统餐饮行业也进行了新旧的结合&…

实验八智能手机互联网程序设计(微信程序方向)实验报告

请在上一次实验的基础之上完成“手机快速注册”页面、“企业用户注册”页面,并实现点击手机快速注册和企业用户注册后转跳至该页面在“手机快速注册”页面,输入框内输入内容并失去焦点后,下方的按钮会变化 在企业用户注册页面,用户…

Anomalib:用于异常检测的深度学习库!

大家好,今天给大家介绍了一个用于无监督异常检测和定位的新型库:anomalib,Github链接:https://github.com/openvinotoolkit/anomalib 简介 考虑到可重复性和模块化,这个开源库提供了文献中的算法和一组工具,以通过即插即用的方法设计自定义异常检测算法。 Anomalib 包…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1)

从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1) 一、Hystrix:基于 RestTemplate 的熔断配置 1、Hystrix 介绍: 1)Hystrix 是由 Netflix 开源的一个延迟和容错库, 用于隔离访…

Web3的可持续性:构建环境友好的去中心化系统

引言 随着全球对可持续发展和环境问题的日益关注,Web3技术作为一种新型的互联网模式,也开始受到社区和开发者的关注。但很少有人关注到Web3对环境可持续性的潜在影响。本文将探讨Web3如何构建一个环境友好的去中心化系统,以及这如何促进一个…

Shopee怎么选品成功率高达80%?请学

电商圈内流传着一句话:三分靠运营,七分靠选品。 选品在电商项目中至关重要,也是一个非常考验技巧和经验的环节。选品选择得好,后续的每一步都会变得相对轻松。 那么要怎么在众多商品中脱颖而出,提高在Shopee平台上选…

第三节课,功能2:开发后端用户的管理接口5min(用户的查询/状态更改)【4】【9开始--本人】

一、代码任务 【录个屏】 二、写代码 2.1 代码文件位置 2.2 代码如下: 2.3 官方文档: 网址: 逻辑删除 | MyBatis-Plus (baomidou.com) 三、代码有bug,没有鉴权,表里添加一个字段。role 管理员 3.1 判断操作的人&am…

了解 Postman:这个 API 工具的功能和用途是什么?

在软件开发中,经常听到 Postman 这个软件名。但其实很多新手开发者只知道这是软件开发常用的软件,并不知道实际是一个什么样工具,不知道具体的作用是什么。那今天就跟大家好好唠唠 Postman 这个软件。想要学习更多关于 Postman 的知识&#x…

call、apply、bind能用来干点啥(接上文)

上文我们了解了call、apply、bind的使用规则,学以致用,我们要在平时的搬砖中怎么使用呢? 其实好些人平时也用不到这三货,但是在框架底层,这三货可是经常被用到的啊,现在我们来了解了解吧 1、处理伪数组 假使,在html页面中有多个名为“c-container”的容器,现在我们来获取他…

[机缘参悟-166] :周期论:万物的周期现象是这个世界有序性和稳定性保障;超越周期:在轮回中,把握周期节奏。

目录 前言:超越周期 一、周期是大自然和宇宙的规律,是天道 1.1 概述 1.2 万物的周期规律的现象 1.3 电磁波的周期 二、计算机世界中的周期性 三、佛家的生命轮回规律 四、人类社会发展的周期规律 五、经济活动的周期规律 5.1 概述 5.2 股市的…

分享一个网站实现永久免费HTTPS访问的方法

免费SSL证书作为一种基础的网络安全工具,以其零成本的优势吸引了不少网站管理员的青睐。要实现免费HTTPS访问,您可以按照以下步骤操作: 一、 选择免费SSL证书提供商 选择一个提供免费SSL证书的服务商。如JoySSL,他们是国内为数不…

ArgoCD集成部署到Kubernetes

1:环境 kubernetes1.23.3ArgoCD2.3.3 2:ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么,什么是GitOps呢? GitOps是以Git为基…

ROS 2边学边练(36)-- 添加一个坐标系(C++)

前言 此篇将会在之前已存在的几个坐标系(/world、/turtle1、/turtle2)的基础上再增加一个坐标系,相对来说,难度不大,主要是理解一些概念(脑子里面有3D场景的想象),比如一个小车机器人处在世界坐标系&#x…

春秋云镜 CVE-2023-50563

靶标介绍: SEMCMS是一套支持多种语言的外贸网站内容管理系统(CMS)。SEMCMS v4.8版本存在SQLI,该漏洞源于SEMCMS_Function.php 中的 AID 参数包含 SQL 注入 开启靶场: 开始实验: 1、使用后台扫描工具&…

QT学习之QtXlsx

背景: 本来我是想提取xml中的信息存在xlsx文件中的,网上很多说是使用QtXlsx; 于是我找了一些帖, 像:https://www.cnblogs.com/liming19680104/p/14398459.html; 大家的说法都是安装第三方库到QT中&#xff…

社交媒体数据恢复:Skype国内、际版

恢复已删除的Skype聊天记录可能需要一些操作,但请注意,这不一定总是可行的,并且可能需要一些技术知识。以下是一些步骤,您可以尝试恢复您的Skype聊天记录: 1. 检查备份: - 如果您有Skype备份&#xff0…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义:又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样我们就可以在需要的时候将该对…

软件测试的内容包含什么内容

软件测试的内容涵盖了多个方面,以确保软件的质量和性能达到既定的标准。这些内容包括但不限于以下几点: 注册信息验证:对软件产品的基本信息进行验证,如软件名称、版本号、开发者等,确保这些信息的准确性和一致性。功…