绘制带有二次贝塞尔曲线和三次贝塞尔曲线的椭圆

时间:2011-04-06 08:24:05

标签: javascript html5 bezier

我正在构建一个JavaScript模块,以便为HTML5 canvas元素添加便利功能。我试图尽可能多地提供不同的实现来填写我的模块。要查看我的进度,请访问我的project page和我的examples page

我有一个使用三次贝塞尔曲线的椭圆绘制方法。我知道二次贝塞尔曲线可以转换成三次贝塞尔曲线,但我有一些问题:

  • 近似圆圈时误差幅度是否有差异?椭圆?
  • 有没有理由同时实施这两种方式? (表现,准确性等)
  • 我是否缺少任何其他绘制省略号的方法?

P.S。这不是直接相关的,但是在这样的模块中是否还有其他任何功能?

注意:这是作业。

编辑:这是我的椭圆代码(xDis是半径x,yDis是半径y):

function ellipse(x, y, xDis, yDis) {
    var kappa = 0.5522848, // 4 * ((√(2) - 1) / 3)
        ox = xDis * kappa,  // control point offset horizontal
        oy = yDis * kappa,  // control point offset vertical
        xe = x + xDis,      // x-end
        ye = y + yDis;      // y-end

    this.moveTo(x - xDis, y);
    this.bezierCurveTo(x - xDis, y - oy, x - ox, y - yDis, x, y - yDis);
    this.bezierCurveTo(x + ox, y - yDis, xe, y - oy, xe, y);
    this.bezierCurveTo(xe, y + oy, x + ox, ye, x, ye);
    this.bezierCurveTo(x - ox, ye, x - xDis, y + oy, x - xDis, y);
}

相关问题:

Convert a quadratic bezier to a cubic?

https://stackoverflow.com/questions/2688808/drawing-quadratic-bezier-circles-with-a-given-radius-how-to-determine-control-po

2 个答案:

答案 0 :(得分:1)

三次贝塞尔曲线比二次曲线有两个degrees of freedom。因此可以进一步减少误差。虽然选择控制点的数学变得越复杂,但曲线的程度越高,立方曲线应该足够简单。

性能差异不大。还有一些乘法和补充。

虽然这可以通过旋转平面来实现,但能够指定椭圆的轴是很好的。一个中心和两个轴将形成椭圆center + cos(t)*axis1 + sin(t)*axis2

库的另一个特征可能是不同种类的多项式曲线和样条。 B-spline类似于贝塞尔曲线,但可以沿多个控制点继续。

答案 1 :(得分:0)

如果它是一个椭圆椭圆,那么绘制椭圆的标准参数形式是不是更容易,如果它具有非规范方向,则将结果通过旋转变换?