如何生成"厚"贝塞尔曲线?

时间:2014-06-20 11:46:21

标签: geometry bezier

我正在寻找一种通过"加厚"以编程方式生成多边形的方法。贝塞尔曲线。像这样:

thick bezier curve

我最初的想法是在线中找到法线,并从中生成多边形:

Bezier normals

但问题是法线可以在陡峭的曲线中相互交叉,如下所示:

Bezier normals crossing each other

是否有任何公式或算法可以从贝塞尔曲线生成多边形?我无法在互联网上找到任何信息,但也许我正在使用错误的词语进行搜索......

4 个答案:

答案 0 :(得分:3)

如果你想要一个恒定的厚度,这称为偏移曲线,你使用法线的想法是正确的。

这确实提出了两个困难:

  1. 偏移曲线不能完全表示为贝塞尔曲线;您可以使用折线,或将Beziers改装为折线;

  2. 当曲率半径小于偏移宽度时,确实会出现尖点。您必须检测折线的自交叉。

  3. 据我所知,没有简单的解决方案。

    如需了解更多信息,请查看38. Curve offsetting

答案 1 :(得分:1)

我写了一篇关于生成偏移曲线的过程的博客: http://brunoimbrizi.com/unbox/2015/03/offset-curve/

这是一个互动的例子: http://codepen.io/brunoimbrizi/pen/VYEWgY

// code is too big to post here, please see the source on codepen

答案 2 :(得分:0)

这是一个难题。有像Tiller-Hanson这样的合理近似值(参见我对这个问题的回答:How to get the outline of a stroke?)但提问者特别提出了“法线在陡峭的曲线中可以相互交叉”的困难;另一种看待它的方法是,使用法线创建的包络可以产生无限大量的循环,具体取决于法线的间隔距离。

没有自交叉的完美解决方案是圆圈和线的Minkowski sum的包络。我认为获得这样一个信封是不切实际的:你可能不得不接受交叉点。

另一个有趣但又令人生畏的事实是,正如理查德·金奇在MetaFog: Converting METAFONT Shapes to Contours中所说,“代数告诉我们 抚摸三次多项式曲线(椭圆 近似于Bézier曲线)沿着第3个 度多项式曲线(Bézier曲线) 描边路径)产生6度包络线。 我们必须准确地接近这些6度 带有3度(贝塞尔曲线)曲线的包络线“。

答案 3 :(得分:0)

这里有关于这个主题的数学论文。

https://microbians.com/mathcode[![enter 此处的图片说明]1]1