基于角度与半径计算Google Maps路径转弯的笛卡尔坐标点
基于转弯半径的折线拐点平滑方案(Google Maps JS API)
针对你要实现的车辆转弯路径模拟需求,以下是近似计算P1、P2和贝塞尔参考点的实用方法(无需高精度,满足大致引导曲线即可):
前提定义
- 拐点:
B(原折线A→B→C的转角点) - 折线两端点:
A、C - 内角:
a(∠ABC的角度,单位:弧度) - 转弯半径:
r
步骤1:计算单位方向向量
从拐点B出发,计算指向A和C的归一化单位向量(长度为1):
// 笛卡尔坐标下的向量计算 const v1 = { x: A.x - B.x, y: A.y - B.y }; const len1 = Math.sqrt(v1.x**2 + v1.y**2); const u1 = { x: v1.x / len1, y: v1.y / len1 }; // 指向A的单位向量 const v2 = { x: C.x - B.x, y: C.y - B.y }; const len2 = Math.sqrt(v2.x**2 + v2.y**2); const u2 = { x: v2.x / len2, y: v2.y / len2 }; // 指向C的单位向量
步骤2:计算曲线起止点P1、P2
P1是BA线段上距离B点r的点,P2是BC线段上距离B点r的点:
// P1:从B向A方向移动r距离 const P1 = { x: B.x + u1.x * r, y: B.y + u1.y * r }; // P2:从B向C方向移动r距离 const P2 = { x: B.x + u2.x * r, y: B.y + u2.y * r };
步骤3:计算贝塞尔曲线的绿色参考点
参考点需落在转弯内侧区域,通过角平分线偏移方式近似计算:
- 计算角平分线的单位向量(指向转角内侧):
// 角平分线方向向量(u1 + u2),再归一化 const bisector = { x: u1.x + u2.x, y: u1.y + u2.y }; const bisectorLen = Math.sqrt(bisector.x**2 + bisector.y**2); const uBisector = { x: bisector.x / bisectorLen, y: bisector.y / bisectorLen }; - 从B点沿着角平分线反方向(转角内侧)移动
r距离,得到参考点G:// 反方向移动,所以乘以-1;若内角a为钝角(>180°)则去掉负号 const G = { x: B.x + uBisector.x * (-r), y: B.y + uBisector.y * (-r) };
最终曲线绘制
用二次贝塞尔曲线连接P1 → G → P2,再将A→P1和P2→C用直线连接,即可得到近似的转弯路径。
简化版(更粗略但够用)
如果不需要精准度,可直接将B点向转角内侧移动r距离作为参考点,偏移方向用(u1.x + u2.x, u1.y + u2.y)的归一化向量即可,省去角度计算。
内容的提问来源于stack exchange,提问作者girlcode
相关产品推荐
相关产品推荐

