莫利定理的隐藏彩蛋:用Python+turtle自动生成正三角形的5种构造方案

发布时间:2026/7/15 6:37:10

莫利定理的隐藏彩蛋:用Python+turtle自动生成正三角形的5种构造方案 莫利定理的隐藏彩蛋用Pythonturtle自动生成正三角形的5种构造方案当数学定理遇上编程艺术总能碰撞出令人惊喜的火花。莫利定理Morleys Theorem这个看似抽象的几何命题在Python的turtle绘图库中焕发出全新的生命力。本文将带你探索五种截然不同的正三角形构造方法从基础实现到交互式探索每段代码都能直接复制运行让数学之美在屏幕上跃然呈现。1. 经典构造法从任意三角形出发莫利定理的核心在于任意三角形的角三分线交点总能构成一个完美的正三角形。让我们先用最直接的方式实现这个经典构造import turtle import math def draw_morley_triangle(): # 初始化画布和画笔 t turtle.Turtle() t.speed(0) screen turtle.Screen() screen.title(莫利定理经典构造法) # 绘制任意三角形ABC t.penup() t.goto(-150, -100) t.pendown() t.dot(8, red) # 标记顶点A t.write(A, aligncenter) a_pos t.position() t.goto(150, -100) t.dot(8, red) # 标记顶点B t.write(B, aligncenter) b_pos t.position() t.goto(0, 150) t.dot(8, red) # 标记顶点C t.write(C, aligncenter) c_pos t.position() t.goto(a_pos) # 闭合三角形 # 计算角三分线交点莫利点 def get_morley_point(p1, p2, p3, angle_ratio): # 计算向量和角度 v1 (p1[0]-p2[0], p1[1]-p2[1]) v2 (p3[0]-p2[0], p3[1]-p2[1]) angle math.atan2(v1[1], v1[0]) - math.atan2(v2[1], v2[0]) angle (angle 2*math.pi) % (2*math.pi) # 计算三分线角度 split_angle angle * angle_ratio new_angle math.atan2(v2[1], v2[0]) split_angle return (p2[0] 300*math.cos(new_angle), p2[1] 300*math.sin(new_angle)) # 获取三个莫利点 p1 line_intersection( get_morley_point(b_pos, a_pos, c_pos, 1/3), a_pos, get_morley_point(c_pos, a_pos, b_pos, 2/3), a_pos ) p2 line_intersection( get_morley_point(a_pos, b_pos, c_pos, 1/3), b_pos, get_morley_point(c_pos, b_pos, a_pos, 2/3), b_pos ) p3 line_intersection( get_morley_point(a_pos, c_pos, b_pos, 1/3), c_pos, get_morley_point(b_pos, c_pos, a_pos, 2/3), c_pos ) # 绘制莫利三角形 t.penup() t.goto(p1) t.pendown() t.dot(8, blue) t.write(P, aligncenter) t.goto(p2) t.dot(8, blue) t.write(Q, aligncenter) t.goto(p3) t.dot(8, blue) t.write(R, aligncenter) t.goto(p1) # 闭合三角形 turtle.done() def line_intersection(p1, p2, p3, p4): # 计算两条直线的交点 x1, y1 p1 x2, y2 p2 x3, y3 p3 x4, y4 p4 denom (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4) if denom 0: return None # 平行线 px ((x1*y2-y1*x2)*(x3-x4) - (x1-x2)*(x3*y4-y3*x4)) / denom py ((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)) / denom return (px, py) draw_morley_triangle()这段代码的关键点在于使用math.atan2计算精确的角度值通过向量运算确定角三分线的方向实现了一个通用的直线交点计算函数用不同颜色标记原始三角形和莫利三角形提示尝试修改初始三角形ABC的顶点坐标观察莫利三角形如何始终保持正三角形特性。2. 逆向工程从正三角形反推原三角形莫利定理的逆过程同样有趣——我们可以从一个正三角形出发构造出无数个满足条件的原三角形import turtle import random def inverse_morley_construction(): t turtle.Turtle() t.speed(0) screen turtle.Screen() screen.title(莫利定理逆向构造) # 绘制初始正三角形PQR side_length 150 t.penup() t.goto(-side_length/2, -side_length*math.sqrt(3)/6) t.pendown() t.dot(8, blue) t.write(P, aligncenter) p_pos t.position() t.goto(side_length/2, -side_length*math.sqrt(3)/6) t.dot(8, blue) t.write(Q, aligncenter) q_pos t.position() t.goto(0, side_length*math.sqrt(3)/3 - side_length*math.sqrt(3)/6) t.dot(8, blue) t.write(R, aligncenter) r_pos t.position() t.goto(p_pos) # 随机选择三个构造角度满足abc120度 a random.uniform(20, 40) b random.uniform(20, 40) c 120 - a - b # 在外侧构造等腰三角形 def draw_isosceles(base_pos1, base_pos2, angle, color): mid_x (base_pos1[0] base_pos2[0]) / 2 mid_y (base_pos1[1] base_pos2[1]) / 2 # 计算垂直向量 dx base_pos2[0] - base_pos1[0] dy base_pos2[1] - base_pos1[1] length math.sqrt(dx*dx dy*dy) # 计算顶点位置 height length/2 * math.tan(math.radians(angle)) normal_x -dy/length normal_y dx/length apex_x mid_x height * normal_x apex_y mid_y height * normal_y t.penup() t.goto(base_pos1) t.pendown() t.color(color) t.goto(apex_x, apex_y) t.goto(base_pos2) return (apex_x, apex_y) # 绘制三个等腰三角形 p_ext draw_isosceles(q_pos, r_pos, a, green) q_ext draw_isosceles(r_pos, p_pos, b, orange) r_ext draw_isosceles(p_pos, q_pos, c, purple) # 计算原三角形顶点 def line_intersection(line1, line2): # 省略交点计算代码同前例 pass a_pos line_intersection((q_ext, q_pos), (r_ext, r_pos)) b_pos line_intersection((r_ext, r_pos), (p_ext, p_pos)) c_pos line_intersection((p_ext, p_pos), (q_ext, q_pos)) # 绘制原三角形 t.penup() t.goto(a_pos) t.pendown() t.dot(8, red) t.write(A, aligncenter) t.goto(b_pos) t.dot(8, red) t.write(B, aligncenter) t.goto(c_pos) t.dot(8, red) t.write(C, aligncenter) t.goto(a_pos) turtle.done() inverse_morley_construction()这种构造方法的独特之处在于允许通过调整a、b、c三个参数生成无限多种原三角形直观展示了莫利定理的对称性使用随机角度演示定理的普适性3. 动态探索滑块交互式调整为了让探索过程更加直观我们可以加入交互式滑块实时调整三角形形状和角度参数import turtle from turtle import * import math def interactive_morley(): screen turtle.Screen() screen.title(莫利定理交互式探索) screen.setup(800, 600) # 创建滑块控制三角形形状 slider_a turtle.Turtle() slider_a.speed(0) slider_a.penup() slider_a.goto(-350, -250) slider_a.pendown() slider_a.write(顶点A高度:, alignleft) slider_a_a turtle.Turtle() slider_a_a.shape(circle) slider_a_a.penup() slider_a_a.goto(-250, -250) slider_a_a.color(red) # 类似创建其他滑块... # 绘制函数 def draw_all(): # 获取滑块值 a_height slider_a_a.xcor() 250 # 清除重绘 drawer.clear() # 绘制三角形和莫利三角形 # ...实现代码类似前例 # 绑定滑块拖动事件 def drag_slider_a(x, y): slider_a_a.goto(max(-250, min(x, -150)), -250) draw_all() slider_a_a.ondrag(drag_slider_a) # 初始绘制 draw_all() turtle.done() interactive_morley()交互式探索的优势包括实时观察参数变化对图形的影响直观理解角度变化与莫利三角形的关系适合教学演示和个人探索4. 批量验证随机三角形测试为了验证莫利定理的普适性我们可以创建批量测试程序生成随机三角形并验证其莫利三角形是否为正三角形import turtle import random import math def mass_verification(count5): results [] for i in range(count): # 生成随机三角形 a_pos (random.uniform(-200, -50), random.uniform(-100, 100)) b_pos (random.uniform(50, 200), random.uniform(-100, 100)) c_pos (random.uniform(-100, 100), random.uniform(150, 250)) # 计算莫利三角形 morley_triangle calculate_morley(a_pos, b_pos, c_pos) # 验证是否为正三角形 is_equilateral verify_equilateral(morley_triangle) results.append(is_equilateral) # 可视化当前结果 visualize_case(a_pos, b_pos, c_pos, morley_triangle, i1) # 暂停查看 turtle.clearscreen() print(f验证结果{sum(results)}/{count} 通过验证) def verify_equilateral(triangle): # 计算三边长度 a math.dist(triangle[0], triangle[1]) b math.dist(triangle[1], triangle[2]) c math.dist(triangle[2], triangle[0]) # 允许1%的误差 return math.isclose(a, b, rel_tol0.01) and math.isclose(b, c, rel_tol0.01) mass_verification()这种验证方式的价值在于通过大量案例增强定理可信度自动化验证过程节省时间可以扩展到更严格的数学验证5. 艺术创作彩色莫利分形将莫利定理与分形概念结合可以创造出令人惊叹的几何艺术def morley_fractal(depth3, size300): def draw_triangle(points, color, depth): turtle.fillcolor(color) turtle.begin_fill() turtle.goto(points[0][0], points[0][1]) turtle.goto(points[1][0], points[1][1]) turtle.goto(points[2][0], points[2][1]) turtle.goto(points[0][0], points[0][1]) turtle.end_fill() if depth 0: # 计算莫利三角形 morley calculate_morley(*points) # 递归绘制 colors [#f{i:02x}*3 for i in range(16, 256, 32)] draw_triangle(morley, colors[depth % len(colors)], depth-1) # 对每个子三角形继续分割 for i in range(3): new_tri [points[i], morley[i], morley[(i1)%3]] draw_triangle(new_tri, colors[(depthi) % len(colors)], depth-1) # 初始化 turtle.speed(0) turtle.hideturtle() turtle.title(莫利分形艺术) # 初始大三角形 points [ (-size/2, -size*math.sqrt(3)/4), (size/2, -size*math.sqrt(3)/4), (0, size*math.sqrt(3)/4) ] draw_triangle(points, red, depth) turtle.done() morley_fractal(depth4)这种艺术创作展示了数学定理的美学价值递归算法的强大表现力几何图形的无限可能性每种实现方案都揭示了莫利定理的不同面向从严格验证到艺术表达这正是数学可视化编程的魅力所在。当你运行这些代码时不妨思考为什么这样一个简单的三等分操作总会产生完美的正三角形这背后隐藏着怎样深刻的几何对称性

相关新闻