Python Turtle如何获取保存海龟角度 实现三角形中垂线绘制
三角形中垂线绘制实现
不需要特意记录海龟bob绘制边时的朝向角度,你已经保存了三个顶点的坐标,直接通过坐标计算每条边的垂直方向即可,这种方式比记录海龟状态更稳定,不会因为海龟移动、转向的状态偏差导致角度错误。
计算逻辑
任意一条边的垂直方向角度计算规则:
- 设边的两个端点为(x1,y1)、(x2,y2),先算边的横纵差:
dx = x2 - x1,dy = y2 - y1 - 对应垂直方向的角度可以通过反正切函数直接换算为turtle支持的角度值:
perp_angle = math.degrees(math.atan2(dx, -dy)) - 海龟移动到边的中点后,先朝这个角度走固定长度,再掉头朝反方向走相同长度,就能画出完整的过中点的垂线
完整可运行代码
import turtle import math tur = turtle.Turtle() # 绘制点击点 bob = turtle.Turtle() # 绘制三角形边 l1 = turtle.Turtle() # 绘制第一条边的中垂线 l2 = turtle.Turtle() # 绘制第二条边的中垂线 l3 = turtle.Turtle() # 绘制第三条边的中垂线 mid = turtle.Turtle() # 预留中垂线交点绘制 screen = turtle.Screen() screen.tracer(0,0) screen.setup(800,800) # 初始化所有海龟 for t in [tur, bob, l1, l2, l3, mid]: t.ht() t.up() t.speed(0) PERPENDICULAR_LENGTH = 400 # 中垂线单侧绘制长度,可按需调整 dots = 1 def draw_perpendicular(p1, p2, draw_tur): """传入边的两个端点p1/p2,和负责绘制的海龟,画出该边的中垂线""" x1, y1 = p1 x2, y2 = p2 # 计算中点 mid_x = (x1 + x2) / 2 mid_y = (y1 + y2) / 2 # 计算垂直方向角度 dx = x2 - x1 dy = y2 - y1 perp_angle = math.degrees(math.atan2(dx, -dy)) # 移动到中点 draw_tur.goto(mid_x, mid_y) draw_tur.dot() # 向一侧画 draw_tur.setheading(perp_angle) draw_tur.down() draw_tur.forward(PERPENDICULAR_LENGTH) # 回到中点向另一侧画 draw_tur.goto(mid_x, mid_y) draw_tur.setheading(perp_angle + 180) draw_tur.forward(PERPENDICULAR_LENGTH) draw_tur.up() def lines(): # 三个顶点坐标打包成元组方便传参 p1 = (bob_x1, bob_y1) p2 = (bob_x2, bob_y2) p3 = (bob_x3, bob_y3) # 分别画三条边的中垂线 draw_perpendicular(p1, p2, l1) draw_perpendicular(p2, p3, l2) draw_perpendicular(p1, p3, l3) def dotOnClick(x,y): global dots, bob_x1, bob_y1, bob_x2, bob_y2, bob_x3, bob_y3 # 超出屏幕范围的点击不处理 if not (-800 <= x <= 800 and -800 <= y <= 800): return if dots == 1: tur.goto(x,y) bob.goto(tur.pos()) bob_x1, bob_y1 = bob.pos() tur.dot() bob.down() screen.update() dots = 2 elif dots == 2: tur.goto(x,y) bob.goto(tur.pos()) bob_x2, bob_y2 = bob.pos() tur.dot() screen.update() dots = 3 elif dots == 3: tur.goto(x,y) bob.goto(tur.pos()) bob_x3, bob_y3 = bob.pos() tur.dot() bob.goto(bob_x1,bob_y1) # 闭合三角形 lines() # 绘制所有中垂线 screen.update() dots = 4 elif dots == 4: # 清空所有海龟的绘制内容并重置状态 for t in [tur, bob, l1, l2, l3]: t.clear() t.reset() t.ht() t.up() t.speed(0) screen.update() dots = 1 turtle.onscreenclick(dotOnClick,1,True) turtle.done()
改动说明
- 移除了冗余的全局中点变量,中点计算直接整合到垂线绘制函数中,减少全局变量维护成本
- 补全了重置逻辑:原代码重置时没有清空
l1/l2/l3的绘制内容,多次点击生成三角形会残留旧的垂线痕迹 - 中垂线长度抽成了全局常量,需要调整垂线长短直接修改
PERPENDICULAR_LENGTH的数值即可 - 把重复的海龟初始化代码改成循环批量处理,减少重复代码
内容的提问来源于stack exchange,提问作者beginnercoder
相关产品推荐
相关产品推荐

