Javascript 用二次贝塞尔曲线和三次贝塞尔曲线绘制椭圆

Javascript 用二次贝塞尔曲线和三次贝塞尔曲线绘制椭圆,javascript,html,bezier,Javascript,Html,Bezier,我正在构建一个JavaScript模块,以向HTML5画布元素添加便利函数。我试图给出尽可能多的不同实现来填充我的模块。要查看我的进度,请访问我的和我的 我有一个椭圆绘制方法,使用三次贝塞尔曲线。我知道二次贝塞尔曲线可以转换为三次贝塞尔曲线,但我有一些问题: 近似圆时,误差裕度是否有差异?椭圆 是否有任何理由同时使用这两种实现?(性能、准确性等) 我是否缺少绘制椭圆的其他方法 顺便说一句,这并没有直接关系,但是在这样一个模块中还有其他功能吗 注意:这不是家庭作业 编辑:这是我的椭圆代码(xD

我正在构建一个JavaScript模块,以向HTML5画布元素添加便利函数。我试图给出尽可能多的不同实现来填充我的模块。要查看我的进度,请访问我的和我的

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

  • 近似圆时,误差裕度是否有差异?椭圆
  • 是否有任何理由同时使用这两种实现?(性能、准确性等)
  • 我是否缺少绘制椭圆的其他方法
顺便说一句,这并没有直接关系,但是在这样一个模块中还有其他功能吗

注意:这不是家庭作业

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

相关问题:


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

三次贝塞尔曲线比二次曲线多两条。这样可以进一步减少误差。尽管曲线阶数越高,选择控制点的数学就越复杂,但三次曲线应该足够简单

性能上的差别不大。再进行几次乘法和加法

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


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

我现在基本上就是这么做的,但我使用的是三次曲线而不是二次曲线。检查。是我正在使用的API。对于B样条建议+1。我想我已经在照你说的做了。我会把代码贴在这里以防万一。
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);
}