当前位置: 首页 > article >正文

Python绘制太极八卦

八卦图

文章目录

  • 系列目录
  • 写在前面
  • 技术需求
    • 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.kler.cn/a/410607.html

相关文章:

  • WebSocket详解、WebSocket入门案例
  • 滑动窗口最大值(java)
  • 时间请求参数、响应
  • oracle会话追踪
  • KMeans聚类实验(基础入门)
  • DataWhale—PumpkinBook(TASK05决策树)
  • 无人机+无人车+机器狗+自组网:城市一空地体化指挥系统技术详解
  • element-ui 中el-calendar 日历插件获取显示的第一天和最后一天【原创】
  • 摄像机常见的问题及解决方法
  • HTML5 视频 Vedio 标签详解
  • 实现 UniApp 右上角按钮“扫一扫”功能实战教学
  • Java面试之多线程并发篇
  • django authentication 登录注册
  • Stable Diffusion入门教程
  • 从多个角度探索TOX革新Web3时代价值创造与重新分配
  • MySQL与Informix数据库中的同义表创建:深入解析与比较
  • Web3 游戏周报(11.17 - 11.23)
  • 远程控制软件:探究云计算和人工智能的融合
  • JavaWeb——Mybatis
  • 什么是回退机制
  • 视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析
  • ubuntu 安装proxychains
  • 【ArcGISPro】Sentinel-2数据处理
  • Spring AI Fluent API:与AI模型通信的流畅体验
  • 【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)
  • [高阶数据结构二] LRU Cache详解