我正在构建一个 Google Maps Javascript API 应用程序,允许用户绘制多条折线的路径,计算角度,然后尝试弯曲角度,模拟车辆转弯半径。为此,我需要曲线开始和停止的点。问题是这些角度可以在地图上的任何方向,我正在努力寻找合适的方法来计算这些点的(X,Y)坐标......我可以计算大小,但由于不同的方向,我不确定如何将它恢复到一组笛卡尔坐标。这是几何的轮廓:
最终,我有了A、B、C点,角度a,和圆的半径。鉴于此,我如何根据笛卡尔坐标计算点 P1、P2 和(未标记)贝塞尔曲线的绿色参考点?这些点不必具体,只是在一般区域引导曲线。
制作向量
BA
和BС
BA.x = A.x-B.x
BA.y = A.y-B.y etc
制作单位向量
len(BA) = sqrt(BA.x*BA.x+BA.y*BA.y)
uBA = BA / len(BA) (uBA.x = BA.x/len(BA) etc)
uBC = BC / len(BC)
获取向量夹角的余弦
cs = cos(fullangle) = dot(uBA, uBC) = uBA.x*uBC.x + uBA.y*ubC.y
获取半角的切线
tn = sqrt((1-cs)/(1+cs))
计算点以提供从平分线到线的正常距离
R
P1 = B + uBA * R / tn (P1.x = B.x + uBA.x * R / tn etc)
P2 = B + uBC * R / tn
注意贝塞尔曲线和直线的平滑共轭需要控制点在直线上,所以
C1 = P1 - uBA * R * coeff
C2 = P2 - uBC * R * coeff
系数应适应“智能曲线”外观,可能在 0.3..1. 范围内
coeff=0.552
对于直角线给出几乎完美的圆弧。
一般
coeff = 4/3*tg(angle/4)
是很好的近似值