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

如何计算点B相对于点A的左右侧位置(JavaScript实现)

判断点B位于点A朝向的左侧/右侧(JavaScript实现)

前置约定

  • 坐标系规则:正北为Y轴正方向,正东为X轴正方向
  • 点A的朝向角为正北顺时针计量的角度值,单位为度

计算逻辑

不需要复杂的数学推导,直接按以下三步计算即可:

  1. 将点A的朝向角转换为面朝方向的单位向量
  2. 计算从点A指向点B的位移向量
  3. 计算两个向量的二维叉积,通过叉积的符号直接判断左右:
    • 叉积 > 0:点B在点A朝向的左侧
    • 叉积 < 0:点B在点A朝向的右侧
    • 叉积 = 0:点B在点A朝向的正前方/正后方共线位置

JavaScript实现代码

/**
 * 判断点B在点A朝向的左侧还是右侧
 * @param {number} ax 点A的X坐标
 * @param {number} ay 点A的Y坐标
 * @param {number} aHeadingDeg 点A的朝向角(正北顺时针,单位:度)
 * @param {number} bx 点B的X坐标
 * @param {number} by 点B的Y坐标
 * @returns {number} 1=左侧,-1=右侧,0=共线
 */
function judgeLeftOrRight(ax, ay, aHeadingDeg, bx, by) {
  // 角度转弧度
  const headingRad = aHeadingDeg * Math.PI / 180;
  // 点A的朝向单位向量
  const dirX = Math.sin(headingRad);
  const dirY = Math.cos(headingRad);
  // A指向B的位移向量
  const abX = bx - ax;
  const abY = by - ay;
  // 计算二维叉积
  const cross = dirX * abY - dirY * abX;
  
  // 处理浮点计算误差,小于极小值认为是共线
  const epsilon = 1e-8;
  if (Math.abs(cross) < epsilon) return 0;
  return cross > 0 ? 1 : -1;
}

使用示例

// 示例:点A坐标(0,0),朝向正北(0度),点B坐标(1,0)(正东位置)
const res = judgeLeftOrRight(0, 0, 0, 1, 0);
console.log(res); // 输出-1,代表右侧,符合面朝北时东侧为右侧的常识

结果说明

  • 返回1:点B位于点A朝向的左侧
  • 返回-1:点B位于点A朝向的右侧
  • 返回0:点B与点A朝向共线,位于正前方或正后方

如果需要额外区分共线时是正前方还是正后方,补充计算两个向量的点积即可:点积>0为正前方,点积<0为正后方。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:24:04