Python绘制太极八卦

news/2024/11/27 15:48:30/

八卦图

文章目录

  • 系列目录
  • 写在前面
  • 技术需求
    • 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. 用户界面

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

完整代码

python">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的绘图命令(如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.ppmy.cn/news/1550385.html

相关文章

iOS构建版本以及Hbuilder打iOS的ipa包全流程

目录 Hbuilder打ipa包 打包之前进行应用配置 应用版本号设置 使用广告标识设置 iOS-云打包 下载并转移安装包 使用Transporter提交版本 应用简介 下载应用 账号登录 提交安装包到apple store connect 在apple开发者平台上确认 总结 本篇文章详细的介绍了使用Hbuil…

【二叉树】【2.1遍历二叉树】【刷题笔记】【灵神题单】

关注二叉树的三个问题&#xff1a; 什么情况适合自顶向下&#xff1f;什么时候适合用自底向上&#xff1f;一般来说&#xff0c;DFS的递归边界是空节点&#xff0c;什么情况下要额外把叶子节点作为递归边界&#xff1f;在什么情况下&#xff0c;DFS需要有返回值&#xff1f;什…

C语言实例之9斐波那契数列实现

1. 斐波那契数列简介 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多・斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为 “兔子数列”。 它的特点是从第三…

C++ 中的多继承

C 中的 多继承&#xff08;Multiple Inheritance&#xff09;是指一个类可以同时继承自多个父类。与单继承&#xff08;Single Inheritance&#xff09;不同&#xff0c;子类在多继承中可以从多个父类继承属性和方法。其基本语法如下&#xff1a; class ClassA {// ClassA 的成…

【前端学习笔记】AJAX、axios、fetch、跨域

1.介绍 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;异步的JS和XML。通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。 X…

PHP实现插入排序

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;适用于少量数据的排序。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。以下是一个用PHP实现插入排序…

代码随想录算法训练营第五十八天|Day58 图论

拓扑排序精讲 https://www.programmercarl.com/kamacoder/0117.%E8%BD%AF%E4%BB%B6%E6%9E%84%E5%BB%BA.html 拓扑排序的背景 本题是拓扑排序的经典题目。 一聊到 拓扑排序&#xff0c;一些录友可能会想这是排序&#xff0c;不会想到这是图论算法。 其实拓扑排序是经典的图论问…

基于nxp LS1046+fpga的嵌入式系统中虚拟化设备的设计与实现

3 虚拟化设备仿真平台设计 本文需要设计和实现的虚拟化设备需要搭建一个仿真平台&#xff0c;一个完善的仿真平台才 是一种虚拟化设备能搭建起来的关键&#xff0c;仿真平台的搭建需要一定条件的硬件环境&#xff0c;更为 主要的是软件环境&#xff0c;下文就要详细介绍此虚…