我知道:
控制点 a 和 d(二维三次贝塞尔曲线的起点和终点)
斜率 a->b、c->d 和 b->c(b,c 其他控制点)
贝塞尔曲线的中点在哪里。
现在,给定这些信息,控制点 b 和 c 位置的公式是什么?
我知道这个问题很老,但没有提供正确或完整的答案,所以我想我会提出一个解决方案。请注意,大卫的计算包含几个错误,即使这些错误得到纠正,他的解决方案也不完整。
首先,定义向量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
都等价于一个比例因子内。没有足够的信息来获得唯一的解决方案。一个简单的解决方案是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
求解这个方程:u1
u2
T0*u0 + T1*u1 + T2*u2 = d - a
这是三个方程(向量是 3D)和三个未知数(u0
和u1
)u2
。代入b = a + T0*u0
andc = b + T1*u1
或c = d - T2*u2
得到b
and c
。
假设您的斜率已标准化,那么对于某些 u,v 您有
u * slope(a->b)+a = b, v * slope(c->d)+d = c
你知道 a、d 和q:=(a+b+c+d)/8
(曲线的中点)的值,所以c = 8(q-a-d-b)
将上述方程插入你得到的最后一个方程
v * slope(c->d)+d = 8(q-a-d-a-u * slope(a->b))
这是两个变量(u,v)中的2个方程(一个2d向量方程)
你不需要第三个斜坡。