You need to enable JavaScript to run this app. 如何使用JavaScript根据已知椭圆宽高与中心夹角计算对应半径
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript根据已知椭圆宽高与中心夹角计算对应半径

椭圆指定角度下的轮廓半径计算方法

基础参数定义

首先明确计算前需要统一的参数口径,避免逻辑偏差:

  • 椭圆宽度:椭圆外接轴对齐矩形的水平方向总跨度,记为W,对应的水平半轴长度为 a = W / 2
  • 椭圆高度:椭圆外接轴对齐矩形的垂直方向总跨度,记为H,对应的垂直半轴长度为 b = H / 2
  • 指定角度:从椭圆中心水平向右(x轴正方向)为起点,逆时针旋转的夹角,公式推导默认以这个方向为角度0基准

核心计算公式推导

轴对齐椭圆的标准直角坐标方程为:

x²/a² + y²/b² = 1

我们要算的轮廓半径r,是椭圆中心到对应角度轮廓点的直线距离,极坐标下该点的坐标满足:

  • x = r * cosθ
  • y = r * sinθ

把坐标关系代入椭圆标准方程,就能解出r的表达式:

  1. 代入后展开:(r² * cos²θ)/a² + (r² * sin²θ)/b² = 1
  2. 提取公因子r²:r² * (cos²θ/a² + sin²θ/b²) = 1
  3. 整理得到半径计算公式:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 03:36:05