如何抵消三次贝塞尔曲线?

时间:2010-11-10 20:38:45

标签: graphics bezier cad

我正在尝试创建一条“平行”贝塞尔曲线。在我的尝试中,我已经接近但没有雪茄。我试图在2条曲线(红色,蓝色)之间保持稳定的1px偏移。

current attempt

我的主要目标是使用边缘偏离algorythm来扩展/缩小svg路径。


解决方案

对于正在寻找解决方案的任何人,我都会创建一个AS3版本。

http://seant23.wordpress.com/2010/11/12/offset-bezier-curves/

4 个答案:

答案 0 :(得分:10)

来自维基百科:(http://en.wikipedia.org/wiki/B%C3%A9zier_curve

在给定Bézier曲线的固定偏移处的曲线,通常称为偏移曲线(与原始曲线“平行”,如铁路轨道中的轨道之间的偏移),不能由Bézier曲线精确地形成(除了一些琐碎的案例)。但是,有一些启发式方法通常可以为实际目的提供足够的近似值。

您可能还会看到此处指出的文件: Outline of cubic bezier curve stroke

答案 1 :(得分:7)

通常不可能将三次贝塞尔曲线的偏移表示为三次贝塞尔曲线(具体而言,当您的尖点或曲率半径接近偏移距离时,这是有问题的)。但是,您可以将偏移量逼近任何精确度。

试试这个:

  • 抵消有问题的Beziers(你已经看起来相当不错了)
  • 测量每条原始曲线与相应偏移曲线之间的差异。我会尝试10个样本,看看它是否运作良好。
  • 对于任何超出公差的偏移,细分(使用Beziers的deCastlejau算法)并迭代。

我没有实现偏移量(因为我使用的内核已经有了一个),但这似乎有点值得尝试。

答案 2 :(得分:7)

我希望你发现我的数学论文很有用enter image description here

具有选择性细分的二次贝塞尔偏移 http://microbians.com/?page=math

答案 3 :(得分:5)

你要求的是数学中的parallel or offset curve。 Bezier曲线上的维基百科文章(上面引用的其他文章)未能链接到“偏移曲线”的正确文章,但我几秒前就已经解决了这个问题。在矢量图形的世界中,同样的概念被称为抚摸路径。

通常,对于立方/贝塞尔曲线,偏移曲线是10阶多项式!资料来源:Kilgard, p. 28

如果您只想光栅化这样的偏移曲线,而不是计算它们的分析形式,您可以查看ghostscript的来源。您还可以查看this patent application以了解NV_path_rendering是如何做到的。

如果你想隐藏/近似偏移曲线,那么MetaFog上用于覆盖METAFONT到PostScript字体的TUG文件是一个很好的阅读。早于PostScript的METAFONT系统允许通过(更具数学复杂性)的描边操作来描述字体,但PostScript Type 1字体仅允许使用填充(与一般的PostScript绘图不同),原因在于速度。

this paper by Gernot Hoffmann的第7节给出了另一种算法,用于将偏移近似为(仅两个)贝塞尔曲线(每边一个),使用PostScript中的代码。 (给OpenGL论坛上的某个人提示找到它。)

实际上有很多这样的算法。我找到了1997 survey各种算法来近似偏移曲线。他们假设祖先曲线是Beziers或NURBS。