我有起点和终点,以及曲线在这些点上的斜率值。现在,我必须通过两个给定的点绘制一条"平滑的2D贝塞尔曲线"。现在如何定位两个控制点来实现这一点。有什么办法吗?我知道控制点必须位于各自起点和终点的切线上。
- 注:所谓"平滑曲线",我的意思是在最终的绘图中不应该有陡峭的曲线或转弯
在这种情况下,听起来你有一个catmull rom曲线坐标(两个点,以及它们的出发切线和到达切线)https://pomax.github.io/bezierinfo/#catmullconv涵盖了将这些坐标转换为贝塞尔坐标所需的所有数学运算。如果你不在乎"如何",只需跳到本节的末尾,了解直接的转换规则。
tl;dr版本:将坐标改写为Catmull形式:
[P1, v1, v2, P2] -> [P1 - v1, P1, P2, P2 + v2]
然后我们将其转换为贝塞尔坐标:
P1 <= P1
p2 <= P1 - (P2 - P1 - v1) / 6 * f
p3 <= P2 + (P2 + v2 - P1) / 6 * f
p4 <= P2
CCD_ 1是张力常数。玩吧。它通常是1,但可能并不取决于这些切线的强度。
对于由P0、P1、P2和P3定义的三次贝塞尔曲线,其中P0和P3是起点和终点,其在t=0和t=1处的一阶导数向量是
C'(t=0)=3*(P1-P0)
C'(t=1)=3*(P3-P2)
因此,如果你已经知道起点和终点的斜率,你可以很容易地将其转换为切线向量,并找到控制点P1和P2。您确实需要为一阶导数向量指定适当的幅值,以便最终生成的曲线不具有拐点。但是,只要你确保P0、P1、P2和P3形成的控制多边形是凸的,那么你的三次贝塞尔曲线应该是平滑的,没有转折点。