在我开始问题之前,我使用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的正切。 谢谢你的帮助。
答案 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那样,否则我会提供数学标记。)