Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 如何偏移三次贝塞尔曲线?_Graphics_Bezier_Cad - Fatal编程技术网

Graphics 如何偏移三次贝塞尔曲线?

Graphics 如何偏移三次贝塞尔曲线?,graphics,bezier,cad,Graphics,Bezier,Cad,我正在尝试创建一条“平行”贝塞尔曲线。在我的尝试中,我已经接近但没有雪茄。我试图在两条曲线(红色、蓝色)之间保持1px的实心偏移 我的主要目标是使用边缘偏移算法来扩展/收缩svg路径 解决方案 对于其他正在寻找解决方案的人,我已经创建了一个AS3版本 来自维基百科:() 与给定Bézier曲线的固定偏移处的曲线,通常称为偏移曲线(与原始曲线“平行”,就像铁路轨道中钢轨之间的偏移),不能由Bézier曲线精确形成(除非在一些普通情况下)。然而,有一些启发式方法通常会给出足够的近似值以用于实际目

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

我的主要目标是使用边缘偏移算法来扩展/收缩svg路径


解决方案

对于其他正在寻找解决方案的人,我已经创建了一个AS3版本

来自维基百科:()

与给定Bézier曲线的固定偏移处的曲线,通常称为偏移曲线(与原始曲线“平行”,就像铁路轨道中钢轨之间的偏移),不能由Bézier曲线精确形成(除非在一些普通情况下)。然而,有一些启发式方法通常会给出足够的近似值以用于实际目的

您可能还会看到此处所示的文件:

通常不可能将三次贝塞尔曲线的偏移表示为三次贝塞尔曲线(特别是,当尖点或曲率半径接近偏移距离时,这是有问题的)。但是,可以将偏移近似到任何精度级别

试试这个:

  • 抵消问题中的贝塞尔(您已经拥有的东西看起来相当不错)
  • 测量每条原始曲线与相应偏移曲线之间的差异。我会尝试10个样品,看看效果如何
  • 对于超出公差范围的任何偏移,请细分(使用Beziers的deCastlejau算法)并迭代

我还没有实现偏移量(因为我使用的内核已经有了偏移量),但这似乎是需要尝试的。

我希望你发现我的数学论文很有用

具有选择细分的二次贝塞尔偏移
你所要求的在数学上被称为a。维基百科上关于贝塞尔曲线的文章(被其他人引用)未能链接到“偏移曲线”的正确文章,但我在几秒钟前就解决了这个问题。在矢量图形的世界中,同样的概念被称为笔划路径

通常,对于三次/贝塞尔曲线,偏移曲线是一个10阶多项式!资料来源:

如果您只想将这些偏移曲线光栅化,而不是计算它们的分析形式,那么您可以查看ghostscript的源代码。您还可以查看NV_路径_渲染是如何实现的

如果要转换/近似偏移曲线,那么将METAFONT覆盖到PostScript字体的拖拽纸是一个不错的读物。早于PostScript的METAFONT系统允许通过笔划操作(在数学上更复杂)来描述字体,但出于速度原因,PostScript Type 1字体仅允许使用填充(与一般PostScript图形不同)

第7节给出了另一种将偏移近似为(仅两个)贝塞尔(每侧一个)的算法,代码为PostScript。(向OpenGL论坛上的某个人提示如何找到它。)


事实上,有很多这样的算法。我发现了许多近似偏移曲线的算法。他们假设祖曲线是贝塞尔曲线或NURBS曲线。

纯粹的猜测,我从来没有这样做过,但你能在曲线显示为某种“图像”后复制它,并在首选偏移量处以新颜色重新绘制它吗?@warren如果你从以下位置绘制曲线,它不会保持1px偏移:,
0,0到2,2到0,2
,然后将曲线复制到图像中,并以
4,4
为中心重新绘制(而不是
2,2
),这不会产生1px偏移吗?@warren仅在某些情况下,这取决于曲线的复杂性。如果你说的是一条非常简单的带有小圆弧的曲线,那么你的方法就行了。对于其他人,你会让它直接与原始直线相交。这完全取决于曲线的角度。这个问题似乎是相关的:你是否也有一条三次曲线,或者更高阶的推广,或者你的解决方案只适用于二次曲线?(如果是的话,这篇文章可以写吗?=)对不起,我没有这篇文章。。。但是我知道你可以使用一个三次方的两个二次近似值,然后对每个三次方进行偏移,因为切线不会在每个偏移的极值处发生变化。链接已断开。链接已修复:)谢谢!你能解释至少一种启发式吗?(我知道曲线展平)