canvas 绘制星座图(好玩)--转载

复制代码
<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8" />
    <title>canvas星座</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #box {
        margin: 10px 0 0 10px;
      }
      input {
        outline: none;
        font-size: 16px;
      }
      p {
        margin-bottom: 10px;
      }
      input[type="date"] {
        height: 36px;
        text-indent: 10px;
      }
      input[type="button"] {
        background: #3a92ff;
        color: white;
        border: none;
        height: 40px;
        padding: 0 10px;
        margin-left: -2px;
      }
      #canvas {
        margin-left: 10px;
        background-color: #000;
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="box">
      <p>请选择您的出生日期</p>
      <input type="date" id="birth" /><input
        type="button"
        id="btn"
        value="展示我的星空图"
      />
    </div>
     <canvas id="canvas" width="550" height="550"
      >你的浏览器不支持canvas</canvas
    >
    <script type="text/javascript">
      var box = document.getElementById("box");
      var birth = document.getElementById("birth");
      var btn = document.getElementById("btn");
      var canvas = document.getElementById("canvas");
      var ctx = canvas.getContext("2d");
      var g1, date, timer;
      ctx.font = "30px Courier New";
      /*星座位置*/
      var star = {
        白羊座: [
          [
            [0.3, 0.78],
            [0.34, 0.66],
            [0.28, 0.48],
            [0.6, 0.26],
            [0.65, 0.2],
            [0.71, 0.23],
            [0.7, 0.32],
            [0.72, 0.36],
          ],
          [
            [0, 1, 2, 3, 4, 5],
            [3, 6, 7],
          ],
        ],
        天秤座: [
          [
            [0.16, 0.67],
            [0.34, 0.6],
            [0.6, 0.27],
            [0.75, 0.23],
            [0.84, 0.47],
            [0.63, 0.74],
            [0.51, 0.78],
          ],
          [[0, 1, 2, 3, 4, 5, 6]],
        ],
        摩羯座: [
          [
            [0.78, 0.21],
            [0.78, 0.34],
            [0.75, 0.45],
            [0.75, 0.7],
            [0.69, 0.78],
            [0.31, 0.66],
            [0.22, 0.49],
            [0.3, 0.53],
            [0.53, 0.54],
          ],
          [[0, 1, 2, 3, 4, 5, 6, 7, 8, 1]],
        ],
        水瓶座: [
          [
            [0.45, 0.21],
            [0.37, 0.35],
            [0.27, 0.51],
            [0.3, 0.58],
            [0.29, 0.64],
            [0.48, 0.79],
            [0.51, 0.71],
            [0.58, 0.68],
            [0.73, 0.74],
            [0.43, 0.53],
            [0.53, 0.47],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6, 7, 8],
            [2, 9, 10],
          ],
        ],
        双鱼座: [
          [
            [0.28, 0.43],
            [0.28, 0.53],
            [0.36, 0.73],
            [0.43, 0.78],
            [0.5, 0.7],
            [0.53, 0.62],
            [0.57, 0.58],
            [0.63, 0.43],
            [0.67, 0.39],
            [0.74, 0.39],
            [0.77, 0.34],
            [0.72, 0.3],
            [0.75, 0.22],
            [0.23, 0.5],
            [0.66, 0.33],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
            [0, 13, 1],
            [8, 14, 11],
          ],
        ],
        金牛座: [
          [
            [0.29, 0.21],
            [0.39, 0.36],
            [0.5, 0.51],
            [0.5, 0.57],
            [0.61, 0.63],
            [0.77, 0.71],
            [0.79, 0.79],
            [0.22, 0.43],
            [0.39, 0.57],
            [0.6, 0.71],
            [0.67, 0.76],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6],
            [7, 8, 3],
            [4, 9, 10],
          ],
        ],
        双子座: [
          [
            [0.18, 0.37],
            [0.25, 0.45],
            [0.35, 0.55],
            [0.39, 0.68],
            [0.49, 0.77],
            [0.51, 0.63],
            [0.57, 0.78],
            [0.28, 0.29],
            [0.42, 0.32],
            [0.61, 0.49],
            [0.72, 0.6],
            [0.83, 0.59],
            [0.69, 0.75],
            [0.22, 0.54],
            [0.35, 0.43],
            [0.48, 0.21],
          ],
          [
            [0, 1, 2, 3, 4],
            [2, 5, 6],
            [7, 8, 9, 10, 11],
            [9, 12],
            [13, 1, 14, 8, 15],
          ],
        ],
        巨蟹座: [
          [
            [0.16, 0.39],
            [0.27, 0.36],
            [0.52, 0.49],
            [0.57, 0.65],
            [0.83, 0.78],
            [0.44, 0.21],
          ],
          [
            [0, 1, 2, 3, 4],
            [2, 5],
          ],
        ],
        狮子座: [
          [
            [0.16, 0.75],
            [0.23, 0.67],
            [0.39, 0.77],
            [0.71, 0.53],
            [0.64, 0.39],
            [0.55, 0.37],
            [0.47, 0.27],
            [0.54, 0.24],
            [0.6, 0.27],
            [0.85, 0.56],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6, 7, 8],
            [3, 9],
          ],
        ],
        处女座: [
          [
            [0.16, 0.59],
            [0.35, 0.63],
            [0.44, 0.7],
            [0.62, 0.51],
            [0.77, 0.46],
            [0.84, 0.37],
            [0.6, 0.42],
            [0.65, 0.26],
            [0.34, 0.75],
          ],
          [
            [0, 1, 2, 3, 4, 5],
            [3, 6, 7],
            [2, 8],
          ],
        ],
        天蝎座: [
          [
            [0.17, 0.5],
            [0.28, 0.63],
            [0.19, 0.7],
            [0.28, 0.78],
            [0.41, 0.77],
            [0.49, 0.72],
            [0.57, 0.55],
            [0.59, 0.44],
            [0.69, 0.31],
            [0.74, 0.21],
            [0.82, 0.29],
            [0.79, 0.44],
            [0.73, 0.5],
            [0.38, 0.47],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
            [1, 13],
            [8, 11],
          ],
        ],
        射手座: [
          [
            [0.22, 0.66],
            [0.24, 0.51],
            [0.45, 0.4],
            [0.54, 0.37],
            [0.59, 0.43],
            [0.66, 0.5],
            [0.63, 0.6],
            [0.66, 0.67],
            [0.74, 0.53],
            [0.77, 0.39],
            [0.49, 0.47],
            [0.29, 0.68],
            [0.3, 0.78],
            [0.48, 0.21],
            [0.52, 0.27],
            [0.59, 0.29],
          ],
          [
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
            [2, 10, 11, 12],
            [10, 4],
            [13, 14, 15, 3],
            [14, 3],
          ],
        ],
      };
      /*根据出生日期获取星座信息*/
      function getStarSign(ts) {
        var d = new Date(ts),
          sign = d.getMonth() * 100 + d.getDate();
        switch (true) {
          case sign < 20:
            return "摩羯座";
          case sign < 119:
            return "水瓶座";
          case sign < 221:
            return "双鱼座";
          case sign < 320:
            return "白羊座";
          case sign < 421:
            return "金牛座";
          case sign < 522:
            return "双子座";
          case sign < 623:
            return "巨蟹座";
          case sign < 723:
            return "狮子座";
          case sign < 823:
            return "处女座";
          case sign < 923:
            return "天秤座";
          case sign < 1022:
            return "天蝎座";
          case sign < 1122:
            return "射手座";
          default:
            return "摩羯座";
        }
      }
      /*绘制星座*/
      function constellation(ctx, ary, w, h) {
        /*创建线条*/
        var points = ary[0],
          lines = ary[1];
        ctx.strokeStyle = "#FFF";
        var len = lines.length,
          i,
          ii,
          line,
          point;
        ctx.beginPath();
        while (len--) {
          i = 1;
          line = lines[len];
          ii = line.length;
          point = points[line[0]];
          ctx.moveTo(point[0] * w, point[1] * h);
          for (; i < ii; i++) {
            point = points[line[i]];
            ctx.lineTo(point[0] * w, point[1] * h);
          }
        }
        ctx.stroke();
        /*创建小圆*/
        var cur;
        i = 0;
        ii = points.length;
        for (; i < ii; i++) {
          cur = points[i];
          new Circle(cur[0] * w, cur[1] * h).draw(); //new出实例
        }
      }
      /*创建小圆的构造函数*/
      function Circle(x, y, r) {
        this.x = x;
        this.y = y;
        this.r = r || Math.round(Math.random() * 8 + 4);
      }
      Circle.prototype = {
        draw: function () {
          ctx.beginPath();
          g1 = ctx.createRadialGradient(
            this.x,
            this.y,
            Math.round(Math.random() * 1 + 1),
            this.x,
            this.y,
            Math.round(Math.random() * 3 + 6)
          );
          g1.addColorStop(0, "rgba(255,255,255,.9)");
          g1.addColorStop(1, "rgba(0,0,0,.1)");
          ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, true);
          ctx.fillStyle = g1;
          ctx.closePath();
          ctx.fill();
          return this;
        },
      };
      /*点击‘展示我的星空图’按钮*/
      btn.onclick = function (e) {
        clearInterval(timer);
        e.preventDefault();
        if (!birth.value) {
          alert("请选择您的出生日期");
        } else {
          canvas.style.display = "block";
          date = new Date(birth.value.replace(/-/g, "/")).getTime();
          timer = setInterval(function () {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.strokeText(getStarSign(date), 50, 50);
            constellation(
              ctx,
              star[getStarSign(date)],
              canvas.width,
              canvas.height
            );
          }, 500);
        }
      };
    </script>
  </body>
</html>
复制代码

 

posted @   a瑶池  阅读(1149)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示