欧拉螺旋线使平行曲线更清洁

2021-02-20 03:13:41

确定并行曲线是基本的2D几何操作之一。图形中具有明显的应用,是从路径创建笔触轮廓的基础,也是在计算机辅助制造中(确定具有有限半径的铣削工具的路径)和机器人的路径规划。现在,文学中有很多解决方案,但在这篇文章中,我提出了一个清洁的解决方案。

良好的调查纸张正在比较偏移曲线近似方法。这些方法之间的主要区别是曲线表示的选择。对于派生平行曲线高度专业化的曲线表示的示例是毕达哥拉斯语程。这种平行曲线的PythAgorean HodoRAP是一个精确的参数多项式曲线,但在实践中仍需要近似技术,两者都可以将源曲线转换为表示,并且因为所得到的曲线是更高阶的合理多项式,这需要进一步近似近似于转换说,比如,立方Béziers。

具体而言,该博客提出了分段欧拉螺旋作为曲线表示特别适合于平行曲线问题。

在Kurbo中有许多这些想法(目前仍在阶段)的实施。我还使用了Colab笔记本来探索了一堆数学,我也副本提供了可用的副本。

使平行曲线特殊的事情之一是尖锐的曲线经常出现。特别是,只要源曲线的曲率半径匹配偏移量,就会出现一个CUSP。这被归类为一个普通的尖限,是许多曲线系列的一个特征 - 我们将量化下面的比较。

用于计算并行曲线的算法的共同特征是识别CUSP的位置,并在那里细分。基本上意味着求解曲率的特定值(偏移距离的倒数)。如果源曲线是立方体Bézier,则可以有多达四个这样的尖限,并找到它们需要一些非竞争数值求解。

我对平行曲线的方法(以及我的大部分曲线工作)的主题是考虑曲率与arclength的关系。具体的直觉是,方向盘的位置是汽车沿着恒定速度沿着曲线驱动。对于一些曲线,曲率可以用作闭合形式的分析公式作为阶段的函数(CeSàro方程),但通常确定关系需要数值技术。例如,在Euler Explorer中,作为交互式立方体Bézier下面的arclength的函数,有一个曲率曲线。试验,这是开发直觉的绝佳方式。

确实具有特别简单的Cesàro方程的一条曲线是Euler螺旋线。欧拉螺旋线段具有以下公式:

\ [\ kappa(s)= \ kappa_0 + \ kappa_1 s \](给那些想跟着详细的数学和代码一起学习的人的注释:大多数数学和数字代码使用$ -0.5 \ leq s \ leq 0.5 $因为它有助于利用偶数/奇数对称性,但是参数化曲线的约定(包括kurbo中的ParamCurve特征)为$ 0 \ leq s \ leq 1 $,因此,您经常会看到偏移量0.5,类似地,您会看到各种比例缩放到实际的弧长,而参数化的曲线约定假定弧长为1。在本博客中,我们将略过这些细节,因为目标是提供直觉,而不会使细节过于混乱。

通常,大多数曲线的平行曲线没有简单的公式。明显的例外是圆弧,平行曲线是另一个圆弧。毕达哥拉斯Hodographs是另一条具有易处理的平行曲线表示的曲线族。

由于其非常简单的公式表示为Cesàro方程,因此欧拉螺旋线是稀有曲线之一,其平行曲线具有简单的封闭式方程式。该方程式最早由Heinrich Wieleitner在1906年发表在Die Parallelkurve der Klothoide上。对于那些不懂德语的人,Rahix提供了英语翻译:PDF,TeX来源。

仔细研究一下数学,我发现Wieleitner错过了进一步简化的机会。当时的风格是根据曲率半径(曲率的倒数)来编写Cesàro方程,但特别是对于Euler螺旋及其平行曲线,使用曲率直接生成一个简单得多的方程。尖点位于$ s_0 $,方程式非常简单:

\ [\ kappa(s)= \ frac {c} {\ sqrt {s-s_0}} + \ frac {1} {l} \]下面是该方程的图形,单击它可链接到Desmos计算器图形,其中参数的滑块。

在此,$ c $是取决于螺旋参数的系数。要将其与Wieleitner论文中的符号联系起来,$ c = a / \ sqrt {2 l ^ 3} $,而$ s_0 = -a ^ 2 / {2l} $。我还制作了一个Desmos计算器图表,该图表以交互方式演示了该等式的等价性,而Wieleitner论文中涉及更深的一个等式。

还有许多其他曲线的尖点与上述曲线类似,具有特征性的平方根平方反比。最清楚的连接是圆渐开线,它是相同的,但没有$ 1 / l $项,换句话说,当偏移量达到无穷大时,欧拉螺旋平行曲线接近圆渐开线。这为直圆渐开线是其自身的平行曲线这一事实提供了直觉。渐开线圆弧可能是最著名的啮合齿轮齿轮廓,可以平稳地传递力而没有倾斜或摩擦。

具有类似尖点的其他曲线包括摆线(以及其许多变体,包括上摆线,下摆线,星形,三角形,心形和肾形),以及半立方体抛物线。后者特别受关注,因为它可以精确表示为三次贝塞尔曲线的情况(控制臂形成对称X时)。

欧拉螺旋的平行曲线非常弯曲,并且遵循毕达哥拉斯Hodograph曲线及其高阶有理多项式的传统,我们可以简单地要求所有下游元素来对其进行简单处理。但是为了使下游处理更容易,我们将转换回分段的欧拉螺旋,这是更易于处理的表示。

埃尔米特插值法是一种众所周知的技术。它以最简单的形式用于生成某个函数的分段多项式近似值,其中每个多项式段的参数均由端点的值和导数确定。例如,在三次Hermite插值中,根据端点处的值和一阶导数确定三次多项式-四个值,对应于该多项式的四个系数。由于导数完全匹配(并且等于源曲线),结果是C1连续的。

在2D中,C1和G1(几何)连续性之间存在区别。在C1连续性中,全导数必须在方向和大小上都匹配。对于动画运动曲线等应用,幅度很重要(它代表运动速度),但对于曲线则不重要。 G1连续性要求切线匹配,但不指定导数的大小。

在这些应用中,几何Hermite插值更为有效,因为曲线的所有参数均可用于使形状拟合。欧拉螺旋线特别适合于几何Hermite插值,并且有关于此主题的文献。对于平滑度的合理假设(不包括分形曲线,但包括简单的尖点),精度的缩放比例为$ O(n ^ 4)$-细分数量的加倍会将误差减少16倍。此缩放比例与一维函数的三次Hermite插值,不足为奇,因为当$ y $值小时,欧拉螺旋线段近似三次多项式。

本文的第8.2节提供了一种割线方法,该方法可根据G1 Hermite约束条件确定Euler螺旋参数,该方法在kurbo PR中的fit_euler方法中实现。这是一项很好的技术,并且收敛性非常好(二次方,这是牛顿式求解器解决近线性问题的典型方法),但是我也一直在尝试方法来做得更好。链接的笔记本探索的多项式近似(基于2D Taylor系列)要快得多,在我的测量中为7ns与240ns,并且在各种参数下都应该非常准确。我还没有做好使误差范围严格的工作,但是这种方法应该有助于使整个算法快如闪电。

几何Hermite插值可以很好地近似于一个Euler螺旋线段与另一个Euler螺旋线段的平行曲线:

真实的平行曲线为蓝色,近似值为红色。它具有相同的粗糙形状,但在中间凸出。我们需要能够估计该误差,以便做出更准确的近似值。

给定目标误差范围,最常见的近似方法是自适应细分:近似误差,如果误差超过目标,则细分。评估错误并不总是那么容易。通常,它基于数值技术,例如评估曲线沿其长度的多个点并测试这些点与源曲线的距离。

幸运的是,使用欧拉螺旋线近似欧拉螺旋线平行曲线时,有一个非常简单的误差公式。实际上,可以完全避免自适应细分,并精确地预测需要多少细分才能满足误差范围,并且可以分析细分地放置,以便每个细分都具有相同的误差。

归一化为1的弦长,其中Euler螺旋线段的弧长为$ a $,则近似误差为具有中心曲率$ \ kappa_0 $和曲率变化$ \ kappa_1 $且偏移距离$ l $的Euler螺旋线段的误差是:

\ [E \ approx 0.005a \ left | \ frac {1} {\ kappa_0 a ^ {-1} + l ^ {-1}} \ right | \ kappa_1 ^ 2 \] $ \ kappa_0 a ^ {-1 } + l ^ {-1} $项表示距尖端的距离;误差与该距离成反比。还要注意,$ \ kappa_1 $缩放为细分数的平方,因此,整个公式按预期缩放为四次幂。

给定这样一个简单的误差度量公式,我们可以比通常的自适应细分方法做得更好,后者只是评估误差度量,如果不满足阈值,则细分为一半。我们可以精确地计算出需要多少细分,以及在哪里细分,因此每个细分细分的误差都相同。

更多细节位于附带的笔记本中,但本质就是这样。如果根据下面的公式在原始曲线上选择$ S_I $,则每个段$ s_i $的错误到$ s_ {i + 1} $将接近等于:

\ [s_i = s_0 +(t_0 + i \ delta t)^ \ frac {4} {3} \] $ s_0 $是cusp的位置。使用此公式的关键是选择$ T_0 $ SO $ S_0 $ LANDS在一个端点,然后$ \ delta t $和$ n $,以至于$ t_0 + n \ delta t $土地,而$ N $是仍然符合错误绑定的最小值。细节有点是一点,但不昂贵计算,可以在笔记本中找到。

我应该注意到这一点,这不会导致完全相同的错误,但对于非常接近尖头的段略微下降。在我看法的情况下,由此产生的效率可能是几乎没有百分比,这是值得拥有这种直接解决方案的。

上图显示了通过这种精确的方法产生的细分,以精度为像素的大约十分之一,非常适合字体和2D艺术品应用。通常,当没有CUSP时,通常存在两到四个细分,并且最多两次当存在时的两倍。该博客的铅图像的精度为10 ^ -5像素,这对于任何应用程序都应该超过足够的足够,并且段的数量仍然非常可管理。我喜欢该图像,因为它显示了在暗穴点附近平滑地增加了细分的数量。

在心中,算法类似于抛物线的细分。为什么欧拉螺旋?

平行曲线算法的特别棘手的情况是当输入曲线是圆弧,其曲率几乎匹配偏移距离。确切的结果是一个非常小的半径的另一个圆弧。然而,使用Béziers作为曲线表示意味着由于近似误差,曲率将“纹波”。在最坏的情况下,这些涟漪跨越临界曲率值以产生尖刺器。每个二次Bézier都可以产生两个这样的尖限。细分更精细(在结果中更准确),越多的尖限!

当然,圆弧是欧拉螺旋可以准确表示的情况,并且其并行曲线也具有零误差。

为了总结,Béziers近似曲线可以将CUSP添加到相应的平行曲线,同时近似欧拉螺旋曲线可以在不牺牲精度的情况下移除它们。这种观察是我声称欧拉螺旋是平行曲线问题的“清洁剂”解决方案的主要原因。

先前的博客文章,SpoollyBéziers的秘密透露,解决了拟合立方Bézier以近似欧拉螺旋段的问题。关于这个主题有更多的话,但这里我将显示一个简单且吸引人的解决方案。

使用立方Béziers的图形设计人员通常教导,当从控制点到端点的距离大约是端点之间的距离时,距离距离的平滑曲线。这种概念更精确的改进是在每个端点周围绘制抛物线,沿着沿着和弦的顶点1/3的方式,以及在正交方向上的距离为2/3。欧拉螺旋近似只是在所需的切线方向上沿着该抛物线的点。

在对称情况下,该解决方案等同于使用立方Bézier近似圆弧的标准解决方案,如可以用一点三角形地看出。显而易见的是,即使在非对称情况下,它仍然很好,特别是Bézier的arclencth与真正的曲线相当好。误差缩放是第五个功率,它优于使用标准Hermite插值的第四个电源缩放(它一贯强度下降arclencth),但不如理论上可能的第六电源缩放一样好,如高精度几何Hermite插值所示。然而,与上面规定的简单抛物线规则相比,实际上达到了一定难度的数值技术。

绑定的错误以及其分析估计的密封性可以在此图像中可视化:

这里,K0是水平轴,K1是垂直的。水平轴(k1 = 0)表示完美的圆弧,而垂直(k0 = 0)是具有奇数对称性的“s”曲线;这两种情况都有特别低的误差。黑色表示零误差,红色真实错误,以及青色近似误差(请参阅关联的Kurbo Pr中的示例中的fit_cubic_plot函数,用于错误绑定和用于绘制上述的代码)。因此,中性灰色意味着误界是紧密的。

这种简单的适合$ N ^ 5 $缩放,是吸引人的,因为它非常快速地评估,而且在大多数情况下,在大多数情况下都会产生具有舒适但不是过多的安全保证金的立方体Béziers,特别是因为近似水平尺度的早期阶段以来$ n ^ 4 $。

并行曲线问题对于棘手有着好评的声誉。然而,大部分问题是贝塞耶作为底层曲线表示的选择 - Bézier的平行曲线是一个难以分析和近似的难以分析和近似,容易预测尖端。相比之下,源曲线的欧拉螺旋表示简化了这些问题,并为其平行曲线进行了干净的分析解决方案。

在展示欧拉螺旋形式的优势时,这篇博客文章呈现了许多新结果:

对于欧拉螺旋平行曲线的一个非常简单的闭合形式CeSàro方程,将其与圆圈的渐渐结合。

欧拉螺旋进入立方Béziers的高效和直接近似,也具有严格的错误界限。

我与欧拉螺旋一样,我发现它们越多,曲线的简单,高效和易易言。例如,因为它们定义使用弧长参数,所以逆弧长问题几乎是微不足道的。要查看文献,与欧拉螺旋一起工作似乎需要解决方案令人棘手的问题,如评估菲涅耳积分,但在实践中,高效的多项式近似工作良好,产生任意高精度的结果,具有适度的(和可预测的!)增加在细分的数量。我已经证明了这种曲线表示特别适合确定并行曲线的方式,并且还期待探索其对其他经典2D几何问题的适用性。

Kurbo PR中的并行曲线的实际实现小于100行代码,包括处理CUSP和仔细错误界限。我认为,为欧拉螺旋支持的索卢斯支持的实施提供了进一步的支持,而不是其他曲线表示。我还没有完成仔细的基准测试结束实现,但预计它将非常快,肯定基于重要原语的性能。速度对我很重要,因为我希望这些操作在设计应用中提供,提供了具有平滑交互性的准确和强大的几何操作。这是我为实施的重做生锈的主要原因。

最后:该博客帖子的结果主要通过实验确定,并通过测试验证(在许多情况下随机)。如果是学术论文,它将使用数学技术终止错误界限和相关结果。如果这听起来有趣,请联系,让我们在纸上讨论合作。