如果我有描述贝塞尔曲线 P1、P2、P3、P4 的 4 个点(其中 P1 和 P4 是曲线的端点,P2 和 P3 是曲线的控制点),我怎么能找到描述的点只有这条贝塞尔曲线的一部分?
我找到了这个答案,这正是我正在寻找的,但答案似乎是错误的。如果我在应该代表整个贝塞尔曲线的方程中设置 t0=0 和 t1=1,则结果点无效。它们不等于原始点。
似乎该解决方案与 De Casteljau 算法有关,但我无法理解它是如何工作的。
如果我有描述贝塞尔曲线 P1、P2、P3、P4 的 4 个点(其中 P1 和 P4 是曲线的端点,P2 和 P3 是曲线的控制点),我怎么能找到描述的点只有这条贝塞尔曲线的一部分?
我找到了这个答案,这正是我正在寻找的,但答案似乎是错误的。如果我在应该代表整个贝塞尔曲线的方程中设置 t0=0 和 t1=1,则结果点无效。它们不等于原始点。
似乎该解决方案与 De Casteljau 算法有关,但我无法理解它是如何工作的。
是的,De Casteljau 的算法是要走的路。
如果您的曲线没有从t =0到t =1 正确参数化,那么您似乎使用错误的方程来描述您的曲线。维基百科为您提供了正确的公式:
B( t ) = (1−<i>t) 3 P 1 + 3(1−<i>t) 2 t P 2 + 3(1−<i>t) t 2 P 3 + t 3 P 4
[我将维基百科中从零开始的索引调整为你的问题中的从一开始。]
如果你设置t =0,你会得到P 1,你的起点。如果您设置t =1,您将获得P 4,即您的端点。在这两者之间,曲线的形状由这些点和两个控制点P 2和P 3决定。
让t成为您想要切割曲线的参数。假设您只想保留初始部分。你画出从P 1到P 2、从那里到P 3和从那里到P 4的三条线。这些线中的每一条都以其长度的分数t进行分割,即在分割点之前的线的长度与整个长度相关,如t: 1。您现在有三个新点P 12到P 34。再次执行相同操作以获得两个点P 123和P 234, 并再次获得单点P 1234。最后一点是 B( t ),即截断曲线的端点。与之前一样,起点是P 1。新的控制点是我们刚刚构建的P 12和P 123 。
删除曲线的初始部分的工作方式相同。因此,您可以分两步修剪曲线的两端。您获得了一组新的控制点,它们准确地(直到您使用的数值精度)描述了原始曲线的一段,不涉及近似值或类似的东西。
您可以将上面的所有几何描述转换为代数公式,并且在完美的世界中,您应该从您引用的问题的答案中得出结果。
唉,这似乎不是一个完美的世界。在撰写本文时,这些公式仅使用了二次多项式,因此它们无法描述三次曲线上的端点。正确的公式应该如下:
其中u 0 = 1 - t 0和u 1 = 1 - t 1。
请注意,在括号中的表达式中,至少有一些项是相等的并且可以组合。我没有这样做,因为我相信这里所说的公式会使模式更清晰。您可以简单地为x和y方向独立执行这些计算来计算新的控制点。