首页 文章

立方贝塞尔曲线段

提问于
浏览
2

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

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

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

1 回答

  • 11

    是的,De Casteljau's algorithm是要走的路 .

    参数化

    如果你的曲线没有通过t = 1从t = 0正确地参数化,那么你似乎正在使用错误的方程来描述你的曲线 . Wikipedia有正确的公式:

    B(t)=(1-t)3 P1 3(1-t)2t P2 3(1-t)t2 P3 t3 P4 [我将维基百科中从零开始的形式的指数调整为一个基于你的问题 . ]

    如果设置t = 0,则得到P1,即起点 . 如果设置t = 1,则得到P4,即终点 . 在两者之间,曲线的形状由这些点和两个控制点P2和P3确定 .

    De Casteljau的算法

    设t是您想要剪切曲线的参数 . 假设您只想保留初始部分 . 您从P1到P2绘制三条线,从那里到P3,再从那里到P4 . 这些线中的每条线在其长度的分数t处分割,即分割点之前的线的长度与整个长度相关为t:1 . 现在,您有三个新的点P12到P34 . 再次执行相同操作以获得两个点P123和P234,并再次获得单点P1234 . 最后一点是B(t),即截断曲线的终点 . 起点像以前一样是P1 . 新控制点是P12和P123,就像我们构建它们一样 .

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

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

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

    • P'1 = u0u0u0 P1(t0u0u0 u0t0u0 u0u0t0)P2(t0t0u0 u0t0t0 t0u0t0)P3 t0t0t0 P4

    • P'2 = u0u0u1 P1(t0u0u1 u0t0u1 u0u0t1)P2(t0t0u1 u0t0t1 t0u0t1)P3 t0t0t1 P4

    • P'3 = u0u1u1 P1(t0u1u1 u0t1u1 u0u1t1)P2(t0t1u1 u0t1t1 t0u1t1)P3 t0t1t1 P4

    • P'4 = u1u1u1 P1(t1u1u1 u1t1u1 u1u1t1)P2(t1t1u1 u1t1t1 t1u1t1)P3 t1t1t1 P4

    其中u0 = 1 - t0且u1 = 1 - t1 .

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

相关问题