判断点是否位于中心点的两个方位角所形成的扇形区域内
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; } }
关键细节说明
- 边界处理:上面的代码会把刚好落在
az_B或az_C上的点判定为在扇形内,如果需要排除边界,只需要把<=换成<、>换成>=即可。 - 无距离限制适配:因为题目明确无距离限制,所以代码里完全不需要考虑AD的长度,只判断方位角就足够了。
- 方向兼容:如果你的方位角是逆时针定义的,只需要把所有「顺时针差」换成「逆时针差」(即计算
(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
相关产品推荐
相关产品推荐

