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

如何优化笛卡尔平面中射线方向判断函数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:42:41