我知道:
控制点a和d(2D立方贝塞尔曲线的起点和终点)
斜率a-> b,c-> d,b-> c(b,c其他控制点)
Bézier curve的中点是。
现在,根据这些信息,控制点b和c的位置公式是什么?
答案 0 :(得分:2)
我知道这个问题已经过时了,但是没有提供正确或完整的答案,所以我想我会提出一个解决方案。请注意,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
都等于比例因子。没有足够的信息来获得独特的解决方案。一个简单的解决方案是通过设置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
问题是关于平面Bezier曲线,但我认为有趣的是,当将此问题扩展到非平面3D三次Bezier曲线时,点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
。
答案 1 :(得分:1)
让我们说你的斜率是标准化的,然后对于某些人,你有
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矢量方程)您不需要第三个坡度。