代码之家  ›  专栏  ›  技术社区  ›  Absolom

三次贝塞尔曲线段

  •  5
  • Absolom  · 技术社区  · 12 年前

    如果我有描述贝塞尔曲线P1、P2、P3、P4的4个点(其中P1和P4是曲线的端点,P2和P3是曲线的控制点),我如何找到只描述该贝塞尔曲线的一段的点?

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

    这个解决方案似乎与De Casteljau的算法有关,但我不明白它是如何工作的。

    1 回复  |  直到 7 年前
        1
  •  14
  •   Community CDub    4 年前

    De Casteljau's algorithm 是要走的路。

    参数化

    如果曲线的参数化不正确 =0槽 =1,那么你似乎用了错误的方程来描述你的曲线。 Wikipedia 有适合您的正确公式:

    B( )=(1) ) 3. P 1. +3(1) ) 2. P 2. +3(1) ) 2. P 3. + 3. P 4.

    [我将维基百科中的索引从基于零的形式调整为基于你的问题的形式。]

    如果你设置 =0,你得到 P 1. ,你的出发点。如果你设置 =1,你得到 P 4. ,您的端点。在两者之间,曲线的形状由这些点和两个控制点决定 P 2. P 3.

    De Casteljau算法

    允许 是要在其中剪切曲线的参数。假设您只想保留初始部分。你从 P 1. P 2. ,从那里到 P 3. 从那里到 P 4. .你把每一行都除以分数 其长度,即分界点之前的线的长度与整个长度相关 :1。你现在有三个新观点 P 12 通过 P 34 .再次执行相同操作可获得两点 P 123 P 234 ,并再次获得单点 P 1234 最后一点是B( ),截断曲线的端点。起点是 P 1. 和以前一样。新的控制点是 P 12 P 123 我们刚才建造它们的方式。

    删除曲线的初始部分的方法与此相同。因此,分两步,可以修剪曲线的两端。您可以获得一组新的控制点,这些控制点精确地(达到您使用的数字精度)描述原始曲线的一段,而不涉及近似或类似情况。

    你可以将上面所有的几何描述转化为代数公式,在一个完美的世界里,你应该从 this answer 你引用的问题。

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

    • P’ 1. = u 0 u 0 u 0 P 1. + ( 0 u 0 u 0 + u 0 0 u 0 + u 0 u 0 0 ) P 2. + ( 0 0 u 0 + u 0 0 0 + 0 u 0 0 ) P 3. + 0 0 0 P 4.
    • P’ 2. = u 0 u 0 u 1. P 1. + ( 0 u 0 u 1. + u 0 0 u 1. + u 0 u 0 1. ) P 2. + ( 0 0 u 1. + u 0 0 1. + 0 u 0 1. ) P 3. + 0 0 1. P 4.
    • P’ 3. = u 0 u 1. u 1. P 1. + ( 0 u 1. u 1. + u 0 1. u 1. + u 0 u 1. 1. ) P 2. + ( 0 1. u 1. + u 0 1. 1. + 0 u 1. 1. ) P 3. + 0 1. 1. P 4.
    • P’ 4. = u 1. u 1. u 1. P 1. + ( 1. u 1. u 1. + u 1. 1. u 1. + u 1. u 1. 1. ) P 2. + ( 1. 1. u 1. + u 1. 1. 1. + 1. u 1. 1. ) P 3. + 1. 1. 1. P 4.

    哪里 u 0 =1 0 u 1. =1 1.

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