如何优化笛卡尔平面中射线方向判断函数的if-else语句?
更简洁的射线象限判断实现
当然有更简洁的写法!你的原函数逻辑是对的,但确实存在重复的区间判断,我们可以通过两种思路来简化代码,同时保持逻辑清晰:
方法一:利用三角函数符号特性
借助三角函数的符号直接映射象限方向,代码会非常简洁:
import math def direction(self): rad = math.radians(self.angle) # cos的符号对应x方向:正→1,负→-1 x_dir = int(math.copysign(1, math.cos(rad))) # sin的符号对应y方向:正→1,负→-1 y_dir = int(math.copysign(1, math.sin(rad))) return (x_dir, y_dir)
逻辑说明
- 余弦函数
cos(θ)在第一、四象限为正,第二、三象限为负,刚好对应x轴的方向; - 正弦函数
sin(θ)在第一、二象限为正,第三、四象限为负,刚好对应y轴的方向; math.copysign(1, num)会返回一个与num符号相同的1或-1,完美匹配我们需要的方向值。
方法二:简化区间判断逻辑
如果不想引入三角函数依赖,我们可以直接对角度的范围做更紧凑的判断:
def direction(self): # x方向:角度绝对值在90-180之间时为-1,否则为1 x_dir = -1 if 90 < abs(self.angle) < 180 else 1 # y方向:角度为正时为1,负时为-1 y_dir = 1 if self.angle > 0 else -1 return (x_dir, y_dir)
逻辑说明
- 把四个象限的判断拆成x和y两个独立的维度:
- x轴方向只需要看角度是否在第二、三象限(绝对值90-180);
- y轴方向只需要看角度的正负(正为上半平面,负为下半平面)。
补充:处理边界角度
原函数没有处理角度刚好为0°、90°、-90°、180°的情况(这些属于坐标轴方向,而非象限),如果需要覆盖这些场景,可以在函数开头补充边界判断:
def direction(self): if self.angle == 90: return (0, 1) elif self.angle == -90: return (0, -1) elif abs(self.angle) == 180: return (-1, 0) elif self.angle == 0: return (1, 0) x_dir = -1 if 90 < abs(self.angle) < 180 else 1 y_dir = 1 if self.angle > 0 else -1 return (x_dir, y_dir)
内容的提问来源于stack exchange,提问作者pytherhub
相关产品推荐
相关产品推荐

