3

这个问题这个问题都展示了如何沿着曲线以特定的参数化值 0 ≤ t ≤ 1 分割三次贝塞尔曲线,从两个新段组成原始曲线形状。我需要在我知道其坐标的曲线上的一个点处分割我的贝塞尔曲线,但不是该点的参数化值t

例如,考虑 Adob​​e Illustrator,用户可以单击曲线将点添加到路径中,而不会影响路径的形状。

假设我在曲线上找到最接近用户点击位置的点,我该如何计算控制点?给定曲线上的一个点,是否有分割贝塞尔曲线的公式?

或者(并且不太理想),给定曲线上的一个点,有没有办法确定与该点对应的参数化值t(除了在二分搜索中使用 De Casteljau 算法)?


我的贝塞尔曲线恰好只是二维的,但一个很好的答案将包括应用于任意维度所需的向量数学。

4

1 回答 1

1

在不使用 De Casteljau 算法的情况下确定曲线上某个点的参数值是可能的,而且可能更简单,但是您必须使用启发式方法来找到一个好的起始值并类似地近似结果。

一种可能且相当简单的方法是使用牛顿法,这样:

t n+1 = t n - ( b x (t n ) - c x ) / b x '(t n )

其中b x (t)是指多项式形式的某个贝塞尔曲线的x分量,控制点为x 0x 1x 2x 3b x '(t)是一阶导数,c x是一个点在曲线上使得:

c x = b x (t) | 0 < t < 1

b x (t)的系数为:

A = -x 0 + 3x 1 - 3x 2 + x 3
B = 3x 0 - 6x 1 + 3x 2
C = -3x 0 + 3x 1
D = x 0

和:

b x (t) = At 3 + Bt 2 + Ct + D,
b x '(t) = 3At 2 + 2Bt + C

现在找到一个很好的起始值来插入牛顿的方法是棘手的部分。对于大多数不包含环或尖点的曲线,您可以简单地使用公式:

t n = ( c x - x 0 ) / ( x 3 - x 0 ) | x 0 < x 1 < x 2 < x 3

现在您已经拥有:

b x (t n ) ≈ c x

因此,应用牛顿法的一次或多次迭代将为c x提供更好的t近似值。

请注意,Newton Raphson 算法具有二次收敛性。在大多数情况下,一个好的起始值在两次迭代后将导致可以忽略不计的改进,即小于半个像素。

最后值得注意的是,三次贝塞尔曲线具有通过找到一阶导数的根来找到极值的精确解。因此,有问题的曲线可以简单地在它们的极值处细分以去除环或尖点,然后通过分析有问题的结果部分可以获得更好的结果。以这种方式细分三次方将满足上述约束。

于 2021-03-31T13:36:22.890 回答