拟合立方Bézier曲线

2021-03-14 12:19:29

立方体Béziers是迄今为止最常见的曲线表示,用于设计和渲染。使用曲线时的基本问题之一是曲线拟合,或者确定最接近某些源曲线的Bézier。应用程序包括简化现有路径,有效地表示并行曲线,并呈现其他样条表示,例如欧拉螺旋或超细。曲线拟合将在Rurebender中使用的特定功能删除了平滑的曲线点。意图是将两个Béziers合并为一个,这是另一种说法找到一个Bézier,该Bézier最靠近由两个现有的Bézier段形成的曲线。

尽管曲线拟合问题的重要性和追溯到三十年的文献,但迄今没有完全满意的解决方案。现有方法未能始终如一地产生最佳结果,缓慢(不适合互动使用),或两者。

问题如此艰难的主要原因是一个关于立方Béziers的基本但鲜为人知的事实:用C形曲线(没有拐点和少量曲率变化),往往是产生极为相似的形状的三组参数。结果,通常在拟合一些任意源曲线时,存在三个局部最小值。基于迭代近似的方法(除了缓慢)可能只会发现一个,可能缺少其他人的贴心。

在进入解决方案之前,我们需要更仔细地说明问题。目标是一个立方Bézier,其最小化了一些关于源曲线的误差度量。但是我们如何测量两条曲线之间的距离?

一个有意义的公制是Fréchet距离。它可以用一个小故事解释。飞机工程师与他们的狗皮埃尔散步,并且曲线可以描述随后的路径可以描述。什么是允许既可以完成路径的最小长度皮带?这是Fréchet距离。

另请注意,Fréchet距离与Hausdorff距离密切相关,但是当路径回落或穿过自身时,这两个可能不同。对于抚摸曲线,Hausdorff距离更为相关,但对于填充的路径,例如字体轮廓,Fréchet以豪斯Dorff不保证的方式保留卷绕号。

为了解决优化问题,Fréchet距离不理想,因为它有效测量单点的距离,最大误差。一种可以非正式地描述一个类似的L2误差度量,除了不是描述皮带的最大长度,描述了处理与狗距离工程师的平方成比例的狗的努力。最小化L2误差意味着最小化总努力。此错误指标考虑到整个路径,因此响应于参数的小的变化而更平滑。

我相信没有一个完美的错误度量,选择取决于上下文。幸运的是,对于平滑的曲线,例如我们可能在字体中找到字体,这些错误指标之间的差异是微妙的,我们可以自信地选择一个最容易理解数学的原因。对于这个博客文章,这是L2常态。

对于误差的平滑曲线和相对低的阈值,皮带通常垂直于主路径,这意味着我们只能注意到诸如曲线切线的误差矢量的组件。此外,虽然FRéchet距离表示最小的路径的所有可能参数化,但在实践中,我们可以通过选择归一化弧长度作为参数化来获得良好的近似(并且在任何情况下),这意味着Pierre和工程师都是Pierre和工程师沿着路径以恒定速度移动(如果电弧长度非常略有不同,则速度可能非常略微不同,使得它们同时在终点上最终)。

我们的狗皮埃尔有一个有趣的怪癖:他能够沿着立方体Bézier路径移动。也就是说,他是相当顺从的,并且总是从作为工程师的同一点开始和结束,以及开始和以相同的方向开始。

陈述的另一种方法是,我们的立方Bézier必须将源曲线与G1匹配。然后我们想找到最小化错误规范的参数的值。对于立方体Bézier,两个参数是两个控制臂的长度;所有其他参数都是由匹配源曲线匹配的要求确定的。

作为一种数学简化,我们可以考虑翻译,统一缩放和旋转,并考虑从(0,0)到(1,0)的曲线,给定$ \ theta_0 $和$ \ theta_1 $角度。

然后,Bézier的控制点是$(0,0)$,$(\ delta_0 \ cos \ theta_0,\ delta_0 \ sin \ theta_0)$,$(1 - \ delta_1 \ cos \ theta_1,\ delta_1 \ sin \ theta_1)$,$(1,0)$。我们的问题是找到$ \ delta_0 $和$ \ delta_1 $的值,以便最适合使用源曲线。

一个重要的早期解决方案是G2几何海绵插值,如De BoOl等人在高精度几何Hermite插值所示。该解决方案在端点处找到Bézier曲线匹配端点,在端点处的曲率和曲率。该文件表达了这些约束作为两个同时二次方程的系统,并发现最多三种解决方案。本文还证明了$ O(n ^ 6)$缩放,这意味着细分曲线的一半将误差降低了64倍。

最近的结果是纸张用Alvin Penner将立方Bézier拟合到参数功能。本文提出了三种不同的解决方案。首先,它重新实现了De Boor等人的曲率拟合方法,发现它确实有$ O(n ^ 6)$错误缩放,还有一个恒定的因子约为5-10,这不大。两种同时的二基体可以组合成单个四分之一多项式,易于和有效地解决。

接下来,Penner基于匹配Bézier的质量中心到源曲线的溶液,并且还将其降低到四个多项式。这种方法通常很好,但在所有情况下都没有找到最佳解决方案。另一个潜在问题是,质量中心不充分地定义对称的S形曲线,因为它是由签名区域除以原始矩的比率,并且签名区域可以变为零。

最后,Penner提出了使用正交距离拟合,更新的优化技术。该技术找到了最佳值,但需要帮助参数的初始设置(Penner使用质量解决中心),并且由于它需要重复计算误差度量和迭代朝向最佳解决方案。

曲线拟合的众所周知的解决方案是图形GEMS章节用于自动拟合数字化曲线的算法。应该注意,这将散射点作为输入,并且不保证端点处的切线角度。这是基于解决方案的迭代改进,因此可以在本地最小值之一中“卡住”,因为我们将在下面更详细地探索。

实现Bézier曲线拟合的另一个流行应用程序是Potrace,它将位图图像转换为向量形状。然而,Potrace并不能尝试极其精确的拟合,选择更快,更简单的方法,只能生成所有可能的Bézier曲线的子集。探索使用本博客中的技术可能很有意思,以改善结果。

另请注意,我在我论文第9章中解决了这个问题。那种方法给出了良好的结果,但很慢。本博客中的解决方案严格更好。

我们有两个参数来优化。开始的好地方是整个二维参数空间上误差的热图。下面是欧拉螺旋段的热图,其中偏转0.31和0.35弧度在端点。横轴是$ \ delta_0 $,即左控制臂的长度,垂直轴是$ \ delta_1 $,右控制臂的长度。

看着这个热爱图,我们立即看到两件事。首先,通过参数空间清楚地存在曲线,其中误差低于任一侧。在仔细检查时,确切的曲线是一个轴对齐的双曲线,我们将很快表征。其次,沿着这个曲线,这个故事更复杂。实际上,对于这个源曲线,有三个局部最小值。

长话短说,参数空间中的主要误差最小化曲线是Béziers的集合与源曲线相同的签名区域。在数学上,建立两个概念之间的连接是相当容易的:如果区域不匹配,则错误规范是不可能的。

以下是区域重要性的视觉演示。在C形曲线中,向下缩放armlengths直接影响区域,显然当该区域太小或太大时,它不能符合源曲线。

幸运的是,对于我们来说,特别容易计算和地区的理由是特别容易的。由于绿色的定理,曲线区域的等式往往很简单,并且在上面的X-Unit Chord的归一化方面,它实际上变得非常好:

\ [\ mathrm {seair} = \ tfrac {3} {20}(2 \ delta_0 \ sin \ theta_0 + 2 \ delta_1 \ sin \ theta_1 - \ delta_0 \ delta_1 \ sin(\ theta_0 + \ theta_1))立即这个公式给我们买了很多;计算$ \ delta_1 $给定$ \ delta_0 $非常简单。

我们可以在视觉上确认该区域的区域预测错误;在下面的图形中,我们绘制了上方和低于真实值的小三角形的线条。最小误差线清楚地跟随中心线。该图还使用具有增强对比度的ColorMap对低误差,这更清楚地显示三个局部最小值。

在拟合圆弧的情况下,它已经被Spencer Mortenson所示,即拟合中点躺在圆圈上的标准方法并不完全最小化错误,尽管它非常接近。在这种情况下,最佳曲线是对称的,所以我们可以设置臂长度等于并解决上述等式(它变成简单的二次)。这种方法并没有明显慢或更困难。

具有单位和平圆弧的区域和每个端点的$ \ theta $的偏转是:

\ [\ mathrm {area} = \ frac {\ frac {\ theta} {\ sin \ theta} - \ cos \ theta} {4 \ sin \ theta} \]应用上面的面积公式,使用二次公式,并简化一点,我们为ARM长度获得此值:

\ [\ frac {2 \ sin \ theta - \ sqrt {4 \ sin ^ 2 \ theta - \ frac {20} {3} \ sin(2 \ theta)\ mathrm {ara}}} {\ sin(2 \ θ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}标准方法超越了除端点和中点以外的半径,所以它将有一个超越区域。这种方法在中点突出,大致在四分之一和三季度点的过度,但绝对偏差较少。无论如何,所有方法都有$ O(n ^ 6)$缩放,这是出色的。只有恒定因素的变化,只有少量。 Mortenson的方法可以最大限度地减少Fréchet距离,因此最终选择归结为我们想要最小化的误差度量。

除了作为整体曲线合适精度的敏感度量之外,区域也具有自己的意义。特别地,当在字体中简化栅格的概要时,区域保留的曲线配合意味着即使形状略微扭曲,即使形状略微扭曲,也可以保持行程中的墨水量。作为一个字体设计师,我发现一个理想的财产。

限制自己以区域保存的解决方案意味着我们现在拥有一个维数参数空间来搜索。通过绘制$ \ delta_0 $并从中派生$ \ delta_1 $来绘制面积保留曲线,从上面的热线图绘制上述热线图中的错误

在这里,我们可以更清楚地看到三个局部最小值。对于每个最小最小值对应的立方体Béziers即使臂长度是否完全不同:

此时,只需应用数值技术来查找最小值并不是不合理的,但我们可以更好地完成。

理想情况下,我们想找到满足以下属性的曲线的衡量标准:

一些候选人近距离接近。例如,电弧长度(在我的论文的第9章中使用)满足其中的一些,但在对称曲线的情况下,例如圆弧不是正交的区域。

再次长话短说,赢家是第一个图像时刻,从角色的方向从起点到终点,或者我们可以说X-似的因为我们的和弦规范化这是$ x $轴。通常,2D中的第一时刻是成对计算的,每个方向一个,所以它略显奇怪,我们只困扰一个并忽略另一个方向。但是,尽可能正交到区域指导这种选择的要求。

可视化C形曲线中的X-矩差异更难,因为曲线形状的差异更加微妙,但在具有更多曲率变化的曲线中,它足够清楚。所有这些曲线都具有相同的区域,但X-矩的值不同:

通过我们跑步示例的错误热线图回到相同区域切片,绘制X-矩使其清除它准确预测错误:

特别地,误差的三个局部最小值中的每一个紧密地对应于X-矩的过零。所以现在我们必须找到该等式的解决方案。

幸运的是,格林的定理还可以帮助我们获得一个有效的公式来计算我们Bézier的X-More。它更加疲弱,但与地区相同的基本思想:

\ [\ begin {align} \ mathrm {moment_x} = \,\ tfrac {1} {280}(\&& 34 \ delta_0 \ sin \ theta_0 \\ + \& 50 \ delta_1 \ sin \ theta_1 \\ + \& 15 \ delta_0 ^ 2 \ sin \ theta_0 \ cos \ theta_0 \\ - \&& 15 \ delta_1 ^ 2 \ sin \ theta_1 \ cos \ theta_1 \\ - \& \ delta_0 \ delta_1(33 \ sin \ theta_0 \ cos \ theta_1 + 9 \ cos \ theta_0 \ sin \ theta_1)\\ - \&& 9 \ delta_0 ^ 2 \ delta_1 \ sin(\ theta_0 + \ theta_1)\ cos \ theta_0 \\ + \& 9 \ delta_0 \ delta_1 ^ 2 \ sin(\ theta_0 + \ theta_1)\ cos \ theta_1)\ end {aligal} \]使用数字技术来解决这个等式的完全合理(它比计算相对于原版的误差范围更便宜曲线),但再次,我们可以做得更好。

我们正在寻找该地区和X-onlow约束的同时解决方案。使用一些数学技巧(与Penner纸中使用的数学技巧非常相似),我们可以将整个内容减少到单个四分之一多项式。

将$ \ delta_0 \ delta_1 $转换为表单的等式$ a \ delta_0 + b \ delta_1 + C $。

给定四个多项式,存在分析和数字解决方案(后者仍然是理想的,因为它可能是棘手的,以实现数值鲁棒性)。

除了更高效的求解之外,多项式的存在还使我们对解决方案的洞察力良好,特别是解决方案的数量。

四分之一多项式最多可以有四种解决方案,但到目前为止,我们一直在谈论类似形状的曲线的三胞胎。第四个怎么样?

事实证明,它也是该区域和X-onlow约束的有效解决方案,但完全没有接近原始曲线,因为它包含一个循环。当计算签名区域时,由循环括的叶片与曲线的其余部分相反,同样刻录。由环包围的区域精确地余平曲线的非环部分中的过量区域。

因此,这两个Béziers拥有相同的签名区域和X-矩,但显然没有类似:

因此,在一般情况下,我们可以谈论具有不同循环结构的类似曲线的三重态度,并且所有这些都具有不同的循环结构,所有这些都共享相同的区域和X-矩。

根据应用程序,可能是值得考虑所有四种解决方案的。特别是,如果源曲线具有这样的循环(或一个尖端),则希望找到最适合它的Bézier。但是在源曲线没有这样的循环的情况下,可以立即排除具有这种臂长度的极端值的解决方案。曲线拟合算法的合理目标是,如果将立方Bézier作为源曲线放入,则应完全相同Bézier出来,并且可以包括带环和围栏的曲线。文献中的许多方法没有这个属性。

如果我们只考虑X-onlow约束的确切解决方案,我们可能会错过一些错误最小值。考虑欧拉螺旋,偏转为0.285和0.35弧度,作为适合的源曲线。 X-Shart和错误的图表如下所示:

这里,在图的右侧,X-矩接近零但实际上并没有穿过轴。即便如此,错误的误差低于左侧的轴的实际交叉。幸运的是,也不太难考虑这些,只要考虑X-MOMON的衍生物的地方也是零的。

Penner Paper描述了由正交距离配合方法发现的溶液的“令人惊讶的椭圆形”,而是基于质心的求解器错过。这些与“近的未命中”相同,并考虑到它们确保误差对于源曲线的小变化,即使当解决方案从一个分支跳转到另一个分支时也是连续的。

我们向立方Bézier曲线配件提出了一种高效和准确的解决方案,以及对立方Bézier的性质的一些洞察力,这使得这种解决方案棘手。通过直接求解多项式而不是迭代优化来确定解决方案。在有多个本地最小值的情况下,它可靠地找到所有这些,让我们选择全球最佳。

由于该多项式中的分支和双根,溶液的参数可以响应源曲线中的小变化而移动或甚至跳跃。 立方Béziers能够非常准确地适应源曲线的性质(以$ O(n ^ 6)$缩放),但如果这些优化的曲线将用作插值方案中的主机,例如变量 字体,它们不一定是插值兼容,这意味着两个在这些大师中的两个之间插值的结果可能不会与其中一个密切相关。