echarts rgb hsv 颜色空间

原文链接: echarts rgb hsv 颜色空间

上一篇: echarts 3d 散点图 颜色条件查询

下一篇: Python 验证 gevent 对flask的速度提升效果

rgb 颜色空间

7e49fc03da6c8d660c4ecbce3959a4645e2.jpg

<!DOCTYPE html>
<html style="height: 100%">
<head>
  <meta charset="utf-8">
  <title>RGB 颜色空间可视化</title>
</head>
<body style="height: 100%; margin: 0;">
<div id="container" style="height: 100%;"></div>
<script type="text/javascript" src="../../js/echarts.min.js"></script>
<script type="text/javascript" src="../../js/echarts-gl.min.js"></script>
<script type="text/javascript">
  // 获取dom
  let dom = document.getElementById("container");
  // 初始化
  let myChart = echarts.init(dom);

  // 渲染的点集
  let points = []
  // 颜色间隔步长, 点集越大, 会卡...
  let step = 8

  // 颜色最大值
  let limit = 256
  for (let r = 0; r < limit; r += step) {
    for (let g = 0; g < limit; g += step) {
      for (let b = 0; b < limit; b += step) {
        points.push(
          // 一个点由五个数据组成,前三个是x,y,z坐标,最后一个是鼠标悬浮时的提示
          // 第4个是一个需要做另外配置才能生效的颜色相关值, 这里我们用不到
          [r, g, b, null, `${r}-${g}-${b}`]
        )
      }
    }
  }
  let option = {
    grid3D: {},
    // 对坐标轴重新命名
    xAxis3D: {
      name: "R"
    },
    yAxis3D: {
      name: "G"
    },
    zAxis3D: {
      name: "B"
    },
    series: [
      {
        type: 'scatter3D',
        data: points,
        // 我们颜色的渲染使用的是函数式,对每个点, 返回改点对应的rgb颜色值
        color: ({data}) => {
          console.log(data)
          let [r, g, b] = data
          return `rgb(${r},${g},${b})`
        }
      }
    ]
  };
  myChart.setOption(option, true);
  window.onresize = myChart.resize;

</script>
</body>
</html>


hsv 颜色空间

a56ef50f0200abc7e4ce26f805a59878bf3.jpg

<!DOCTYPE html>
<html style="height: 100%">
<head>
  <meta charset="utf-8">
  <title>HSV 颜色空间可视化</title>
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="../echarts/echarts.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
<script type="text/javascript">
  function hsv2rgb(h, s, v) {
    s = s / 100;
    v = v / 100;
    let h1 = Math.floor(h / 60) % 6;
    let f = h / 60 - h1;
    let p = v * (1 - s);
    let q = v * (1 - f * s);
    let t = v * (1 - (1 - f) * s);
    let r, g, b;
    switch (h1) {
      case 0:
        r = v;
        g = t;
        b = p;
        break;
      case 1:
        r = q;
        g = v;
        b = p;
        break;
      case 2:
        r = p;
        g = v;
        b = t;
        break;
      case 3:
        r = p;
        g = q;
        b = v;
        break;
      case 4:
        r = t;
        g = p;
        b = v;
        break;
      case 5:
        r = v;
        g = p;
        b = q;
        break;
    }
    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
  }


  // 获取dom
  let dom = document.getElementById("container");
  // 初始化
  let myChart = echarts.init(dom);

  // 渲染的点集
  let points = []
  // 颜色间隔步长, 点集越大, 会卡...
  let step = 5

  for (let h = 0; h < 360; h += step)
    for (let s = 0; s < 100; s += step)
      for (let v = 0; v < 100; v += step) {
        let [r, g, b] = hsv2rgb(h, s, v)
        r = Math.round(r)
        g = Math.round(g)
        b = Math.round(b)
        console.log(r, g, b)
        let x = s * Math.cos(h * Math.PI / 180)
        let y = s * Math.sin(h * Math.PI / 180)
        if (r < 0 || g < 0 || b < 0 || v < s)
          continue
        points.push(
          [
            x, y, v,
            null,
            `${h}-${s}-${v}`,
            `rgb(${r},${g},${b})`
          ]
        )
      }

  let option = {
    grid3D: {},
    // 对坐标轴重新命名
    xAxis3D: {
      name: "R"
    },
    yAxis3D: {
      name: "G"
    },
    zAxis3D: {
      name: "B"
    },
    series: [
      {
        type: 'scatter3D',
        data: points,
        // 我们颜色的渲染使用的是函数式,对每个点, 返回改点对应的rgb颜色值
        color: ({data}) => {
          console.log(data[5])
          return data[5]
        }
      }
    ]
  };

  myChart.setOption(option, true);
</script>


<script type="text/javascript">

  // 两个浮点数求和
  function accAdd(num1, num2) {
    let r1, r2, m;
    try {
      r1 = num1.toString().split('.')[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = num2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    // return (num1*m+num2*m)/m;
    return Math.round(num1 * m + num2 * m) / m;
  }

  // 两个浮点数相减
  function accSub(num1, num2) {
    let r1, r2, m;
    try {
      r1 = num1.toString().split('.')[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = num2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return (Math.round(num1 * m - num2 * m) / m).toFixed(n);
  }

  // 两数相除
  function accDiv(num1, num2) {
    let t1, t2, r1, r2;
    try {
      t1 = num1.toString().split('.')[1].length;
    } catch (e) {
      t1 = 0;
    }
    try {
      t2 = num2.toString().split(".")[1].length;
    } catch (e) {
      t2 = 0;
    }
    r1 = Number(num1.toString().replace(".", ""));
    r2 = Number(num2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
  }

  function accMul(num1, num2) {
    let m = 0, s1 = num1.toString(), s2 = num2.toString();
    try {
      m += s1.split(".")[1].length
    } catch (e) {
    }
    ;
    try {
      m += s2.split(".")[1].length
    } catch (e) {
    }
    ;
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  }

</script>

<script type="text/javascript">
  document.write("使用js原生态方法");
  document.write("<br/> 1.01 + 1.02 =" + (1.01 + 1.02));
  document.write("<br/> 1.01 - 1.02 =" + (1.01 - 1.02));
  document.write("<br/> 0.000001 / 0.0001 =" + (0.000001 / 0.0001));
  document.write("<br/> 0.012345 * 0.000001 =" + (0.012345 * 0.000001));
  document.write("<br/><hr/>");
  document.write("<br/>使用自定义方法");
  document.write("<br/> 1.01 + 1.02 =" + accAdd(1.01, 1.02));
  document.write("<br/> 1.01 - 1.02 =" + accSub(1.01, 1.02));
  document.write("<br/> 0.000001 / 0.0001 =" + accDiv(0.000001, 0.0001));
  document.write("<br/> 0.012345 * 0.000001 =" + accMul(0.012345, 0.000001));
</script>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值