gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:02:40 28 4
gpt4 key购买 nike

在我开始这个问题之前,我使用 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 的切线。感谢您的帮助。

最佳答案

t = 0 处的导数 B'(t) 对于情况 1 确实未定义(对于情况 2 在 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 = 0 如果 P0 = P1 和/或 t = 1 如果 P2 = P3) 等同于:

P2 - P1

您可以通过将 B'(t) 计算为 t->0 来验证情况是否如此。

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

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

关于bezier - 当三次贝塞尔曲线上的 P0 == P1 时,如何在 t = 0 时计算非零 dx/dt 和 dy/dt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10506868/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com