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

判断点是否位于中心点的两个方位角所形成的扇形区域内

Hey there! 判断点D是否落在以A为中心、由B和C的方位角界定的扇形区域里,确实容易在角度范围和顺逆时针逻辑上踩坑,我来分享几个靠谱的思路和伪代码,帮你理清这个问题~

先明确核心前提

首先要确认你的方位角定义是统一的:通常行业内默认是从正北(0°)顺时针旋转到目标方向,范围0-360°。如果你的场景是逆时针定义(比如从正东逆时针转),后续逻辑只需要对应调整方向即可,核心思路是通用的。

核心解决思路

我们只需要关注三个方位角:A到B的az_B、A到C的az_C、A到D的az_D。关键是判断az_D是否落在az_B和az_C构成的扇形区间内,这里要区分两种情况:扇形是「小扇形」(夹角≤180°)还是「大扇形」(夹角>180°)。

第一步:标准化所有角度

先把所有方位角统一到0-360°范围内,避免负数或超范围的情况:

function normalizeAngle(angle) {
    // 处理负数和超过360的角度,返回0-360之间的标准值
    return (angle % 360 + 360) % 360;
}

第二步:判断扇形归属的完整逻辑

下面的伪代码直接解决顺逆时针和角度范围的问题:

function isPointInSector(az_B, az_C, az_D) {
    // 先标准化所有方位角
    az_B = normalizeAngle(az_B);
    az_C = normalizeAngle(az_C);
    az_D = normalizeAngle(az_D);

    // 计算从az_B顺时针转到az_C的总角度差
    const clockwiseDiffFromBToC = (az_C - az_B + 360) % 360;
    // 计算从az_B顺时针转到az_D的角度差
    const clockwiseDiffFromBToD = (az_D - az_B + 360) % 360;

    if (clockwiseDiffFromBToC <= 180) {
        // 情况1:小扇形——D的顺时针偏移量在az_B到az_C的区间内
        return clockwiseDiffFromBToD <= clockwiseDiffFromBToC;
    } else {
        // 情况2:大扇形——此时有效区域是顺时针差之外的部分(等价于逆时针的小扇形)
        return clockwiseDiffFromBToD > clockwiseDiffFromBToC;
    }
}

关键细节说明

  1. 边界处理:上面的代码会把刚好落在az_B或az_C上的点判定为在扇形内,如果需要排除边界,只需要把<=换成<、>换成>=即可。
  2. 无距离限制适配:因为题目明确无距离限制,所以代码里完全不需要考虑AD的长度,只判断方位角就足够了。
  3. 方向兼容:如果你的方位角是逆时针定义的,只需要把所有「顺时针差」换成「逆时针差」(即计算(az_B - az_C + 360) % 360),逻辑完全通用。

测试示例验证

  • 示例1:az_B=90°(正东)、az_C=180°(正南),az_D=135° → 返回true(在小扇形内)
  • 示例2:az_B=350°、az_C=10°,az_D=5° → 返回true(覆盖350°-360°和0°-10°的区间)
  • 示例3:az_B=90°、az_C=280°,az_D=0° → 返回true(大扇形覆盖280°-360°和0°-90°的区间)

内容的提问来源于stack exchange,提问作者rowanwins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:02:41