如何计算Python Turtle库中圆形海龟对象的半径?
解决Turtle圆形对象碰撞检测中的半径计算矛盾问题
你遇到的矛盾本质是自定义世界坐标的宽高比与窗口实际宽高比不匹配导致的:
默认情况下,Turtle的圆形海龟是正圆,但当你通过setworldcoordinates(-worldsize, -worldsize, worldsize, worldsize)强制世界坐标为正方形时,如果窗口本身不是正方形(全屏模式下通常不是),x轴和y轴上的"世界单位→像素"映射比例就会不一样,圆形会被拉伸成椭圆,因此计算出来的x、y方向半径(rx、ry)自然不相等。
解决方法
1. 让世界坐标宽高比匹配窗口
调整世界坐标范围,使其与窗口的实际宽高比一致,这样圆形海龟不会被拉伸,rx和ry会相等,就能用标准的圆形碰撞检测:
import turtle as t screen = t.Screen() screen.setup(1.0, 1.0) screen.bgcolor("#000") worldsize = 100 # 获取窗口宽高比 width = screen.window_width() height = screen.window_height() aspect_ratio = width / height # 根据宽高比调整世界坐标 if aspect_ratio > 1: # 窗口更宽,缩小y轴范围 screen.setworldcoordinates(-worldsize, -worldsize/aspect_ratio, worldsize, worldsize/aspect_ratio) else: # 窗口更高,缩小x轴范围 screen.setworldcoordinates(-worldsize*aspect_ratio, -worldsize, worldsize*aspect_ratio, worldsize) obj = t.Turtle("circle") size = 5 obj.shapesize(size, size) obj.goto(50, 50) # 此时计算的半径在x、y方向一致 radius = 10 * size * worldsize / width if aspect_ratio > 1 else 10 * size * worldsize / height
2. 直接使用世界坐标单位计算半径
如果不需要像素转换,可直接基于世界坐标计算海龟的半径。默认shapesize(size, size)是将默认直径为1世界单位的圆放大size倍(默认海龟大小对应1世界单位),所以半径可简化为:
radius = size * 0.5
这种方式无需考虑像素映射,直接在世界坐标系统内做碰撞检测(判断两个海龟中心的距离是否小于半径之和)。
3. 椭圆碰撞检测(不推荐,复杂)
如果必须保留非正方形的世界坐标,只能将海龟当作椭圆处理,使用椭圆间的碰撞检测算法。但这种方法计算量更大,不如第一种方法简洁可靠。
内容的提问来源于stack exchange,提问作者yungmaz13
相关产品推荐
相关产品推荐

