Python绘制太极八卦

文章目录
- 系列目录
- 写在前面
- 技术需求
- 1. 图形绘制库的支持
- 2. 图形绘制功能
- 3. 参数化设计
- 4. 绘制控制
- 5. 数据处理
- 6. 用户界面
- 完整代码
- 代码分析
- 1. `rset()` 函数
- 2. `offset()` 函数
- 3. `taiji()` 函数
- 4. `bagua()` 函数
- 5. 绘制过程
- 6. 技术亮点
- 写在后面
系列目录
| 序号 | 直达链接 |
| 爱心系列 | |
| 1 | Python制作一个无法拒绝的表白界面 |
| 2 | Python满屏飘字表白代码 |
| 3 | Python无限弹窗满屏表白代码 |
| 4 | Python李峋同款可写字版跳动的爱心 |
| 5 | Python流星雨代码 |
| 6 | Python漂浮爱心代码 |
| 7 | Python爱心光波代码 |
| 8 | Python普通的玫瑰花代码 |
| 9 | Python炫酷的玫瑰花代码 |
| 10 | Python多彩的玫瑰花代码 |
| 节日系列 | |
| 1 | Python动漫风烟花秀代码 |
| 2 | Python新年烟花秀代码 |
| 3 | Python圣诞礼物代码 |
| 4 | Python画圣诞树代码 |
| 5 | Python可爱版圣诞树丨绿色 |
| 6 | Python可爱版圣诞树丨粉色 |
| 7 | Python大雪纷飞代码 |
| 8 | Python生日蛋糕代码 |
| 9 | Python五彩气球代码 |
| 10 | Python国庆祝福代码 |
| 11 | Python万圣礼物代码 |
| 12 | Python愚人节礼物代码 |
| 13 | Python浪漫星空代码 |
| 14 | Python樱花树代码 |
| 动漫系列 | |
| 1 | Python名侦探柯南 |
| 2 | Python喜羊羊 |
| 3 | Python懒羊羊 |
| 4 | Python沸羊羊 |
| 5 | Python小灰灰 |
| 6 | Python小香香 |
| 7 | Python灰太狼 |
| 8 | Python海绵宝宝 |
| 9 | Python哆啦A梦 |
| 10 | Python凯蒂猫 |
| 11 | Python猫和老鼠 |
| 12 | Python草莓熊 |
| 13 | Python迷你皮卡丘 |
| 14 | Python高级皮卡丘 |
| 15 | Python豪华皮卡丘 |
| 16 | Python史迪仔 |
| 17 | Python小熊猫 |
| 18 | Python蜘蛛侠 |
| 19 | Python可爱版蜡笔小新 |
| 20 | Python萌萌的蜡笔小新 |
| 21 | Python罗小黑 |
| 22 | Python猪猪侠 |
| 炫酷系列 | |
| 1 | Python张万森下雪了 |
| 2 | Python一闪一闪亮晶晶 |
| 3 | Python黑客帝国代码雨 |
| 4 | Python七彩花朵 |
| 5 | Python模拟3D星空 |
| 6 | Python金榜题名 |
| 7 | Python满天星 |
写在前面
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,360rset() # 初始化到原点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的绘图命令(如circle、begin_fill和end_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提供的精确位置控制能力,确保了太极图和八卦图能够准确无误地被绘制出来。
综上所述,这段代码不仅实现了太极八卦图的绘制,而且展示了如何通过合理的设计和组织代码来解决复杂的图形绘制任务。
写在后面
我是一只有趣的兔子,感谢你的喜欢。
相关文章:
Python绘制太极八卦
文章目录 系列目录写在前面技术需求1. 图形绘制库的支持2. 图形绘制功能3. 参数化设计4. 绘制控制5. 数据处理6. 用户界面 完整代码代码分析1. rset() 函数2. offset() 函数3. taiji() 函数4. bagua() 函数5. 绘制过程6. 技术亮点 写在后面 系列目录 序号直达链接爱心系列1Pyth…...
Spring框架特性及包下载(Java EE 学习笔记04)
1 Spring 5的新特性 Spring 5是Spring当前最新的版本,与历史版本对比,Spring 5对Spring核心框架进行了修订和更新,增加了很多新特性,如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上,所以Spri…...
Linux关于vim的笔记
Linux关于vim的笔记:(vimtutor打开vim 教程) --------------------------------------------------------------------------------------------------------------------------------- 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键…...
linux mount nfs开机自动挂载远程目录
要在Linux系统中实现开机自动挂载NFS共享目录,你需要编辑/etc/fstab文件。以下是具体步骤和示例: 确保你的系统已经安装了NFS客户端。如果没有安装,可以使用以下命令安装: sudo apt-install nfs-common 编辑/etc/fstab文件&#…...
【vue】导航守卫
什么是导航守卫 在vue路由切换过程中对行为做个限制 全局前置守卫 route.beforeEach((to, from, next)) > {// to是切换到的路由// from是正要离开的路由// next控制是否允许进入目标路由next(false); //不允许 }路由级别的导航守卫 const routes [{path: /User,name: U…...
基于Matlab实现LDPC编码
在无线通信和数据存储领域,LDPC(低密度奇偶校验码)编码是一种高效、纠错能力强大的错误校正技术。本MATLAB仿真程序全面地展示了如何在AWGN(加性高斯白噪声)信道下应用LDPC编码与BPSK(二进制相移键控&#…...
PostgreSQL 中约束Constraints
在 PostgreSQL 中,约束(Constraints)是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性,通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束,每种约束都有特定的用途和语法。以…...
✨系统设计时应时刻考虑设计模式基础原则
目录 💫单一职责原则 (Single Responsibility Principle, SRP)💫开放-封闭原则 (Open-Closed Principle, OCP)💫依赖倒转原则 (Dependency Inversion Principle, DIP)💫里氏代换原则 (Liskov Substitution Principle, LSP)&#x…...
【Linux】多线程(下)
目录 一、生产者消费者模型 1.1 概念 1.2 基于阻塞队列 1.3 POSIX信号量 初始化信号量 销毁信号量 等待信号量 发布信号量 1.4 基于环形队列和POSIX信号量 二、线程池 2.1 概念 2.2 代码 三、封装Linux线程库 四、单例模式 4.1 概念 4.2 单例模式的实现方式 4…...
Element-Plus如何修改日期选择器输入框el-date-picker的圆角
使用 el-date-picker 的 style 属性 :style"{ --el-border-radius-base: 10px }"<!-- 日期 --> <el-form-item label"日期" prop"establishmentDate"><el-date-picker v-model"form.establishmentDate" type"dat…...
skywalking es查询整理
索引介绍 sw_records-all 这个索引用于存储所有的采样记录,包括但不限于慢SQL查询、Agent分析得到的数据等。这些记录数据包括Traces、Logs、TopN采样语句和告警信息。它们被用于性能分析和故障排查,帮助开发者和运维团队理解服务的行为和性能特点。 …...
故障排除-------K8s挂载集群外NFS异常
故障排除-------K8s挂载集群外NFS异常 1. 故障现象2. 原因梳理2.1 排查思路2.2 确认yaml内容2.3 创建k8s内的nfs测试2.3.1 创建nfs和svc2.3.2 测试创建pvc2.3.3 测试结果 2.4 NFS服务端故障排除2.4.1 网络阻断排除2.4.2 排除服务状态问题2.4.3 排查NFS权限问题 3. 故障排除 1. …...
Easyexcel(6-单元格合并)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…...
解决登录Google账号遇到手机上Google账号无法验证的问题
文章目录 场景小插曲解决方案总结 场景 Google账号在新的设备上登录的时候,会要求在手机的Google上进行确认验证,而如果没有安装Google play就可能出现像我一样没有任何弹框,无法实现验证 小插曲 去年,我在笔记本上登录了Googl…...
【Redis_Day5】String类型
【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…...
Python MySQL SQLServer操作
Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL,通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例: 一、操作 MySQL:使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …...
Java技术分享
剖析equals方法 1、对于Object来说,其equals()方法底层实现就是"",都是比较对象的引用是否相等,下为JDK源码。 Object c 1; Object d 1; boolean equals c.equals(d);public boolean equals(Object obj) {return (this obj);…...
CentOS7卸载node
CentOS7卸载node 在 CentOS 7 上卸载 Node.js 可以通过以下步骤进行。具体步骤取决于你是如何安装 Node.js 的。常见的安装方法包括使用包管理器(如 yum 或 nvm)和手动安装。 方法 1:使用 yum 卸载 Node.js 如果你是通过 yum安装的 Node.j…...
LeetCode 2257. Count Unguarded Cells in the Grid
🔗 https://leetcode.com/problems/count-unguarded-cells-in-the-grid 题目 给出一个 m x n 的二维表格,格子上有士兵 guard,有墙 wall士兵可以盯上他上下左右所有的格子,碰到墙的格子就停止返回没有被士兵盯到的格子的数量 思…...
即时通讯服务器被ddos攻击了怎么办?
攻击即时通讯系统的主要手段 击键记录 目前盗取即时通讯工具帐号信息的最主要方法是通过特洛伊木马等恶意软件,例如QQ木马,这类程序能够盗取QQ密码信息,常见的能够盗取最新版本QQ密码的木马程序有十几种之多。几乎所有主要的QQ木马程序都采…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
