如何生成“厚”贝塞尔曲线?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成“厚”贝塞尔曲线?相关的知识,希望对你有一定的参考价值。
我正在寻找一种通过“加厚”Bezier曲线以编程方式生成多边形的方法。像这样的东西:
我最初的想法是找到行中的法线,并从中生成多边形:
但问题是法线可以在陡峭的曲线中相互交叉,如下所示:
是否有任何公式或算法可以从贝塞尔曲线生成多边形?我在互联网上找不到任何信息,但也许我正在用错误的词语搜索...
如果您想要一个恒定的厚度,这称为偏移曲线,您使用法线的想法是正确的。
这确实提出了两个困难:
- 偏移曲线不能完全表示为贝塞尔曲线;您可以使用折线,或将Beziers改造为折线;
- 当曲率半径变得小于偏移宽度时,确实出现尖点。您必须检测折线的自交叉点。
据我所知,没有简单的解决方案。
有关更多信息,请查看38. Curve offsetting。
我写了一篇关于生成偏移曲线的过程的博客: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
这是一个难题。有像Tiller-Hanson这样的合理近似值(参见我对这个问题的答案:How to get the outline of a stroke?),但提问者特别提出了“法线在陡峭曲线中可以相互交叉”的难度;另一种看待它的方法是,使用法线创建的包络可以产生无限大量的循环,这取决于法线的间隔距离。
一个完美的解决方案,没有自我交叉,是一个圆和线的Minkowski sum的包络。我认为获得这样一个信封是不切实际的:你可能不得不接受交叉点。
另一个有趣但又令人生畏的事实是,正如Richard Kinch在MetaFog: Converting METAFONT Shapes to Contours中所说的那样,“代数告诉我们沿着三次多项式曲线(描边路径的Bézier曲线)产生三次多项式曲线(由Bézier曲线近似的椭圆)在6度包络线中,我们必须用3度(贝塞尔曲线)近似这些6度精确包络线“。
以上是关于如何生成“厚”贝塞尔曲线?的主要内容,如果未能解决你的问题,请参考以下文章