5

如果我有描述贝塞尔曲线 P1、P2、P3、P4 的 4 个点(其中 P1 和 P4 是曲线的端点,P2 和 P3 是曲线的控制点),我怎么能找到描述的点只有这条贝塞尔曲线的一部分?

我找到了这个答案,这正是我正在寻找的,但答案似乎是错误的。如果我在应该代表整个贝塞尔曲线的方程中设置 t0=0 和 t1=1,则结果点无效。它们不等于原始点。

似乎该解决方案与 De Casteljau 算法有关,但我无法理解它是如何工作的。

4

1 回答 1

14

是的,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 2P 3决定。

De Casteljau 算法

t成为您想要切割曲线的参数。假设您只想保留初始部分。你画出从P 1P 2、从那里到P 3和从那里到P 4的三条线。这些线中的每一条都以其长度的分数t进行分割,即在分割点之前的线的长度与整个长度相关,如t: 1。您现在有三个新点P 12P 34。再次执行相同操作以获得两个点P 123P 234, 并再次获得单点P 1234。最后一点是 B( t ),即截断曲线的端点。与之前一样,起点是P 1。新的控制点是我们刚刚构建的P 12P 123 。

删除曲线的初始部分的工作方式相同。因此,您可以分两步修剪曲线的两端。您获得了一组新的控制点,它们准确地(直到您使用的数值精度)描述了原始曲线的一段,不涉及近似值或类似的东西。

您可以将上面的所有几何描述转换为代数公式,并且在完美的世界中,您应该从您引用的问题的答案中得出结果。

唉,这似乎不是一个完美的世界。在撰写本文时,这些公式仅使用了二次多项式,因此它们无法描述三次曲线上的端点。正确的公式应该如下:

  • P' 1 = u 0 u 0 u 0 P 1 + ( t 0 u 0 u 0 + u 0 t 0 u 0 + u 0 u 0 t 0 ) P 2 + ( t 0 t 0 u 0 + u 0 t 0 t 0 + t 0 u 0 t 0 ) P 3+ t 0 t 0 t 0 P 4
  • P' 2 = u 0 u 0 u 1 P 1 + ( t 0 u 0 u 1 + u 0 t 0 u 1 + u 0 u 0 t 1 ) P 2 + ( t 0 t 0 u 1 + u 0 t 0 t 1 + t 0 u 0 t 1 ) P 3+ t 0 t 0 t 1 P 4
  • P' 3 = u 0 u 1 u 1 P 1 + ( t 0 u 1 u 1 + u 0 t 1 u 1 + u 0 u 1 t 1 ) P 2 + ( t 0 t 1 u 1 + u 0 t 1 t 1 + t 0 u 1 t 1 ) P 3+ t 0 t 1 t 1 P 4
  • P' 4 = u 1 u 1 u 1 P 1 + ( t 1 u 1 u 1 + u 1 t 1 u 1 + u 1 u 1 t 1 ) P 2 + ( t 1 t 1 u 1 + u 1 t 1 t 1 + t 1 u 1 t 1 ) P 3+ t 1 t 1 t 1 P 4

其中u 0 = 1 - t 0u 1 = 1 - t 1

请注意,在括号中的表达式中,至少有一些项是相等的并且可以组合。我没有这样做,因为我相信这里所说的公式会使模式更清晰。您可以简单地为xy方向独立执行这些计算来计算新的控制点。

于 2012-07-28T19:51:15.827 回答