将二次曲线转换为三次曲线

时间:2012-02-28 16:29:27

标签: graphics vector

看着Convert a quadratic bezier to a cubic?,我终于明白为什么编程老师总是告诉我数学是如此重要。可悲的是,我没有听。

任何人都可以提供更具体的 - 例如,计算机语言 - y - 将二次曲线转换为立方曲线的公式吗?理解可能存在一些舍入错误,这很好。

给出由变量表示的四边形曲线:

StartX, StartY
ControlX, ControlY
EndX, EndY

并且希望StartX,StartY和EndX,EndY保持不变,但现在控制旋转,控制1和Control2X,Control2Y为立方曲线。

是......

Control1X = StartX + (.66 * (ControlX - StartX))
Control2X = EndX + (.66 * (ControlX - EndX))

使用与计算Control1Y和Control2Y相同的基本功能?

2 个答案:

答案 0 :(得分:7)

您的代码是正确的,除非您使用2.0/3.0代替0.66

答案 1 :(得分:1)

使用

可以避免大多数舍入错误
Control1 = (Start + 2 * Control) / 3
Control2 = (End   + 2 * Control) / 3

请注意,线段也可以使用:

转换为三次贝塞尔曲线
Control1 = Start
Control2 = End

在转换混合各种类型曲线(线性,二次,立方)的复杂路径时,这很方便

还有一个将椭圆弧转换为立方体的基本变换(带有一些不明显的小错误):你只需要在椭圆四边形上至少分割出弧线(首先在两个正交的对称轴上切割椭圆,或者任意正交轴穿过中心,如果椭圆是圆形,则表示每个圆弧;当椭圆是圆柱形时,两个焦点在同一点上混淆,即圆心。)

许多SVG渲染器通过在八分圆上添加额外的分割来实现这一点(这样您不仅可以获得两个主轴穿过的点的精确位置,而且还可以获得两个对角轴的精确位置(当椭圆是一个圆圈)每个象限(当椭圆不是圆形时,将其同化为仅沿着小轴线性变换的圆形,你做同样的计算),因为八分圆也是非常精确定位的(cos(pi / 4) )= sin(pi / 4)= sqrt(2)/ 2~0.71,并且因为这个额外的分裂将允许在与圆的45度处的对角线交叉的点上精确渲染切线):然后将完整的椭圆转换为8立方弧(即椭圆上的8个点和16个控制点):您几乎不会注意到这些椭圆弧和立方弧之间的差异(您可以创建一个算法,该算法使用将Bezier分割为a时计算的相同“展平误差”线性段列表,然后使用th绘制经典的快速Bresenham算法用于线段)。

当您想要从路径中导出其他曲线时,这种任意路径的变换很有用,特别是在给定距离处的“缓冲区”曲线,特别是当这些路径必须转换为具有定义的“笔划宽度”的“笔划”时“:你需要计算两条”内部“和”外部“曲线,然后专注于如何转换斜角/臀部/正方形/圆角,然后在方便的距离处切割长斜角(匹配”斜接限制“因子乘以“笔画宽度”)。

当两个弧之间有一个角而不是两个线段时,更高级的渲染器也将使用由切线圆圈表示的斜角(这对于绘制可爱的地理地图很有用)...

转换任意路径将段,椭圆和贝塞尔曲线混合为仅立方是计算精确图像的必要步骤,在放大时没有可见的过多缺陷。当你的“笔画”缓冲区必须产生一些影响时,这是必要的。作为计算破折号),然后使用半透明像素或子像素增强结果以平滑渲染的笔划(只有当所有内容都被展平为线段时,平滑才易于计算,并且如果只需要,则alsos可能更容易开发管理仅包含三次贝塞尔曲线的路径:如果需要,可以很容易地并行化并通过硬件加速。