如何计算点B相对于点A的左右侧位置(JavaScript实现)
判断点B位于点A朝向的左侧/右侧(JavaScript实现)
前置约定
- 坐标系规则:正北为Y轴正方向,正东为X轴正方向
- 点A的朝向角为正北顺时针计量的角度值,单位为度
计算逻辑
不需要复杂的数学推导,直接按以下三步计算即可:
- 将点A的朝向角转换为面朝方向的单位向量
- 计算从点A指向点B的位移向量
- 计算两个向量的二维叉积,通过叉积的符号直接判断左右:
- 叉积 > 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
相关产品推荐
相关产品推荐

