三次贝塞尔曲线描边轮廓

Posted

技术标签:

【中文标题】三次贝塞尔曲线描边轮廓【英文标题】:Outline of cubic bezier curve stroke 【发布时间】:2009-01-03 01:48:40 【问题描述】:

三次贝塞尔曲线的描边是指渲染具有特定线宽“w”的曲线“A”。

如何推导出描述贝塞尔“A”笔划轮廓的其他三次贝塞尔曲线?

【问题讨论】:

Hain 论文的当前链接(如果有人正在寻找它)是:cis.usouthal.edu/~hain/general/Publications/Bezier/… 【参考方案1】:

哦哦。您想获得贝塞尔曲线的偏移曲线。

坏消息。这很难,因为这些曲线不能简单地推导出数值。它们包含各种交叉点、循环和其他讨厌的东西。

虽然有一些近似值。到目前为止,我读过的最好的方法来自 Thomas F. Hain (Fast, Precise Flattening of Cubic Bézier Path and Offset Curves) 的一篇论文。

他做扁平化,所以他的论文主要是关于将偏移曲线分解成线段和圆弧段,但你可以稍后将它们合并回贝塞尔曲线。

为了更好地理解,您可能还想阅读他的其他贝塞尔相关论文。

【讨论】:

论文也在citeseerx上:citeseerx.ist.psu.edu/viewdoc/…【参考方案2】:

Qt 的 QPainterPathStroker(它是开源且可读性强的代码)使用上述论文中描述的算法来做你想做的事。

【讨论】:

【参考方案3】:

要准确地做到正如其他人所解释的那样非常困难。偏移曲线不是三次贝塞尔曲线,非常难以处理。那么比偏移更深的凹面会导致相交问题。

好消息是,通常您要计算笔画偏移以进行渲染,因此只需要像素精度。此外,如果您遵守多边形填充的缠绕规则,则各种交叉点仍会创建填充多边形。所以你先把曲线拉平,然后以线性方式偏移,就变成了直线多边形问题。

这里的一些代码可以作为参考实现: https://github.com/memononen/nanosvg

【讨论】:

以上是关于三次贝塞尔曲线描边轮廓的主要内容,如果未能解决你的问题,请参考以下文章

三次方贝塞尔曲线的绘制

如何计算三次贝塞尔曲线的长度

贝塞尔 平滑曲线

三次贝塞尔曲线画圆的方法。

如何使用三次贝塞尔曲线进行滚动

二次三次贝塞尔曲线demo(演示+获取坐标点)