看转换二次贝塞尔曲线到立方?我终于明白为什么编程老师总是告诉我数学是如此重要.可悲的是,我没有听.
任何人都可以提供更具体的 - 例如,计算机语言 - y - 将二次曲线转换为立方曲线的公式吗?了解可能存在一些舍入错误,这很好.
给定由变量表示的四边形曲线:
StartX, StartY
ControlX, ControlY
EndX, EndY
Run Code Online (Sandbox Code Playgroud)
并期望StartX,StartY和EndX,EndY保持不变,但现在有一个立方曲线的Control1X,Control1Y和Control2X,Control2Y.
是吗...
Control1X = StartX + (.66 * (ControlX - StartX))
Control2X = EndX + (.66 * (ControlX - EndX))
Run Code Online (Sandbox Code Playgroud)
使用与计算Control1Y和Control2Y相同的基本功能?
您可以通过使用避免大多数舍入错误
Control1 = (Start + 2 * Control) / 3
Control2 = (End + 2 * Control) / 3
Run Code Online (Sandbox Code Playgroud)
请注意,线段也可以使用以下方法转换为三次贝塞尔曲线:
Control1 = Start
Control2 = End
Run Code Online (Sandbox Code Playgroud)
这在转换混合各种类型曲线(线性、二次、三次)的复杂路径时会很方便。
还有一个将椭圆弧转换为三次方的基本变换(有一些不明显的小错误):您只需要至少在椭圆四边形上分割弧(首先在对称的两个正交轴上切割椭圆,或者在任意正交轴上切割椭圆)如果椭圆是圆,则通过中心,则代表每条圆弧;当椭圆是圆时,两个焦点混淆在同一个点,圆的中心,因此您可以使用任意方向作为其中一个正交轴)。
许多 SVG 渲染器通过在八分圆上添加额外的分割来实现这一点(这样您不仅可以获得两个主轴穿过的点的精确位置,还可以获得两个等分的对角轴(当椭圆是圆形时)的精确位置)每个象限(当椭圆不是圆时,将其同化为一个仅沿小轴进行线性变换变平的圆,您进行相同的计算),因为八分圆也非常精确地定位:
cos(pi/4) = sin(pi/4) = sqrt(2)/2 ? 0.71,并且因为这种额外的分裂将允许精确渲染与圆的 45 度对角线交叉的点上的切线。
然后将一个完整的椭圆转换为 8 个立方弧(即椭圆上的 8 个点和 16 个控制点):您几乎不会注意到椭圆弧和这些生成的立方弧之间的区别
您可以创建一个算法,该算法使用在将 Bezier 拆分为线性段列表时计算的相同“展平误差”,然后使用经典的快速 Bresenham 算法绘制线段;“展平”算法只需要测量连接椭圆的两个焦点到生成的三次弧的任何点的两个直线段的长度总和的相对偏差,因为这个总和在任何真正的椭圆上都是常数:如果您对生成的三次弧的控制点进行此测量,差异应低于预期总和的给定百分比,或在绝对距离精度内,并且可用于使用简单的线性公式创建更好的控制点近似值这样这些添加的点就会在真正的椭圆上。
当您想从路径中导出其他曲线时,这种任意路径的变换很有用,特别是给定距离处的“缓冲区”曲线,特别是当这些路径必须转换为具有定义的“笔画宽度”的“笔画”时:需要计算两条“内”和“外”曲线,然后专注于如何转换斜接/斜接/正方形/圆角,然后在方便的距离切割长斜接(匹配“斜接限制”因子乘以“笔画宽度”)。
当两个圆弧之间有一个角而不是两个线段时,更高级的渲染器还将使用由切圆表示的斜接(这对于绘制可爱的地理地图很有用)...
将任意路径混合段、椭圆和贝塞尔弧转换为仅三次弧是计算精确图像的必要步骤,放大时没有可见的过多缺陷。当您的“笔画”缓冲区必须采取一些效果(例如计算破折号),然后用半透明像素或子像素增强结果以平滑渲染的笔划(平滑很容易计算,只有当一切都被展平为线段时,如果只需要管理路径,也可能更容易开发仅包含三次贝塞尔曲线:如果需要,它可以很容易地并行化并通过硬件加速)。贝塞尔弧总是很有趣,因为绘制它们很快,只需要基本的算术,
总之,所有曲线都可以用三次贝塞尔弧表示,允许最大可测量偏差(您可以将此最大偏差设置为二分之一像素,或者如果您首先放大测量网格以进行半色调或子像素着色,然后以合理的快速渲染准确表示每条曲线,并在任何缩放级别获得准确渲染,曲线随处平滑,包括在最终使用经典 Bresenham 算法使用快速整数算法绘制线性笔划时使用半色调或透明度级别)。这些渲染的曲线在任何地方都会有正确的切线,在近似点上没有任何意外的角度可见,并且近似中的剩余控制点也会很好地平滑渲染各处的曲率(即
如果您需要更高的精度,请使用阶数为 4 的贝塞尔弧(即曲线上的点之间具有 3 个控制点)以在补充阶数(例如力梯度)上获得平滑的推导,或者仅通过附加步骤进一步分割三次弧,直到推导足够平滑(但与仅使用三次贝塞尔曲线相比,对于相同的精度容差,使用 4 阶贝塞尔弧需要的点曲线和控制点要少得多)。