Python2.7+Tkinter实现点阵式谢尔宾斯基三角形技术问询
嘿,我来帮你搞定这个点阵版的谢尔宾斯基三角形!你提到用线条实现容易,但点阵的话,用**混沌游戏(Chaos Game)**的数学思路超合适——不用复杂的递归画线,靠简单的随机选点和中点计算,就能生成密密麻麻的点阵,完美贴合你的需求。
核心数学逻辑:混沌游戏法
这个方法的原理特别直白,几步就能搞定:
- 先确定三个固定顶点,构成一个大的等边三角形
- 随机选一个初始点(哪怕在三角形外面也没关系)
- 每次随机挑一个顶点,把当前点移动到当前点和该顶点的中点
- 重复这个操作几千次,这些点自然会形成谢尔宾斯基三角形的点阵结构
完整Tkinter实现代码
我把你的Point类补全,再加上完整的绘制逻辑,Python3版本的代码如下:
import tkinter as tk from random import randint, choice # 2D点类,方便处理坐标 class Point(object): def __init__(self, x=0.0, y=0.0): self._x = float(x) self._y = float(y) @property def x(self): return self._x @property def y(self): return self._y def main(): # 创建主窗口 root = tk.Tk() root.title("点阵谢尔宾斯基三角形") # 设置画布大小,这里用800x800 canvas_width = 800 canvas_height = 800 canvas = tk.Canvas(root, width=canvas_width, height=canvas_height, bg="white") canvas.pack() # 定义三个顶点坐标,放在画布中上部,构成等边三角形 vertex_a = Point(canvas_width/2, 100) vertex_b = Point(100, canvas_height - 100) vertex_c = Point(canvas_width - 100, canvas_height - 100) vertices = [vertex_a, vertex_b, vertex_c] # 随机生成初始点 current_point = Point( randint(0, canvas_width), randint(0, canvas_height) ) # 迭代绘制10000次,次数越多点阵越密 for _ in range(10000): # 随机选一个顶点 chosen_vertex = choice(vertices) # 计算当前点和选中顶点的中点 new_x = (current_point.x + chosen_vertex.x) / 2 new_y = (current_point.y + chosen_vertex.y) / 2 # 更新当前点 current_point = Point(new_x, new_y) # 在画布上画一个1x1的小点(用oval模拟点,更清晰) canvas.create_oval(new_x, new_y, new_x+1, new_y+1, fill="black", outline="") # 启动主循环 root.mainloop() if __name__ == "__main__": main()
关键细节说明
- 中点计算:这是核心的数学操作,
(x1+x2)/2和(y1+y2)/2,完全不需要复杂的几何公式,简单易懂 - 迭代次数:我设了10000次,你可以根据需要调整——次数越多,点阵越密集,三角形的细节越清晰
- 点的绘制:用
create_oval画1像素的小椭圆来模拟点,比直接画点更稳定,不会出现显示问题 - 初始点:哪怕初始点在三角形外面,迭代几次后也会自动进入三角形区域,所以完全不用刻意限制初始位置
运行代码后,你就能看到一个由密密麻麻黑点构成的谢尔宾斯基三角形啦!
内容的提问来源于stack exchange,提问作者RawStanky
相关产品推荐
相关产品推荐

