立方贝塞尔曲线段

时间:2012-07-28 17:40:38

标签: math graphics coordinates bezier

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

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

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

1 个答案:

答案 0 :(得分:11)

是的,De Casteljau's algorithm是可行的方法。

参数化

如果您的曲线没有通过 t = 0通过 t = 1正确参数化,那么您似乎正在使用错误的等式来描述你的曲线。 Wikipedia为您提供了正确的公式:

  

B( t )=(1- t 3 P 1 + 3(1- 2 t 2 + 3( 1- t t 2 P 3 + t 3 P 4

     

[我将维基百科中从零开始的形式的指数调整为基于你的问题的单一形式。]

如果设置 t = 0,则得到 P 1 ,这是您的起点。如果设置 t = 1,则得到 P 4 ,即终点。在两者之间,曲线的形状由这些点和两个控制点 P 2 P 3

De Casteljau的算法

t 成为您想要剪切曲线的参数。我们假设您只想保留初始部分。您从 P 1 P 2 绘制三条线,从那里到 P 3 并从那里到 P 4 。这些线中的每一条划分为其长度的分数 t ,即分割点之前的线的长度与 t 的整个长度相关:1。现在有三个新点 P 12 P 34 。再次执行相同操作以获得两个点 P 123 P 234 ,并再次获得单点< I> P 的<子> 1234 。最后一点是B( t ),即截断曲线的终点。如前所述,起点是 P 1 。新的控制点是 P 12 P 123 我们构建它们的方式。

删除曲线的初始部分的方式相同。因此,通过两个步骤,您可以修剪曲线的两端。您获得了一组新的控制点,这些控制点完全(最多使用您使用的数字精度)描述原始曲线的一段,没有任何近似或类似的参与。

您可以将上面的所有几何描述转换为代数公式,在完美的世界中,您应该将this answer的结果提供给您引用的问题。

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

  • P&#39; 1 = 0 u 0 u 0 P 1 + ( t 0 u 0 u 0 + 0 t 0 u 0 + 0 u 0 t 0 )< i> P 2 + ( t 0 t 0 u 0 + 0 t 0 t 0 + t 0 u 0 t 0 )< i> P 3 + t 0 t 0 t 0 P 的<子> 4
  • P&#39; 2 = 0 u 0 u 1 P 1 + ( t 0 u 0 u 1 + 0 t 0 u 1 + 0 u 0 t 1 )< i> P 2 + ( t 0 t 0 u 1 + 0 t 0 t 1 + t 0 u 0 t 1 )< i> P 3 + t 0 t 0 t 1 P 的<子> 4
  • P&#39; 3 = 0 u 1 u 1 P 1 + ( t 0 u 1 u 1 + 0 t 1 u 1 + 0 u 1 t 1 )< i> P 2 + ( t 0 t 1 u 1 + 0 t 1 t 1 + t 0 u 1 t 1 )< i> P 3 + t 0 t 1 t 1 P 的<子> 4
  • P&#39; 4 = 1 u 1 u 1 P 1 + ( t 1 u 1 u 1 + 1 t 1 u 1 + 1 u 1 t 1 )< i> P 2 + ( t 1 t 1 u 1 + 1 t 1 t 1 + t 1 u 1 t 1 )< i> P 3 + t 1 t 1 t 1 P 的<子> 4

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

请注意,在带括号的表达式中,至少有一些术语是相同的,可以组合使用。我没有这样做,因为这里所说的公式将使模式更清晰,我相信。您可以单独为 x y 方向执行这些计算,以计算新的控制点。