通过使用
Control1 = (Start + 2 * Control)/3
Control2 = (End + 2 * Control)/3
注意避免最舍入误差的是线段使用也可转换为三次Bezier曲线:
Control1 = Start
Control2 = End
转换复杂路径混合各种类型的时,这是很方便的曲线(线性,二次,立方)
还有一个基本的变换,用于将椭圆弧转换为立方体(有一些小的不明显的错误s):你只需要在椭圆quadrans上至少分割圆弧(首先在对称轴的两个正交轴上切割椭圆,或者在椭圆是圆的任意正交轴上切割椭圆,然后表示每个圆弧;当椭圆是一个cricle时,两个焦点在同一个点上,即圆心)混淆。
许多SVG渲染器通过在八分区上添加一个额外的分割来实现这一点(这样您不仅可以精确定位两个主轴所经过的点,而且还可以获得两个对角线轴的双侧(当椭圆(当椭圆不是一个圆时,只将它看作一个只有沿着小轴的线性变换而变平的圆,可以进行相同的计算),因为八分圆的位置也相当精确(cos(π/ 4)= sin(π/ 4)= sqrt(2)/ 2〜0.71,并且因为这种附加分割将允许在圆的45度处穿过对角线的点上的切线的精确呈现):然后将全椭圆转换为8个圆弧(即椭圆上的8个点和16个控制点):您几乎不会注意到这些椭圆弧和立方弧之间的差异(您可以创建一个使用t他将Bezier分割成线性片段列表时计算的相同的“扁平化误差”,然后使用经典的快速Bresenham算法对线段进行绘制)。
这种变换的任意路径时要在给定的距离来导出从路径其它曲线,“缓冲器”的特别是曲线,特别是当这些路径必须被转换为“笔划”用是有用定义“笔画宽度”:您需要计算两条“内”和“外”曲线,然后专注于如何转换定位器/按钮/方块/圆角,然后在适当距离处切割长定位器(匹配“斜接限制“因子乘以”行程宽度“)。
更先进的渲染也将使用由相切圆表示斜角时,有两条弧线,而不是两个片段之间的角落(这是绘制可爱地理地图有用)...
转换任意路径混合件,椭圆和贝塞尔曲线只有立方体是计算精确图像的必要步骤,而放大时不会出现过多的缺陷。当您的“描边”缓冲区必须采取某些效果(如计算短划线),然后增强结果使用半透明像素或子像素来平滑渲染的笔画(只有当所有内容都被平铺为线段时,平滑才容易计算出来,并且如果仅管理仅包含幼体的路径,则可以更容易地开发alsos ic beziers:如果需要,它可以很容易地并行化,并通过硬件加速)。
另请参阅http://stackoverflow.com/questions/3162645/convert-a-quadratic-bezier-to-a-cubic。 – lhf 2014-03-28 13:23:12