Bootstrap

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,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提供的精确位置控制能力,确保了太极图和八卦图能够准确无误地被绘制出来。

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

写在后面

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;