如何使用JavaScript根据已知椭圆宽高与中心夹角计算对应半径
椭圆指定角度下的轮廓半径计算方法
基础参数定义
首先明确计算前需要统一的参数口径,避免逻辑偏差:
- 椭圆宽度:椭圆外接轴对齐矩形的水平方向总跨度,记为
W,对应的水平半轴长度为a = W / 2 - 椭圆高度:椭圆外接轴对齐矩形的垂直方向总跨度,记为
H,对应的垂直半轴长度为b = H / 2 - 指定角度:从椭圆中心水平向右(x轴正方向)为起点,逆时针旋转的夹角,公式推导默认以这个方向为角度0基准
核心计算公式推导
轴对齐椭圆的标准直角坐标方程为:
x²/a² + y²/b² = 1
我们要算的轮廓半径r,是椭圆中心到对应角度轮廓点的直线距离,极坐标下该点的坐标满足:
- x = r * cosθ
- y = r * sinθ
把坐标关系代入椭圆标准方程,就能解出r的表达式:
- 代入后展开:
(r² * cos²θ)/a² + (r² * sin²θ)/b² = 1 - 提取公因子r²:
r² * (cos²θ/a² + sin²θ/b²) = 1 - 整理得到半径计算公式:
r = 1 / sqrt( cos²θ/a² + sin²θ/b² )
JavaScript 代码实现
注意:JS内置的三角函数
Math.cos()、Math.sin()只接受弧度值作为参数,直接传入角度制的数值,计算结果会完全偏差。日常使用角度制(比如0°、90°这类直观表达)时,需要先做单位换算:弧度值 = 角度值 * Math.PI / 180
可复用的计算函数实现如下:
/** * 计算轴对齐椭圆指定角度下的轮廓半径 * @param {number} ellipseWidth 椭圆总宽度 * @param {number} ellipseHeight 椭圆总高度 * @param {number} angleDeg 从中心x轴正方向逆时针旋转的角度(单位:度) * @returns {number} 对应角度下的椭圆轮廓半径 */ function getEllipseRadius(ellipseWidth, ellipseHeight, angleDeg) { // 计算长、短半轴长度 const halfWidth = ellipseWidth / 2; const halfHeight = ellipseHeight / 2; // 角度转弧度 const theta = angleDeg * Math.PI / 180; // 代入公式计算 const cosVal = Math.cos(theta); const sinVal = Math.sin(theta); const denominator = (cosVal ** 2) / (halfWidth ** 2) + (sinVal ** 2) / (halfHeight ** 2); return 1 / Math.sqrt(denominator); }
验证测试
比如传入椭圆宽200、高100,计算0度(x轴正方向)的半径:
- 代入参数:halfWidth=100,halfHeight=50,theta=0
- 计算得cosVal=1,sinVal=0,denominator=1/10000
- 最终r=100,和水平半轴长度完全匹配,验证逻辑正确。
同理计算90度位置的半径,得到结果50,和垂直半轴长度一致。
常见注意事项
- 角度基准偏差:如果业务场景里角度是从垂直向上(y轴正方向)为起点顺时针计算的,需要先把传入的角度值换算成和公式匹配的基准(比如用90度减去原角度值),再传入函数计算,避免结果偏转
- 非法参数处理:当椭圆宽度或高度为0时,会出现除零错误,实际业务中可以增加基础的参数校验逻辑
- 倾斜椭圆适配:上述公式仅适用于长、短轴和x/y轴对齐的椭圆,如果椭圆本身有旋转角度,需要先把目标角度旋转到和椭圆长轴对齐的坐标系下,再代入公式计算
内容的提问来源于stack exchange,提问作者milky_jay
相关产品推荐
相关产品推荐

