已知中点的三次贝塞尔曲线计算

5
我知道:
  • 控制点a和d(2D立方贝塞尔曲线的起点和终点)

  • 斜率a->b,c->d和b->c(b,c是其他控制点)

  • Bézier曲线的中点在哪里。

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

这更像是一个数学问题,而不是一个编程问题? - user49572
似乎这是一项作业任务,无法通过谷歌找到。 - Guvante
许多编程问题不也是数学问题吗?这个问题对我来说听起来很好,无论是否是作业,我都想知道解决方案,只是出于好奇 :-) - Michael Stum
这是我的一个程序的问题,它处理矢量图形。它是更大转换的一部分,但我不想在问题中填充无关的上下文。 - Loci
天啊,现在我们不能自主进行数学探索吗?我花了很多时间在课外摆弄计算机图形。这被称为学习,而不是作业。 - Jason S
这似乎是一个过度确定的问题。贝塞尔曲线由8个自由度描述(一种指定方式= x,y起点,x,y终点,dx,dy起始向量,dx,dy结束向量)。你有9个。(3个点= 6 DOF,+ 3个斜率) - Jason S
2个回答

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

我们现在可以使用先前的表达式以各种方式替换bc。当我们有平行向量T0T1T2时,就会出现歧义。有四种情况需要考虑。
情况1:T0不与T1平行
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

情况三:T0T2不平行

b = a + T0*u0c = d - T2*u2 代入,并解出 u0u2

T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3

情况4: T0, T1T2都是平行的

在这种情况下,abcd都共线,并且T0T1T2在一个比例因子内等效。没有足够的信息来获得唯一的解决方案。一个简单的解决方案是通过设置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
问题特别询问了平面Bezier曲线,但是我认为将此问题扩展到非平面3D立方Bezier曲线时,点

p 并不是必需的。在这种情况下,我们可以简单地解决这个方程,得到、和。

T0*u0 + T1*u1 + T2*u2 = d - a

这是三个方程(向量为3D),有三个未知数(u0u1u2)。将其代入 b = a + T0*u0c = b + T1*u1c = d - T2*u2 中可得到bc

1

假设您的斜率已经归一化,那么对于某些 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向量方程式)

你不需要第三个斜率。


我曾经遇到类似的情况,但问题在于如果两条斜率平行,则无法给出解决方案。 解决方法涉及使用公式 (slope(a->b)xslope(c->d)y - slope(a->b)yslope(c->d)x) 进行除法运算,当斜率平行时该公式的值为零。 - Loci
啊,现在我明白了,你正在处理多个解决方案,所以第三个斜率可以消除歧义。警告,它可能与其余的8个量不一致。 - Jason S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接