You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:06:10