【Re:PhiEdit / RPE】 曲线轨迹教程 ·【三】切线与螺旋线
# 在这里做一个关于父线芝士的预告!这篇写完之后我会对父线进行讲解!
【切线】
整了这么些轨迹,有同学可能会发现,我们不只是希望判定线的锚点能够沿曲线轨迹运动,我们还希望判定线可以沿切线方向贴合曲线运动。
但是这玩意挺复杂的()
对于一般的圆弧或者是圆,这个问题还好解决。这里提供常规解法:
你可以将整个轨迹的圆心标注出来,将圆弧的起点与终点和圆心相连,如图。


然后,我们作出它的切线。我们令B为起点,C为终点,那么我们可以得到 与
水平方向的夹角 α 与 β ,如上图。接下来我们添加一个rotate事件,使其开始值为 α ,结束值为 β,使用与运动轨迹相同的缓动,即可完成切线的制作,如下图。
(方程:400*cos(0.5*Pi*$t$+0.25*Pi)、400*sin(0.5*Pi*$t$+0.25*Pi),分别使用缓动1与2)


对于复杂轨迹的切线,你有三个选择:
第一个,对轨迹导后微元,丢进反三角函数求角度,再切rotate事件手动填数据。这个方法很复杂而且仍然有局限性,本教程不作阐述。
第二个,使用仍在内测中的的切线生成功能。
第三个,开摆(x)

【螺旋线】
螺旋线同样是一个很常用的东西,它有两种实现方法。第一种是使用多个半圆进行拼接,第二种是直接修改参数方程。在此我会以第二种方法为主(第一种应该很好想到罢())。
当你只需要匀速螺旋时,第一种方法可以适用,但是对于整体变速的螺旋运动,半圆拼接会变得不方便。
想象一下,螺旋线可以理解为一个点沿着一个半径不断缩小的“圆”运动,如图。

那这就好办了,我们可以直接在原本的x y方程的基础上乘一个系数 (1-$t$),使得这个圆的“半径”——A(A sin(ωx+φ)+b)不断缩小。
而且,这个系数不仅可以是(1-$t$),还可以是 (1-sin($t$))、(1-$t$^2) 等系数,这可以使这个圆的半径以不同的缓动缩小。下图是上述三个系数的对比。



非常令人高兴的是,由于这些轨迹都是同一个圆的半径不断缩小产生的,这些轨迹的切线写法与普通的圆是一致的!也就是说,它的切线所使用的缓动和上文的圆一样,同样只取决于x/y侧的时间缓动,与你选用的半径缩小的参数(1-$t$、1-sin($t$)、1-$t$^2)无关。
如图,以1-sin($t$)为例。上图中1-sin($t$)的结束轨迹稍微有点渲染问题,实际上其切线角度是0°。


好了,快去试试吧!
本教程中的动图与图片均为我使用 Desmos 和 GeoGebra 制作。
当然也包括 Re:PhiEdit 。