环形渐变

描述:当前是关于Echarts图表中的 饼图 示例。
 
             const startAlpha = 1;
      const endAlpha = 0;
      var color2 = ['#1DC3EF', '#E17E4E', '#0AB273', '#F08903', '#03B9F7'];
      const color = [
          {
        r: 31,
        g: 209,
        b: 255
      },
        {
          r: 3,
          g: 191,
          b: 254
        },
        {
          r: 255,
          g: 145,
          b: 2
        },
        {
          r: 11,
          g: 191,
          b: 122
        },
        {
          r: 240,
          g: 133,
          b: 82
        }
      ]
      const data = [
          {
        name: "新疆天正通达",
        value: 2025.76,
        _startArc: 0,
        _endArc: 3.0471975511965976,
        _color: "#1DC3EF",
        _percent: 0.16666666666666666
      }, {
        name: "西安省体广场",
        value: 2221.06,
        _startArc: 0,
        _endArc: 3.0471975511965976,
        _color: "#E17E4E",
        _percent: 0.16666666666666666
      }, {
        name: "江苏绿地集团",
        value: 2000.01,
        _startArc: 1.0471975511965976,
        _endArc: 0,
        _color: "#0AB273",
        _percent: 0.16666666666666666
      }, {
        name: "家利物业",
        value: 1236.23,
        _startArc: 3.0471975511965976,
        _endArc: 0,
        _color: "#F08903",
        _percent: 0.16666666666666666
      }, {
        name: "西安省体广场",
        value: 1236.23,
        _startArc: 3.0471975511965976,
        _endArc: 0,
        _color: "#03B9F7",
        _percent: 0.16666666666666666
      }]

      /**
       * 线性渐变起止方向的计算方法
       *
       *
       * @param {*} startArc 开始角度
       * @param {*} endArc 结束角度
       * @returns 四个坐标 x,y,x2,y2
       */
      function getCoordinates(startArc, endArc) {
        const posi = [
          Math.sin(startArc),
          -Math.cos(startArc),
          Math.sin(endArc),
          -Math.cos(endArc)
        ]
        const dx = posi[2] - posi[0]
        const dy = posi[3] - posi[1]

        return getLocation(dx, dy)
      }

      function getLocation(dx, dy) {
        const tanV = dx / dy
        const directSign = Math.abs(tanV) < 1
        const t = directSign ? tanV : 1 / tanV

        const sign1 = t > 0 ? 1 : -1
        const sign2 = dx > 0 ? 1 : -1
        const sign = directSign ? sign1 * sign2 : sign2

        const group1 = [0.5 - sign * t / 2, 0.5 + sign * t / 2]
        const group2 = sign > 0 ? [0, 1] : [1, 0]
        const group = [...group1, ...group2]
        const keys = directSign ? ['x', 'x2', 'y', 'y2'] : ['y', 'y2', 'x', 'x2']

        let res = {}
        keys.forEach((k, idx) => {
          res[k] = group[idx]
        })
        return res
      }

      /**
       * 给数据写入 样式(线性渐变)
       *
       * @param {*} datas 数据
       * @param {*} colorlist 颜色列表
       * @param {*} startAlpha 开始颜色的透明度
       * @param {*} endAlpha 结束颜色透的明度
       * @returns 带样式的数据
       */
      function setGradientColorInItemSyle(datas, colorlist, startAlpha, endAlpha) {
        for (let i = 0; i < datas.length; i++) {
          const color = colorlist[i];
          const startArc = datas[i]._startArc;
          const endArc = datas[i]._endArc;
          // 这里计算了 线性渐变的起止方向
          const coordinates = getCoordinates(startArc, endArc);
          datas[i].itemStyle = {
            color: {
              ...coordinates,
              type: "linear",
              global: false,
              // 这里给了 线性渐变的起止颜色
              colorStops: [{
                offset: 0,
                color: `rgba(${color.r}, ${color.g}, ${color.b}, ${startAlpha})`
              }, {
                offset: 1,
                color: `rgba(${color.r}, ${color.g}, ${color.b}, ${endAlpha})`
              }]
            }
          }
        }
        return datas
      }

      var height = 50;
      var option = {
        color: ['#1DC3EF', '#E17E4E', '#0AB273', '#F08903', '#03B9F7'],
        tooltip: {
          trigger: "item",
        },
        series: [{
          type: "pie",
          data: setGradientColorInItemSyle(data, color, endAlpha, startAlpha),
          // "animation": false,
          radius: [height, height + 10],
          center: ["50%", "50%"],
          itemStyle: {
            normal: {
              label: {
                show: true,
                position: 'outside',
                color: 'rgba(172, 195, 237, 1.00)',
              },
              labelLine: {
                length: 20,
                length2: 20,
                show: true,
              }
            }
          },
        }]
      };