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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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】