Skip to content

椭圆

ELLIPSE

椭圆图形。

基础属性

图形的基本属性

arcData

圆弧数据。虽然类型是椭圆,但可以通过设置一些属性,表达为圆弧。

  • arcData.startingAngle:圆弧起始弧度。
  • arcData.endingAngle:圆弧结束弧度。
  • arcData.innerRadius:内部空心椭圆半径比椭圆半径的比值,范围 [0, 1],可实现圆环绘制。

两个 angle 的弧度值范围为 [0, PI*2),方向为顺时针,基准方向为正右(对应向量为 (1, 0))。

对应的 UI 层属性为 start、sweep 和 ratio。

alt text

上面 UI 层属性值对应的数据层值为:

js
{
  startingAngle: 5.497786998748779,
  endingAngle: 3.9269909858703613,
  innerRadius: 0.3861727714538574,
};

ratio 就是 innerRadius,只是转成了百分比的格式。

start 是 startingAngle 弧度转角度后的值。

西瓜哥我发现, Figma 在数据层上,弧度值是可以大于 PI,但却并不希望在 UI 层上出现大于 180 度的角度。

所以在计算时,需要将弧度转换到 (-2*PI, 2*PI] 区间,再转为角度。

js
// 弧度区间转换,转为 (-PI * 2, PI * 2]
const normalRad = (rad) => {
  rad %= Math.PI * 2;
  if (rad < 0) {
    rad += Math.PI * 2;
  }

  if (rad > Math.PI) {
    rad -= Math.PI * 2;
  }
  return rad;
};

const getArcDeg = (rad) => {
  rad = normalRad(rad)
  const deg = (rad * 180) / Math.PI;
  return deg;
};

getArcDeg(5.497786998748779);
// -45.00000830979934

sweep 为 start 顺时针扫过的弧度(即 endingAngle - startingAngle),比上 PI * 2。

js
const getSweep = (start, end) => {
  let sweep = end - start;
  sweep = (sweep);
  return sweep / (Math.PI * 2);
};

getSweep(5.497786998748779, 3.9269909858703613);
// -0.24999995003864073