【发布时间】:2022-05-16 01:21:51
【问题描述】:
我正在寻找一种通过“加厚”贝塞尔曲线以编程方式生成多边形的方法。像这样的:
我最初的想法是找到直线中的法线,并从中生成多边形:
但问题是法线可以在陡峭的曲线中相互交叉,如下所示:
是否有任何公式或算法可以从贝塞尔曲线生成多边形?我在互联网上找不到任何信息,但也许我用错误的词搜索...
【问题讨论】:
我正在寻找一种通过“加厚”贝塞尔曲线以编程方式生成多边形的方法。像这样的:
我最初的想法是找到直线中的法线,并从中生成多边形:
但问题是法线可以在陡峭的曲线中相互交叉,如下所示:
是否有任何公式或算法可以从贝塞尔曲线生成多边形?我在互联网上找不到任何信息,但也许我用错误的词搜索...
【问题讨论】:
如果你想要一个恒定的厚度,这被称为偏移曲线,你使用法线的想法是正确的。
这确实带来了两个困难:
偏移曲线不能准确地表示为贝塞尔曲线;您可以改用折线,或将 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 中指出的那样,“代数告诉我们 抚摸 3 次多项式曲线(椭圆 由贝塞尔曲线近似)沿第三 多项式曲线(贝塞尔曲线的 描边路径)导致 6 度包络曲线。 我们将不得不近似这些 6 度精确 具有 3 阶 (Bezier) 曲线的包络曲线"。
【讨论】:
这里有关于那个主题的数学论文。
“具有选择性细分的二次贝塞尔曲线偏移”涵盖了一种偏移二次贝塞尔曲线的方法,该方法使用一个标准来设置二次贝塞尔曲线在开始时细分的参数值,以便生成与其他二次贝塞尔曲线段的偏移近似值。显然,这种方法可能不是假设的“真实”偏移的最完美近似,而是一种可以通过使用非递归算法在不同质量级别上执行的快速绘制笔画算法。
这里所有的论文和例子https://microbians.com/mathcode 那个 imbrizi 用于他在答案中输入的 codepen。
https://codepen.io/microbians/pen/OJPmBZg
code in the link
【讨论】: