gpt4 book ai didi

math - 中点已知的三次贝塞尔计算

转载 作者:行者123 更新时间:2023-12-04 21:01:10 25 4
gpt4 key购买 nike

我知道:

  • 控制点 a 和 d(二维三次贝塞尔曲线的起点和终点)
  • 斜率 a->b、c->d 和 b->c(b,c 其他控制点)
  • 哪里Bézier curve的中点是。

  • 现在,根据这些信息,控制点 b 和 c 的位置公式是什么?

    最佳答案

    我知道这个问题很老,但没有提供正确或完整的答案,所以我想我会提出一个解决方案。请注意,David 的计算包含多个错误,即使纠正了这些错误,他的解决方案也是不完整的。

    首先,定义向量T0 , T1T2使用三个斜率:

    T0 = ( b - a ) / u0
    T1 = ( c - b ) / u1
    T2 = ( d - c ) / u2

    如果我们知道每对控制点之间的方向和距离,那么我们就不需要比例因子 u0 , u1u2 .既然我们只知道斜率,那么 u0 , u1u2是未知的标量。此外,我们假设 u0 , u1u2非零,因为斜率已定义。

    我们可以用几种不同的方式重写这些方程,以获得每个控制点相对于其他控制点的表达式。例如:
    b = a + T0*u0
    c = b + T1*u1
    d = c + T2*u2

    该问题还指出,我们有三次贝塞尔曲线的“中点”。我认为这意味着我们的点位于曲线参数范围的中点。我会称这一点 p :
    p = ( a + 3*b + 3*c + d ) / 8

    在左侧用未知数重写产生:
    b + c = ( 8*p - a - d ) / 3

    我们现在可以代替 bc以各种方式使用较早的表达式。事实证明,当我们有平行向量时会产生歧义 T0 , T1T2 .有四种情况需要考虑。

    案例1:T0T1 不平行

    替代 b = a + T0*u0c = a + T0*u0 + T1*u1并求解 u0u1 :
    2*T0*u0 + T1*u1 = ( 8*p - 7*a - d ) / 3

    这是两个方程和两个未知数,因为 T0T1是向量。替代 u0u1回到 b = a + T0*u0c = a + T0*u0 + T1*u1获取缺失的控制点 bc .

    案例2:T1T2 不平行

    替代 c = d - T2*u2b = d - T2*u2 - T1*u1并求解 u1u2 :
    T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3

    案例3:T0T2 不平行

    替代 b = a + T0*u0c = d - T2*u2并求解 u0u2 :
    T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3

    案例 4:T0 , T1T2都是平行的

    在这种情况下 a , b , cd全部共线且 T0 , T1T2都等价于一个比例因子内。没有足够的信息来获得唯一的解决方案。一种简单的解决方案是简单地选择 b通过设置 u0 = 1 :
    b = a + T0
    (a + T0) + c = ( 8*p - a - d ) / 3
    c = ( 8*p - 4*a - d - 3*T0 ) / 3

    存在无数的解决方案。本质上,采摘 b定义 c或采摘 c将定义 b .

    扩展到 3D

    该问题专门询问了平面贝塞尔曲线,但我认为注意到这一点很有趣 p将此问题扩展到非平面 3D 三次贝塞尔曲线时,不需要。在这种情况下,我们可以简单地为 u0 求解这个方程。 , u1u2 :
    T0*u0 + T1*u1 + T2*u2 = d - a

    这是三个方程(向量是 3D 的)和三个未知数( u0u1u2 )。代入 b = a + T0*u0c = b + T1*u1c = d - T2*u2 yield bc .

    关于math - 中点已知的三次贝塞尔计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/404861/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com