当三次贝塞尔曲线上的P0 == P1时,如何计算t = 0时的非零dx / dt和dy / dt?

时间:2012-05-08 21:34:53

标签: bezier quadratic derivative cubic

在我开始问题之前,我使用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处找到以下三次Bezier的正切(即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的正切。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

{1}处的衍生B'(t)对于案例1确实未定义(对于案例2,t = 0确实未定义。)

要了解为什么会出现这种情况,我们可以在您的示例中“向后”运行de Casteljau算法,将曲线的参数范围从t = 1加倍到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 = 0和/或P0 = P1 if t = 1)相当于:

P2 = P3

您可以通过将P2 - P1 评估为B'(t)来验证是否属实。

事实上,如果您在t->0处将扩展曲线分成两部分,然后将t = 0.5等式应用于每一侧,您会看到有两个不同的在尖端的切线。曲线的每一半的切线指向完全相反的方向。这是另一个说明为什么导数在这一点上未定义的原因。

最后一点注意事项:像二次贝塞尔一样处理点P1,P2和P3的技巧也会给你一个正确的切线。但是,会为您提供正确的衍生产品。

答案 1 :(得分:1)

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

您正在寻找立方贝塞尔曲线的末端斜率。由于曲线(即其x和y值)在t中是参数的,因此您将区分x和y w.r.t.分开。您到达的那对可能被认为是沿着曲线行进的点的瞬时“速度”。因此,在这种情况下,点的初始速度为零(或者更准确地说是零矢量),但是(最可能)加速度(或者至少是加速度变化率的失败)将不为零,因此点的速度将变为非零(非空向量),因此它将从那些坐标移动并描绘出曲线。

但是您在视觉上感知它的斜率不是参数化的,即它不依赖于时间。 I.O.W.你要找的是dy / dx,而不是对(dx / dt,dy / dt),并且假设你的曲线在t = 0时dx / dt和dy / dt都为零,dy / dx =( dy / dt)/(dx / dt)= 0/0这是不确定的。要对此进行评估,必须遵守L'Hopital的规则。你可以从Wikipedia article得到规则的详细处理,但基本上它意味着要评估这些不确定的极限,我们可以分别区分分子f和分母g得到f'和g'然后限制(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)

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