我知道这个问题很老,但没有提供正确或完整的答案,所以我想我会提出一个解决方案。请注意,David 的计算包含多个错误,即使纠正了这些错误,他的解决方案也不完整。
首先,使用三个斜率定义向量T0、T1和T2:
T0 = ( b - a ) / u0
T1 = ( c - b ) / u1
T2 = ( d - c ) / u2
如果我们知道每对控制点之间的方向和距离,那么我们就不需要比例因子u0、u1和u2 .因为我们只知道斜率,所以u0、u1 和u2 是未知的标量。此外,由于定义了斜率,我们假设 u0、u1 和 u2 不为零。
我们可以用几种不同的方式重写这些方程,以获得每个控制点相对于其他控制点的表达式。例如:
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
我们现在可以使用前面的表达式以各种方式替换b 和c。事实证明,当我们有并行向量T0、T1 或T2 时,就会出现歧义。有四种情况需要考虑。
案例1:T0与T1不平行
代入b = a + T0*u0和c = a + T0*u0 + T1*u1并求解u0和u1:
2*T0*u0 + T1*u1 = ( 8*p - 7*a - d ) / 3
这是两个方程和两个未知数,因为 T0 和 T1 是向量。将u0 和u1 替换回b = a + T0*u0 和c = a + T0*u0 + T1*u1 以获得缺失的控制点b 和c。
案例2:T1与T2不平行
代入c = d - T2*u2和b = d - T2*u2 - T1*u1并求解u1和u2:
T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3
案例3:T0与T2不平行
替换b = a + T0*u0 和c = d - T2*u2 并求解u0 和u2:
T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3
案例4:T0、T1和T2都是并行的
在这种情况下,a、b、c 和 d 都是共线的,T0、T1 和 T2 都等价于一个比例因子内。没有足够的信息来获得唯一的解决方案。一种简单的解决方案是通过设置u0 = 1 来简单地选择b:
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
这个问题专门询问了平面贝塞尔曲线,但我认为有趣的是,当将此问题扩展到非平面 3D 三次贝塞尔曲线时,点 p 不是必需的。在这种情况下,我们可以简单地求解u0、u1 和u2 的方程:
T0*u0 + T1*u1 + T2*u2 = d - a
这是三个方程(向量是 3D)和三个未知数(u0、u1 和 u2)。替换成b = a + T0*u0 和c = b + T1*u1 或c = d - T2*u2 得到b 和c。