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

TS下斜率0/无穷大正交线角平分线计算失效问题求解

问题示意图

问题描述

需要沿黑色路径计算蓝线与红线的角度,要求蓝线、红线可平分相邻点位形成的夹角。已尝试两种实现方案,但在高亮标记的点位处均计算失败。

已尝试的实现方案

方案1:相邻线段中点正交线交点作为参考点

取相邻线段中点引出的两条正交线的交点作为计算参考点,实现代码如下:

const mP1 = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 },
  mP2 = { x: (p2.x + p3.x) / 2, y: (p2.y + p3.y) / 2 };
// 计算正交线斜率 ->  -1/原线段斜率
const pS1 = -1 / ((p2.y - p1.y) / (p2.x - p1.x)),
  pS2 = -1 / ((p3.y - p2.y) / (p3.x - p2.x));
// 计算斜率交点参数
const j = (pS1 * (mP1.x - mP2.x) - mP1.y + mP2.y) / (pS1 - pS2);
// 交点坐标
const iP = { x: p2.x + j, y: p2.y + j * ((pS1 + pS2) / 2) };
// 计算相交线斜率
const iS = (p2.y - iP.y) / (p2.x - iP.x);

方案2:三角形内心作为参考点

计算相邻三个点构成三角形的内心作为计算参考点,实现代码如下:

// 计算各边向量
const a1 = p1.x - p2.x,
  b1 = p1.y - p2.y,
  a2 = p2.x - p3.x,
  b2 = p2.y - p3.y,
  a3 = p3.x - p1.x,
  b3 = p3.y - p1.y;
// 计算各边长度
const d1 = Math.sqrt(a1 * a1 + b1 * b1),
  d2 = Math.sqrt(a2 * a2 + b2 * b2),
  d3 = Math.sqrt(a3 * a3 + b3 * b3);

// 内心坐标
const iP = {
  x: (d1 * p1.x + d2 * p2.x + d3 * p3.x) / (d1 + d2 + d3),
  y: (d1 * p1.y + d2 * p2.y + d3 * p3.y) / (d1 + d2 + d3)
};
// 计算相交线斜率
const iS = -1 / (p2.y - iP.y) / (p2.x - iP.x);
现存问题

在相邻两点连线斜率为0或斜率不存在(无穷大)的边界场景下,上述两种方法均无法计算得到有效斜率值。

可行解决思路

所有依赖斜率计算的方案天生存在边界缺陷:垂直线段斜率无穷大、水平线段正交线斜率为0,只要涉及斜率倒数计算就必然触发除零错误。直接抛弃斜率计算逻辑,改用向量运算即可覆盖所有场景,不需要额外求参考交点:

  • 第一步:计算两个相邻边的方向向量,分别归一化为单位向量
    // p1->p2 方向向量及单位向量
    const v1x = p2.x - p1.x, v1y = p2.y - p1.y;
    const len1 = Math.hypot(v1x, v1y);
    const u1x = v1x / len1, u1y = v1y / len1;
    // p2->p3 方向向量及单位向量
    const v2x = p3.x - p2.x, v2y = p3.y - p2.y;
    const len2 = Math.hypot(v2x, v2y);
    const u2x = v2x / len2, u2y = v2y / len2;
    
  • 第二步:两个单位向量相加,得到的向量就是夹角的角平分线方向(从p2点出发指向夹角内侧),对应需要的红/蓝线的法线方向
    const bisectX = u1x + u2x, bisectY = u1y + u2y;
    
  • 第三步:角平分线的垂直方向就是路径的切线方向,直接交换向量x、y分量,对任意一个分量取反即可,不需要额外计算参考点
    // 切线方向向量
    const tangentX = -bisectY, tangentY = bisectX;
    
  • 第四步:角度计算直接用Math.atan2(tangentY, tangentX)获取弧度值,全程没有除零风险,水平、垂直、任意角度的线段都能正常计算。

补充说明:方案2的内心坐标公式本身有误,三角形内心坐标的权重是各顶点对应对边的长度,不是相邻边长度,即使不考虑边界问题,计算出的参考点位置本身就是错的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:33:21