3

在开始这个问题之前,我使用 P0、P1、P2 和 P3 来表示四个三次贝塞尔点,并使用“t”,因为它是参数化的。另外,我在这个站点以及谷歌中搜索过类似的问题,但找不到。如果这是一个常见问题,我深表歉意。

问题:在这两种情况下,三次贝塞尔曲线的 dx/dt 和 dy/dt 的斜率均为 0

1: t = 0 and P0 == P1
2: t = 1 and P2 == P3

这是一个示例来说明 (1),其中 t = 0 且 P0 == P1。

求下列三次贝塞尔曲线在 t = 0 处的切线(即 dx/dt 和 dy/dt):

(100, 100) (100, 100) (150, 150) (200, 100)

为了求切线,我们需要三次贝塞尔曲线的一阶导数:

Cubic Bezier definition
B(t) = (1-t)^3P0 + 3t(1-t)^2P1 + 3t^2(1-t)P2 + t^3P3    
First derivative of a bezier curve (if you'd like to see the steps I used to get here, let me know)
B'(t) = (-3P0 + 9P1 - 9P2 + 3P3)t^2 + (6P0 - 12P1 + 6P2)t + (-3P0 + 3P1)

将 t = 0 代入一阶导数方程,我们得到

B'(0) = -3P0 + 3P1

最后,回想一下 P0 = P1 = (100, 100),所以 dx/dt 和 dy/dt 是:

dx/dt = dy/dt = -3*(100) + 3*(100) = 0

这告诉我......对于这个三次贝塞尔曲线,在 t = 0 处没有切线。如果您要绘制图表并查看它,这是没有意义的。

为了得到非零斜率,我所做的是:将点 P1、P2 和 P3 视为二次贝塞尔曲线,将它们转换为等效的三次贝塞尔曲线,然后在 t = 0 处找到一阶导数。有没有我可以避免这样做吗?我发现很难接受 dx/dt 和 dy/dt 为 0 的切线。谢谢你的帮助。

4

2 回答 2

2

对于案例 1(以及对于案例 2),导数B'(t)att = 0确实是未定义的。t = 1

要了解为什么会出现这种情况,我们可以在您的示例上“向后”运行 de Casteljau 算法,以将曲线的参数范围从 到t = 0 ... 1加倍t = -1 ... 1。这会产生以下三次贝塞尔曲线控制点:

(300,400) (0,-100) (100,200) (200,100)

如果你绘制这条曲线,你会看到你的原始曲线t = 0.5 ... 1。您还会看到t = 0.5在这条延长曲线上有一个尖点,就在原始曲线的开头。这个尖点就是为什么你的曲线在起点是不可微的。

但是,曲线的切线与导数并不完全相同。因此,如果您只需要切线,那么您很幸运。(导数与曲线相切,但任何其他垂直于曲线法线的向量也是如此。)

事实证明,曲线末端的切线通常等价于:

P1 - P0 at t = 0
P3 - P2 at t = 1

但是,如果(且仅当)P0 = P1和/或P2 = P3,则退化点处的切线(即在t = 0ifP0 = P1和/或t = 1if处P2 = P3)等价于:

P2 - P1

B'(t)您可以通过评估as来验证情况是否如此t->0

事实上,如果你将延伸曲线一分为二,t = 0.5然后将P2 - P1方程应用于每一侧,你会看到在尖端有两条不同的切线。曲线每一半的切线指向完全相反的方向。这是为什么此时导数未定义的另一个说明。

最后一点:您将点 P1、P2 和 P3 视为二次贝塞尔曲线的技巧也会为您提供正确的切线。但是,这不会为您提供正确的导数。

于 2012-05-09T02:55:45.340 回答
1

这个问题已经得到正确回答,但我想你想知道基础数学:

您正在寻找三次贝塞尔曲线的末端斜率。由于曲线(即它的 x 和 y 值)在 t 中是参数化的,因此您将分别区分 x 和 y wrt t。您到达的对可以被认为是沿曲线行进的点的瞬时“速度”。因此,在这种情况下,点的初始速度为零(或更准确地说是零向量),但(很可能)加速度(或如果失败,至少加速度的变化率)将不为零,因此点的速度将变为非零(非零向量),因此它将从这些坐标移动并追踪曲线。

但是您在视觉上看到的斜率不是参数化的,即它不依赖于时间。IOW 您正在寻找的是 dy/dx,而不是对 (dx/dt, dy/dt),并且假设 dx/dt 和 dy/dt 在 t=0 时对于您的曲线都为零,dy/dx = (dy/dt)/(dx/dt) = 0/0,这是不确定的。要评估这一点,必须应用 L'Hopital 规则。您可以从维基百科文章中获得该规则的详细处理,但基本上这意味着要评估这种不确定的限制,我们可以分别区分分子 f 和分母 g 以获得 f' 和 g' ,然后 limit(f/g) 是等于极限(f'/g')。现在,如果 p0、p1、p2 和 p3 是定义三次方的点,那么:

dy / dt = ypart ( 3 * ( p1 - p0 ) + 6 * t * ( p2 - 2 * p1 + p0 ) + 3 * t ** 2 * ( p3 - 3 * p2 + 3 * p1 - p0 ) )

dx / dt = xpart ( 3 * ( p1 - p0 ) + 6 * t * ( p2 - 2 * p1 + p0 ) + 3 * t ** 2 * ( p3 - 3 * p2 + 3 * p1 - p0 ) )

-> (dy/dt) / (dx/dt) = ypart ( p1 - p0 ) / xpart ( p1 - p0 )

但是当 p0 == p1 时,这变得不确定。现在按照 L'Hopital 的规定,

极限(t->0)[(dy/dt)/(dx/dt)]=极限(t->0)[(d2y/dt2)/(d2x/dt2)]

现在:

d2y/dt2 = ypart ( 6 * ( p2 - 2 * p1 + p0 ) + 6 * t * ( p3 - 3 * p2 + 3 * p1 - p0 ) )

d2x/dt2 = xpart ( 6 * ( p2 - 2 * p1 + p0 ) + 6 * t * ( p3 - 3 * p2 + 3 * p1 - p0 ) )

在 t = 0 时,(d2y/dt2) / (d2x/dt2) = ypart ( p2 - 2 * p1 + p0 ) / xpart ( p2 - 2 * p1 + p0 )

但由于 p1 == p0,这变成:ypart (p2 - p0) / xpart (p2 - p0),这正是 Naaff 告诉你的结果。请注意,即使 p2 == p0(一条真正退化的曲线,尤其是三次曲线,在这种情况下它只是一条直线!),那么即使这也是不确定的,您可以再次区分分子和分母以获得:

限制(dy/dx)=限制(t->0)[(d3y/dt3)/(d3x/dt3)]=ypart(p3-p0)/xpart(p3-p0)

我希望它对你有用......(顺便说一句,它似乎不像在 math.stackexchange 上那样在这里使用类似 TeX 的符号,否则我会提供数学标记。)

于 2013-01-07T11:30:29.310 回答