Python绘制太极八卦

news2024/11/26 23:54:56

八卦图

文章目录

  • 系列目录
  • 写在前面
  • 技术需求
    • 1. 图形绘制库的支持
    • 2. 图形绘制功能
    • 3. 参数化设计
    • 4. 绘制控制
    • 5. 数据处理
    • 6. 用户界面
  • 完整代码
  • 代码分析
    • 1. `rset()` 函数
    • 2. `offset()` 函数
    • 3. `taiji()` 函数
    • 4. `bagua()` 函数
    • 5. 绘制过程
    • 6. 技术亮点
  • 写在后面

系列目录

序号直达链接
爱心系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

写在前面

Python绘制一张太极八卦图的完整代码。

技术需求

1. 图形绘制库的支持

  • Turtle图形库:使用Python的turtle库来实现图形的绘制。该库提供了基本的绘图功能,如移动画笔、改变方向、绘制直线和曲线、填充颜色等。

2. 图形绘制功能

  • 太极图绘制

    • 初始化:复位画笔位置和状态。
    • 偏移定位:将画笔移动到太极图的起始位置。
    • 绘制轮廓:绘制太极图的大圆和S形曲线。
    • 填充颜色:分别填充黑白两色区域。
    • 绘制阴阳眼:在太极图中心绘制两个小圆,代表阴阳鱼的眼睛。
  • 八卦图绘制

    • 初始化:复位画笔位置和状态。
    • 偏移定位:根据八卦图的排列方式,将画笔移动到每个卦象的起始位置。
    • 绘制卦象:根据给定的卦象数据(阳爻和阴爻),绘制相应的线条。
    • 添加文字:在适当的卦象位置添加卦名。

3. 参数化设计

  • 太极图参数

    • 半径:太极图大圆的半径。
    • 线条粗细:太极图线条的粗细。
    • 颜色:太极图的颜色。
  • 八卦图参数

    • 偏移量:八卦图相对于中心点的偏移量。
    • 线段长度:每个卦象的线段长度。
    • 卦象数据:包含八卦图中每个卦象的符号信息(阳爻、阴爻和卦名)。

4. 绘制控制

  • 窗口设置:设置绘图窗口的标题和大小。
  • 动画控制:关闭动画追踪,提高绘制速度。
  • 隐藏画笔:绘制完成后隐藏画笔光标,展示最终的图形。

5. 数据处理

  • 卦象数据:定义一个列表gua_lis,包含每个卦象的符号信息(阳爻、阴爻和卦名)。
  • 遍历和条件判断:根据卦象数据中的信息,动态绘制相应的图形和文字。

6. 用户界面

  • 窗口管理:创建一个绘图窗口,并设置窗口的标题和大小。
  • 显示结果:绘制完成后,保持窗口打开,展示最终的太极八卦图。

完整代码

from turtle import *
# 返回原点
def rset():
    pensize(1)
    pencolor('black')
    penup()
    home()
    pendown()
# 设置画笔偏移,初始化八卦和太极的画笔起始点,保持整体居中
def offset(off_set, angle=0, mode='taiji'):
    # off_set太极时为大圆半径,八卦时要大于半径,否则会与太极重合。
    # angle默认为0,mode默认为‘taiji’,画太极的时候,不需要设置,默认即可;画卦的时候angle=angl,mode=‘bagua’。
    penup()
    home()  # 回到原点,朝向东
    if mode == 'taiji':  # 太极
        right(90)
        fd(off_set)
        seth(0)  # 朝向东
    else:  # 八卦
        left(angle)  # 每画一卦旋转45度的倍数,开始下一卦。
        fd(off_set)
        left(90)
    pendown()
# 太极生成
def taiji(radius, pen_size=2, color='black'):
    rset()  # 初始化画笔
    pensize(pen_size)
    pencolor(color)
    offset(radius)  # 画笔偏移至起始点
    fillcolor('black')  # 填充颜色
    begin_fill()  # 开始填充
    circle(radius, 180)  # 画大圆的半圆
    circle(radius / 2, 180)  # 画s型
    circle(-radius / 2, 180)  # 画s型
    end_fill()  # 结束填充
    circle(-radius, 180)  # 画大圆的另一半圆
    # 上面小圆
    begin_fill()
    fillcolor('white')
    penup()
    home()  # 返回原点,默认朝东
    left(90)
    fd(radius * 0.7)  # 初始化小圆画笔起始点
    right(90)
    pendown()
    circle(-radius * 0.2)  # 画小圆
    end_fill()
    rset()
    # 下面小圆
    penup()
    begin_fill()
    fillcolor('black')
    right(90)
    fd(radius * 0.7)
    left(90)
    pendown()
    circle(radius * 0.2)
    end_fill()
# 八卦生成
def bagua(off_set, side, gua_lis):
    pensize(side / 2)
    for j, k in enumerate(gua_lis):  # 枚举八卦列表,获取元素和下标,下标拿来判断旋转多少度
        angl = j * 45  # 偏移角度:0,45,90,135,180,225,270,315,360
        rset()  # 初始化到原点
        offset(off_set, angle=angl, mode='bagua')  # 偏移到八卦画笔,此时画笔位于线段中间点,下面3行代码初始到线段开头
        pencolor('white')
        pensize(5)
        bk(side / 2)
        for i in k:  # 遍历每一卦的集合,1为阳也就是完整线段,0为阴,带断点的线段
            pencolor('black')
            if i == 1:
                fd(side)
            elif i == 0:
                fd(side * (1 / 3))
                penup()
                fd(side * (1 / 3))
                pendown()
                fd(side * (1 / 3))
            elif isinstance(i, str) and j <= 4:  # 判断集合内内容,为字符串时,且为前5卦时,直接用write方法打印
                penup()
                fd(side / 2)
                pendown()
                write(i, align='center', font=('楷体', 15, "bold"))  # align有三个选项:’left‘,’center‘,’right‘,i后面两项可不填
            else:  # 后3卦,多偏移了一些距离,再用write方法打印,避免文字与卦重叠,影响效果
                penup()
                fd(side / 2)
                right(90)
                fd(15)
                pendown()
                write(i, align='center', font=('楷体', 15, "bold"))
            penup()  # 每画完一卦中的一条线后,回到中点,向外移动后,开始画下一段线段
            bk(side / 2)
            right(90)
            fd(side / 2)
            left(90)
            bk(side / 2)
            pendown()
gua_lis = [(1, 1, 0, '兑'), (0, 0, 0, '坤'), (1, 0, 1, '离'), (0, 1, 1, '巽'), (1, 0, 0, '震'), (0, 0, 1, '艮'),
           (0, 1, 0, '坎'), (1, 1, 1, '乾')]
title('太极八卦图')
setup(0.5, 0.5)
tracer(0)
taiji(50)
bagua(70, 30, gua_lis)
hideturtle()
done()

代码分析

这段代码使用Python的turtle图形库来绘制太极八卦图。在深入分析之前,我们需要理解turtle库的基本概念:它是一个用于绘制二维图形的简单工具,通过控制一个虚拟的“海龟”在屏幕上移动来完成绘图任务。海龟的位置、方向和状态(如是否落笔)可以通过编程指令进行控制。

1. rset() 函数

这个函数用于将画笔(即“海龟”)复位到屏幕中央,并设置一些默认属性,比如线条粗细和颜色。这是为了确保每次绘制新的元素时都能从一个标准的位置和状态开始,保证绘图的一致性和准确性。

2. offset() 函数

此函数的作用是将画笔移动到绘制太极图或八卦图所需的起始位置。它接受三个参数:偏移量(off_set)、偏移角度(angle,默认值为0)和模式(mode,默认值为’taiji’)。对于太极图来说,它将画笔垂直向下移动指定的距离;而对于八卦图,它则根据传入的角度值旋转画笔方向,并沿该方向移动指定距离,以便于后续绘制八卦中的每个卦象。

3. taiji() 函数

该函数负责绘制太极图。它首先调用rset()函数复位画笔,然后设定线条宽度和颜色,接着调用offset()函数定位到太极图的起始点。之后,使用turtle的绘图命令(如circlebegin_fillend_fill等)绘制出太极图的轮廓和黑白两色部分。值得注意的是,太极图中心的小圆(阴阳鱼的眼睛)也在此函数中绘制完成。

4. bagua() 函数

这个函数用来绘制八卦图。它接收三个参数:偏移量(off_set)、线段长度(side)以及包含各卦符号信息的列表(gua_lis)。函数内部遍历gua_lis列表,根据每个卦象的数据(由1和0组成的元组,代表阳爻和阴爻)绘制相应的图形。此外,如果元组中包含字符串(卦名),则会在适当的位置使用write函数输出这些文字。为了使卦象之间排列整齐,函数还会根据需要调整画笔的位置和方向。

5. 绘制过程

  • 初始化:设置窗口标题、大小,关闭动画追踪(通过tracer(0)提高绘制速度)。
  • 太极图绘制:调用taiji(50)绘制太极图,其中50是太极图的大圆半径。
  • 八卦图绘制:调用bagua(70, 30, gua_lis)绘制八卦图,其中70是偏移量,30是线段长度,gua_lis是包含八卦信息的列表。
  • 结束:隐藏海龟光标,显示绘制好的图像(通过done()函数)。

6. 技术亮点

  • 模块化设计:通过定义多个功能明确的函数,使得整个程序结构清晰,易于维护和扩展。
  • 灵活的参数设置:各个函数允许传入不同的参数值,从而可以轻松调整太极图和八卦图的具体外观。
  • 精确的位置控制:利用turtle提供的精确位置控制能力,确保了太极图和八卦图能够准确无误地被绘制出来。

综上所述,这段代码不仅实现了太极八卦图的绘制,而且展示了如何通过合理的设计和组织代码来解决复杂的图形绘制任务。

写在后面

我是一只有趣的兔子,感谢你的喜欢。

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

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

相关文章

C 语言面向对象

面向对象的基本特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 1.0 面向过程概念 当我们在编写程序时&#xff0c;通常采用以下步骤&#xff1a; 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…

滑动窗口最大值(java)

题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7]…

拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流

在前端开发的世界里&#xff0c;我们总是在不断追寻更高效、更简洁的方式来构建令人惊艳的用户界面。而今天&#xff0c;我要向大家隆重介绍一款具有创新性的工具 ——NoCss.js&#xff0c;它将彻底颠覆你对传统前端开发的认知&#xff0c;引领我们进入一个全新的无 CSS 编程时…

配置Springboot+vue项目在ubuntu20.04

一、jdk1.8环境配置 (1) 安装jdk8&#xff1a; sudo apt-get install openjdk-8-jdk (2) 检查jdk是否安装成功&#xff1a; java -version(3) 设置JAVA_HOME&#xff1a; echo export JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64 >> ~/.bashrc echo export PATH$J…

Spring框架特性及包下载(Java EE 学习笔记04)

1 Spring 5的新特性 Spring 5是Spring当前最新的版本&#xff0c;与历史版本对比&#xff0c;Spring 5对Spring核心框架进行了修订和更新&#xff0c;增加了很多新特性&#xff0c;如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上&#xff0c;所以Spri…

软考教材重点内容 信息安全工程师 第 5 章 物理与环境安全技术

5.1.1 物理安全概念 传统上的物理安全也称为实体安全&#xff0c;是指包括环境、设备和记录介质在内的所有支持网络信息系统运行的硬件的总体安全&#xff0c;是网络信息系统安全、可靠、不间断运行的基本保证&#xff0c;并且确保在信息进行加工处理、服务、决策支持的过程中&…

「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用

1. 谷歌浏览器安装及使用流程 1.1 准备篡改猴扩展程序包。 因为谷歌浏览器的扩展商城打不开&#xff0c;所以需要准备一个篡改猴压缩包。 其他浏览器只需打开扩展商城搜索篡改猴即可。 没有压缩包的可以进我主页下载。 也可直接点击下载&#xff1a;Chrome浏览器篡改猴(油猴…

【案例学习】如何使用Minitab实现包装过程的自动化和改进

Masimo 是一家全球性的医疗技术公司&#xff0c;致力于开发和生产各种行业领先的监控技术&#xff0c;包括创新的测量、传感器和患者监护仪。在 Masimo Hospital Automation 平台的助力下&#xff0c;Masimo 的连接、自动化、远程医疗和远程监控解决方案正在改善医院内外的护理…

Git旧文件覆盖引发思考

一天&#xff0c;我的同事过来找到我&#xff0c;和我讲&#xff1a;张叫兽&#xff0c;大事不好&#xff0c;我的文件被人覆盖了。git是真的不好用啊 git不好用&#xff1f;文件被覆盖&#xff1b;瞬间我似乎知道了什么&#xff0c;让我想到了某位男明星的语法&#xff1a;他…

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具&#xff0c;如优…

SAP BC 记录一次因为HANA服务器内存满的问题

用户操作 DB02 进入hana数据库服务器 free -g 内存用完了 如下图 解决方案&#xff1a;增加内存 操作 关应用服务->关闭数据库服务->关闭hana服务器->加内存->起hana服务器->起hana服务->启动应用服务。

ArcGIS应用指南:ArcGIS制作局部放大地图

在地理信息系统&#xff08;GIS&#xff09;中&#xff0c;制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化&#xff0c;还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧&#xff0c;用于展示特定区域的详细信息&#xff…

python画图|无坐标轴自由划线操作fig.add_artist(lines.Line2D()函数

【1】引言 新发现了一种自由划线操作函数&#xff0c;和大家共享。 【2】官网教程 点击下述代码&#xff0c;直达官网&#xff1a; https://matplotlib.org/stable/gallery/misc/fig_x.html#sphx-glr-gallery-misc-fig-x-py 官网代码非常简洁&#xff0c;我进行了解读。 …

深度解析:Nginx模块架构与工作机制的奥秘

文章目录 前言Nginx是什么?Ngnix特点&#xff1a; 一、Nginx模块与工作原理1.Nginx的模块1.1 Nginx模块常规的HTTP请求和响应的流程图:1.2 Nginx的模块从结构上分为如下三类&#xff1a;1.3 Nginx的模块从功能上分为如下三类: 2.Nginx的进程模型2.1 Nginx进程结构2.2 nginx进程…

抖音SEO矩阵系统:开发技术分享

市场环境剖析 短视频SEO矩阵系统是一种策略&#xff0c;旨在通过不同平台上的多个账号建立联系&#xff0c;整合同一品牌下的各平台粉丝流量。该系统通过遵循每个平台的规则和内容要求&#xff0c;输出企业和品牌形象&#xff0c;以矩阵形式增强粉丝基础并提升商业价值。抖音作…

面试经典 150 题:205,55

205. 同构字符串 【解题思路】 来自大佬Krahets 【参考代码】 class Solution { public:bool isIsomorphic(string s, string t) {map<char, char> Smap, Tmap;for(int i0; i<s.size(); i){char a s[i], b t[i];//map容器存在该字符&#xff0c;且不等于之前映射…

STM32 Keil5 attribute 关键字的用法

这篇文章记录一下STM32中attribute的用法。之前做项目的时候产品需要支持远程升级&#xff0c;要求版本只能向上迭代&#xff0c;不支持回退。当时想到的方案是把版本号放到bin文件的头部&#xff0c;设备端收到bin文件的首包部数据后判断是否满足升级要求&#xff0c;这里就可…

【Redis 缓存策略】更新、穿透、雪崩、击穿、布隆过滤

目录 缓存简单介绍 缓存更新策略 缓存更新需求 数据库缓存不一致解决方案 先操作缓存还是先操作数据库&#xff1f; 先删除缓存&#xff0c;再操作数据库 先操作数据库&#xff0c;再删除缓存 总结 删除缓存还是更新缓存&#xff1f; 保证缓存与数据库的操作的同时成功或失败 …

利用c语言详细介绍下栈的实现

数据结构中&#xff0c;栈是一种线性结构&#xff0c;数据元素遵循后进先出的原则。栈的一端为栈顶&#xff0c;一端为栈底或栈尾&#xff0c;数据只在栈顶端进行操作。新插入数据称为入栈或者压栈&#xff0c;删除数据叫做出栈或者退栈。 一、图文介绍 我们通过建立一个stack…