【问题标题】:Cubic bezier curve segment三次贝塞尔曲线段
【发布时间】:2012-07-27 01:05:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: math graphics coordinates bezier


    【解决方案1】:

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

    参数化

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

    B(t) = (1−t)3P1 + 3(1−t)2t P2 + 3( 1−t)t2P3 + t i>3P4

    [我将维基百科中从零开始的索引调整为您问题中的从一开始。]

    如果你设置 t=0,你会得到 P1,你的起点。如果您设置 t=1,您将获得 P4,即您的端点。在这两者之间,曲线的形状由这些点和两个控制点 P2P3.

    De Casteljau 算法

    t 成为您想要切割曲线的参数。假设您只想保留初始部分。从 P1P2 绘制三条线,从那里到 P3 并从那里到 P4。您以 t 长度的分数分割这些线中的每一条,即分割点之前的线的长度与整个长度相关为 t : 1. 你现在有三个新点 P12P34。再次相同得到两个点P123P234,再次得到单点P1234。最后一点是 B(t),即截断曲线的端点。起点是 P1 和以前一样。新的控制点是 P12P123 我们刚刚构造它们的方式。

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

    您可以将上述所有几何描述转换为代数公式,在理想情况下,您应该从this answer 到您引用的问题得出结果。

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

    • P'1 = u0u0u0P1 + (t0u0u0 + u0t0u0 + u0u0t0) P2 + (t0t0u0 + u0t0t0 + t0u0t0) P3 + t0t0t0P4
    • P'2 = u0u0u1P1 + (t0u0u1 + u0t0u1 + u0u0t1) P2 + (t0t0u1 + u0t0t1 + t0u0t1) P3 + t0t0t1P4
    • P'3 = u0u1u1P1 + (t0u1u1 + u0t1u1 + u0u1t1) P2 + (t0t1u1 + u0t1t1 + t0u1t1) P3 + t0t1t1P4
    • P'4 = u1u1u1P1 + (t1u1u1 + u1t1u1 + u1u1t1) P2 + (t1t1u1 + u1t1t1 + t1u1t1) P3 + t1t1t1P4

    其中 u0 = 1 - t0u1 = 1 - t1.

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

    【讨论】:

    • 感谢您的精彩解释。但是,如果我使用您所指的方程并且我使用 t0=0 和 t1=1,我应该有完整的贝塞尔曲线,所以 4 个计算点应该等于原始的 4 个点,但它们不是。你会得到这样的结果:xa=x1 (OK), xb=bx2 (bad), xc=bx1 (bad), xd=x2 (OK)。我使用HTML5画布方法通过传递4个点来绘制贝塞尔曲线,曲线不对。方程式有错误吗?
    • @Absolom,确实在我链接的那个答案中似乎有一个错误。现在应该包含正确的公式。
    • 完美运行!非常感谢您花时间写下所有公式。它也可能对其他人有所帮助。谢谢!
    • @MvG,感谢您指出我的旧答案中有错误(由提问者引用)。我现在已经修复了这个错误。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2012-01-19
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多