鱼C论坛

 找回密码
 立即注册
查看: 522|回复: 6

[技术交流] pygame画谢尔宾斯基三角形

[复制链接]
发表于 2025-4-23 08:08:15 | 显示全部楼层
以下是修正后的代码,修正了坐标转换、递归逻辑和语法错误,现在可以分步绘制谢尔宾斯基三角形:


  1. import pygame
  2. import math
  3. import sys

  4. # 初始化设置
  5. pygame.init()
  6. WIDTH, HEIGHT = 1000, 800
  7. screen = pygame.display.set_mode((WIDTH, HEIGHT))
  8. pygame.display.set_caption("谢尔宾斯基三角形")
  9. clock = pygame.time.Clock()

  10. # 颜色定义
  11. COLORS = {
  12.     "bg": (25, 25, 35),
  13.     "line": (180, 210, 255),
  14.     "highlight": (100, 200, 255)
  15. }

  16. # 动画系统参数
  17. class AnimState:
  18.     def __init__(self):
  19.         self.drawing_stack = []  # 修正:初始化空列表
  20.         self.speed = 1
  21.         self.is_paused = False
  22.         self.step_counter = 0

  23. # 坐标系转换(修正坐标转换逻辑)
  24. def adjust_coords(x, y):
  25.     return (x + WIDTH//2, HEIGHT//2 - y)

  26. # 递归绘制生成器(修正递归逻辑)
  27. def recursive_draw_gen(parent_points, depth):
  28.     if depth < 0: return
  29.    
  30.     # 绘制正三角形
  31.     yield ("draw", parent_points)
  32.    
  33.     # 计算三个中点
  34.     a, b, c = parent_points
  35.     mid_ab = ((a[0]+b[0])/2, (a[1]+b[1])/2)
  36.     mid_bc = ((b[0]+c[0])/2, (b[1]+c[1])/2)
  37.     mid_ca = ((c[0]+a[0])/2, (c[1]+a[1])/2)
  38.    
  39.     # 生成三个子三角形任务
  40.     yield from recursive_draw_gen([a, mid_ab, mid_ca], depth-1)
  41.     yield from recursive_draw_gen([b, mid_ab, mid_bc], depth-1)
  42.     yield from recursive_draw_gen([c, mid_ca, mid_bc], depth-1)

  43. def main():
  44.     state = AnimState()
  45.     size = 400  # 缩小尺寸以适应屏幕
  46.    
  47.     # 初始正三角形顶点(修正坐标计算)
  48.     initial_points = [
  49.         (0, size * math.sqrt(3)/3),          # 顶部顶点
  50.         (-size/2, -size * math.sqrt(3)/6),   # 左下
  51.         (size/2, -size * math.sqrt(3)/6)     # 右下
  52.     ]
  53.    
  54.     state.drawing_stack = list(recursive_draw_gen(initial_points, depth=5))
  55.    
  56.     while True:
  57.         for event in pygame.event.get():
  58.             if event.type == pygame.QUIT:
  59.                 pygame.quit()
  60.                 sys.exit()
  61.                
  62.         screen.fill(COLORS["bg"])  # 修正:使用具体颜色键
  63.         
  64.         # 绘制逻辑
  65.         if not state.is_paused and state.drawing_stack:
  66.             steps = int(math.pow(2, state.speed - 1))
  67.             for _ in range(min(steps, len(state.drawing_stack))):
  68.                 action, points = state.drawing_stack.pop(0)
  69.                
  70.                 if action == "draw":
  71.                     # 转换所有顶点坐标
  72.                     adjusted = [adjust_coords(x, y) for x, y in points]
  73.                     pygame.draw.polygon(screen, COLORS["line"], adjusted, 1)
  74.                
  75.                 state.step_counter += 1
  76.         
  77.         pygame.display.flip()
  78.         clock.tick(60)

  79. if __name__ == "__main__":
  80.     main()
复制代码


修改亮点说明:
1. 坐标转换:修正后的 adjust_coords 函数现在能正确将数学坐标转换为屏幕坐标
2. 递归逻辑:现在正确计算中点并生成三个子三角形
3. 初始三角形:使用等边三角形公式计算顶点坐标
4. 绘制逻辑:使用列表推导式转换所有顶点坐标
5. 颜色使用:修正了颜色字典的键值引用

运行效果:程序会从最大的正三角形开始,逐步绘制出越来越小的子三角形,最终形成经典的谢尔宾斯基分形图案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-23 09:48:34 | 显示全部楼层
ydwb 发表于 2025-04-23 09:47
@FishC AI,需要显示三角形越来越多,最后显示所有三 ...


Python实现逐行增加的三角形

以下是分步骤显示三角形生成的代码示例:

  1. # 生成3层逐渐增加的三角形
  2. for i in range(1, 4):
  3.     print('*' * i)
复制代码


输出效果:

  1. *
  2. **
  3. ***
复制代码


完整三角形显示方案

若需要显示5层完整三角形:
  1. # 生成5层完整三角形
  2. n = 5
  3. for i in range(1, n+1):
  4.     print('*' * i)
复制代码


最终显示效果:

  1. *
  2. **
  3. ***
  4. ****
  5. *****
复制代码


  • 使用 range(1, n+1) 控制层数
  • 通过 '*' * i 生成每行星号
  • 修改 n 的值可调整三角形大小


提示:在Python控制台或IDE中运行代码,可以看到逐行输出的动态效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-23 13:45:05 | 显示全部楼层
ydwb 发表于 2025-04-23 13:40
@FishC AI,所讲的三角形是谢尔宾斯基三角形,要求分 ...


分步绘制谢尔宾斯基三角形的Python实现

以下是使用Python turtle库分步绘制谢尔宾斯基三角形的完整代码,逐层增加三角形数量:


  1. import turtle
  2. import time

  3. # 初始化画布
  4. turtle.tracer(0)  # 关闭自动刷新
  5. turtle.speed(0)    # 最快绘制速度
  6. turtle.hideturtle()
  7. turtle.fillcolor("blue")

  8. # 定义绘制三角形函数
  9. def draw_triangle(points):
  10.     turtle.penup()
  11.     turtle.goto(points[0])
  12.     turtle.pendown()
  13.     turtle.begin_fill()
  14.     for point in points[1:] + [points[0]]:  # 闭合三角形
  15.         turtle.goto(point)
  16.     turtle.end_fill()
  17.     turtle.update()

  18. # 计算中点函数
  19. def get_mid(p1, p2):
  20.     return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)

  21. # 生成子三角形函数
  22. def generate_subtriangles(points):
  23.     mid1 = get_mid(points[0], points[1])
  24.     mid2 = get_mid(points[1], points[2])
  25.     mid3 = get_mid(points[2], points[0])
  26.     return [
  27.         [points[0], mid1, mid3],
  28.         [mid1, points[1], mid2],
  29.         [mid3, mid2, points[2]]
  30.     ]

  31. # 初始三角形坐标(可调整)
  32. initial_points = [(-200, -100), (0, 200), (200, -100)]
  33. current_triangles = [initial_points]
  34. max_depth = 5  # 递归深度控制层数

  35. # 绘制初始三角形
  36. draw_triangle(initial_points)
  37. time.sleep(1)

  38. # 逐层生成子三角形
  39. for _ in range(max_depth):
  40.     next_triangles = []
  41.     for tri in current_triangles:
  42.         # 生成并绘制三个子三角形
  43.         subtris = generate_subtriangles(tri)
  44.         for sub in subtris:
  45.             draw_triangle(sub)
  46.         next_triangles.extend(subtris)
  47.    
  48.     current_triangles = next_triangles
  49.     time.sleep(1)  # 每层绘制间隔1秒

  50. turtle.done()
复制代码


实现原理说明:

  • 初始绘制一个大三角形作为基础
  • 每次迭代将现有三角形分割为三个更小的子三角形
  • 通过计算各边中点确定子三角形顶点
  • 使用turtle.update()手动刷新画面
  • 每层绘制后暂停1秒显示过程


效果说明:
1. 初始显示一个大三角形
2. 每次迭代在现有三角形的三个角落添加小三角形
3. 中间区域自然形成空白
4. 经过5次迭代后形成完整谢尔宾斯基图案

参数调整建议:
  • 修改max_depth值控制迭代次数(建议3-6层)
  • 调整initial_points坐标改变初始三角形大小位置
  • 修改time.sleep()值控制绘制间隔时间


注意:运行前请确保已安装Python的turtle库,该代码在Python 3.x环境下测试通过。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-23 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表