Rah*_*jee 16
如果我理解正确的话,你试图在每个点确定贝塞尔的位置和斜率(曲线的切线).
假设你的起点是(ax,ay),终点是(dx,dy),你的控制点是(bx,by)和(cx,cy).
位置很容易.首先,计算混合函数.它们控制着控制点在曲线上的"效果".
B0_t = (1-t)^3
B1_t = 3 * t * (1-t)^2
B2_t = 3 * t^2 * (1-t)
B3_t = t^3
Run Code Online (Sandbox Code Playgroud)
注意当t为0时,B0_t为1(其他一切为零).此外,当t为1时,B3_t为1(其他一切都为零).因此曲线从(ax,ay)开始,到(dx,dy)结束.
任何中间点(px_t,py_t)将由以下给出(从0到1变化t,在循环内以小增量变化):
px_t = (B0_t * ax) + (B1_t * bx) + (B2_t * cx) + (B3_t * dx)
py_t = (B0_t * ay) + (B1_t * by) + (B2_t * cy) + (B3_t * dy)
Run Code Online (Sandbox Code Playgroud)
斜坡也很容易做到.使用/sf/answers/286400131/中给出的方法
B0_dt = -3(1-t)^2
B1_dt = 3(1-t)^2 -6t(1-t)
B2_dt = - 3t^2 + 6t(1-t)
B3_dt = 3t^2
Run Code Online (Sandbox Code Playgroud)
所以,x和y的变化率是:
px_dt = (B0_dt * ax) + (B1_dt * bx) + (B2_dt * cx) + (B3_dt * dx)
py_dt = (B0_dt * ay) + (B1_dt * by) + (B2_dt * cy) + (B3_dt * dy)
Run Code Online (Sandbox Code Playgroud)
然后Math.atan2(py_dt,px_dt)用来获得角度(以弧度表示).