Javascript 如何使用所有给定参数获得椭圆的轴对齐边界框?

Javascript 如何使用所有给定参数获得椭圆的轴对齐边界框?,javascript,canvas,Javascript,Canvas,canvas context 2D API ellipse()方法创建以(x,y)为中心的椭圆弧,半径为radiusX和radiusY。路径从startAngle开始,以endAngle结束,并以逆时针方向行进 如何使用给定的参数:x,y,radiusX,radiusY,rotation,startAngle,endAngle,Antickly获得椭圆的轴对齐边界框?两种解决方案 这个答案包含两个精确解,它不是近似解 解决办法是 boundEllipseAll将查找整个椭圆的边界。If比完整解决

canvas context 2D API ellipse()方法创建以(x,y)为中心的椭圆弧,半径为radiusX和radiusY。路径从startAngle开始,以endAngle结束,并以逆时针方向行进

如何使用给定的参数:x,y,radiusX,radiusY,rotation,startAngle,endAngle,Antickly获得椭圆的轴对齐边界框?

两种解决方案 这个答案包含两个精确解,它不是近似解

解决办法是

  • boundEllipseAll
    将查找整个椭圆的边界。If比完整解决方案复杂得多,但您需要确保x半径大于y半径(例如将椭圆旋转90度并交换x,y半径)

  • boundEllipse
    将查找椭圆段的边界。它将适用于所有省略号,但我没有包括CCW标志。要获取CCW椭圆的边界,请交换起点和终点角度

    它的工作原理是首先在起点和终点找到x,y坐标,然后沿每个轴计算最小值和最大值。然后计算极值角度,首先计算x轴极值,然后计算y轴极值

    如果极值角度介于起始角度和结束角度之间,则计算该角度的x、y位置,并根据最小和最大范围测试该点

  • 优化空间很大,因为许多点只需要x或y部分,如果正在工作的轴的最小值和最大值发生变化,则内部while循环函数
    极值可以提前退出

    例子 该示例确保我没有犯任何错误,并使用第二种解决方案,通过移动开始和结束角度、旋转和y轴半径来设置椭圆动画。绘制边界框及其边界的椭圆

    const ctx=canvas.getContext(“2d”);
    常数W=200,H=200;
    常数椭圆={
    x:W/2,
    y:H/2,
    rx:W/3,
    ry:W/3,
    旋转:0,
    startAng:0,
    恩当:Math.PI*2,
    导演:错,
    };
    函数boundEllipseAll({x,y,rx,ry,rotate}){
    const xAx=数学cos(旋转);
    const xAy=Math.sin(旋转);
    常数w=(rx**2*xAx**2+ry**2*xAy**2)**0.5;
    常数h=(rx**2*xAy**2+ry**2*xAx**2)**0.5;
    返回{x:-w+x,y:-h+y,w:w*2,h:h*2};
    }
    函数边界椭圆({x,y,rx,ry,rotate,startAng,endAng}){
    常数normalizeAng=ang=>(ang%TAU+TAU)%TAU;
    const getPoint=ang=>{
    常数cA=数学cos(ang);
    const sA=数学sin(ang);
    返回[cA*rx*xAx-sA*ry*xAy,cA*rx*xAy+sA*ry*xAx];
    }
    常数极值=a=>{//从角度
    var i=0;
    而(i<4){
    常数ang=normalizeAng(a+Math.PI*(i/2));
    如果((ang>startAng&&angstartAng&&ang+TAU
    canvas{边框:1px纯黑}
    void ctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle [, anticlockwise]);