Javascript 如何使用所有给定参数获得椭圆的轴对齐边界框?
canvas context 2D API ellipse()方法创建以(x,y)为中心的椭圆弧,半径为radiusX和radiusY。路径从startAngle开始,以endAngle结束,并以逆时针方向行进 如何使用给定的参数:x,y,radiusX,radiusY,rotation,startAngle,endAngle,Antickly获得椭圆的轴对齐边界框?两种解决方案 这个答案包含两个精确解,它不是近似解 解决办法是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比完整解决
boundEllipseAll
将查找整个椭圆的边界。If比完整解决方案复杂得多,但您需要确保x半径大于y半径(例如将椭圆旋转90度并交换x,y半径)
boundEllipse
将查找椭圆段的边界。它将适用于所有省略号,但我没有包括CCW标志。要获取CCW椭圆的边界,请交换起点和终点角度
它的工作原理是首先在起点和终点找到x,y坐标,然后沿每个轴计算最小值和最大值。然后计算极值角度,首先计算x轴极值,然后计算y轴极值
如果极值角度介于起始角度和结束角度之间,则计算该角度的x、y位置,并根据最小和最大范围测试该点
极值可以提前退出
例子
该示例确保我没有犯任何错误,并使用第二种解决方案,通过移动开始和结束角度、旋转和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]);