2012-02-28 158 views
9

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

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

鉴于由变量四曲线:

StartX, StartY 
ControlX, ControlY 
EndX, EndY 

要得运行startx,StartY和EndX,恩迪保持不变,但到现在已经有Control1X,Control1Y和Control2X,三次曲线的Control2Y。

是...

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

由于用于计算Control1Y和Control2Y相同的基本功能是什么?

+0

另请参阅http://stackoverflow.com/questions/3162645/convert-a-quadratic-bezier-to-a-cubic。 – lhf 2014-03-28 13:23:12

回答

7

你的代码是正确的,除了你应该使用2.0/3.0而不是0.66

0

通过使用

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:如果需要,它可以很容易地并行化,并通过硬件加速)。