python海龟绘图之计算夹角towards()

1 towards()函数的作用

towards()函数返回从海龟当前位置到由 (x, y) 指定的位置、向量或另一只海龟的连线之间的角度。该角度指的是从海龟位置指向目标点的那条射线,与海龟坐标系中 0° 方向射线之间的夹角(从 0° 方向逆时针测量到该射线的角度),其值为浮点数。

2 toward()函数的用法

toward()函数有如下所示的三种格式。

python 复制代码
turtle.towards(x, y)        # 目标坐标

turtle.towards(Vec2D)     # 目标向量

turtle.towards(other_turtle) # 另一只海龟

3.1 turtle.towards(x, y)的用法

turtle.towards(x, y)中,x和y分别表示目标位置的横纵坐标,用法的代码如图1所示。

图1 turtle.towards(x, y)用法的代码

其中,第3行代码将海龟t1移动到(100, 100),第4行代码打印从海龟当前位置(100, 100)作为起点,指向目标点(0, 0)的射线,与海龟坐标系中 0° 方向射线之间的夹角,也就是225.0。原理如图2所示。

图2 towards()函数原理

从图2中可以看出,towards()函数的返回值是海龟坐标系中 0° 方向射线逆时针旋转到当前位置与目标位置射线的的角度。

3.2 turtle.towards(Vec2D)的用法

使用turtle.towards(Vec2D)中Vec2D指的是turtle.Vec2D,表示位置的类型。代码如图3所示。

图3 turtle.towards(Vec2D)的代码

其中,第3行代码通过t1.pos()获取海龟的当前位置,其类型为turtle.Vec2D。第5行代码通过turtle.towards(Vec2D)的方式获取与0°方向射线的夹角,其值依然是225.0°。

3.3 turtle.towards(other_turtle)的用法

turtle.towards(other_turtle)中的other_turtle表示另外一支海龟,此时该函数返回的是两只海龟位置的连线与0°方向射线的夹角,代码如图4所示。

图4 turtle.towards(other_turtle)的代码

其中,第2和第3行代码分别生成t1和t2两只海龟。第4行代码将t1移动到(100, 100)处,第5行代码将t2移动到(-100, 100)处。此时,打印出的角度是180.0°。原理如图5所示。

图5 代码运行原理

4 应用场景

4.1 让海龟转向目标点

假设目标点的坐标是s(target_x, target_y),通过以下代码可以让海龟转向目标点。

python 复制代码
t.setheading(t.towards(target_x, target_y))

4.2 计算两个海龟之间的相对方向

通过"3.3 turtle.towards(other_turtle)的用法"中提到的方法实现。

4.3 判断目标在海龟的哪一侧(结合当前朝向)

假设目标点坐标为(x, y),海龟为t,通过以下代码可以判断目标点(x,y)在海龟t的左侧还是右侧。

python 复制代码
diff = t.towards(x, y) - t.heading()

diff = (diff + 180) % 360 -- 180

当diff>0时表示目标点在海龟左侧,diff<0是表示在海龟右侧。

5 小结

towards()函数返回从海龟当前位置到指定位置的射线与表示海龟方向0°的射线之间的夹角。该夹角为海龟方向0°的射线逆时针转到位置连线的角度,该角度为浮点型。可以通过三种方式获取该角度。在让海龟转向目标点、计算两个海龟之间的相对方向以及判断目标在海龟的哪一侧等场景时可以用到towards()函数。

相关推荐
Vect__6 小时前
C++无痛转go第一天,从hello world到切片
开发语言·c++·golang
yugi9878386 小时前
MATLAB 实现平板裂纹扩展模拟、气孔/夹杂物分析
开发语言·matlab
码流怪侠6 小时前
【GitHub】TextGen:开源本地大模型运行平台的终极解决方案
python·程序员·github
青山师6 小时前
Java注解深度解析:从元数据机制到框架开发基石
java·开发语言·注解·javase·java面试·后端开发·java核心
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题】【Java基础篇】第35题:怎样声明一个类不会被继承?什么场景下会用
java·开发语言·后端·面试
2301_782040456 小时前
JavaScript中Map在频繁增删键值对场景下的稳定性
jvm·数据库·python
游乐码6 小时前
c#特殊语法
开发语言·c#
Jelena157795857927 小时前
Python 爬虫获取淘宝商品详情(标题、主图、SKU、价格)实战指南
网络·爬虫·python
无限进步_7 小时前
【C++】AVL树完全解析:从平衡因子到四种旋转
c语言·开发语言·数据结构·c++·后端·算法·github
大厂数码评测员7 小时前
2026 年家庭菜谱记录工具怎么选:从功能边界和小程序代码实现看免费与付费差异
java·开发语言·apache