Canvas实例篇:十二星座之天蝎座

article/2025/6/8 5:58:44

Canvas实例篇:十二星座之天蝎座

  • 前言
  • 效果预览
  • 代码实现
  • 代码说明
    • 星座特定星
  • 结语

前言

星座总给人浪漫而神秘的感觉,如何用代码还原星空中的浪漫?本文将通过 Canvas 技术,讲述如何实现一个可交互的天蝎座星空图,包含星星闪烁、星座连线、动态效果控制等功能。

效果预览

天蝎座星空图

代码实现

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>天蝎座星空图</title><style>body,html {margin: 0;padding: 0;width: 100%;height: 100%;overflow: hidden;background-color: #000;}canvas {display: block;position: absolute;top: 0;left: 0;}.constellation-info {position: absolute;bottom: 20px;left: 20px;color: #fff;font-family: Arial, sans-serif;background: rgba(0, 0, 0, 0.5);padding: 10px;border-radius: 5px;}.controls {position: absolute;top: 20px;right: 20px;color: white;font-family: Arial, sans-serif;}button {background: rgba(255, 255, 255, 0.1);color: white;border: 1px solid rgba(255, 255, 255, 0.3);padding: 5px 10px;margin: 5px;cursor: pointer;border-radius: 3px;}button:hover {background: rgba(255, 255, 255, 0.2);}</style></head><body><canvas id="starCanvas"></canvas><div class="constellation-info"><h3>天蝎座 (10月24日 ~ 11月12日)</h3><p>黄道十二宫之一</p><p>象征神秘与力量的星座</p></div><div class="controls"><button id="toggleLines">显示/隐藏连线</button><button id="toggleNames">显示/隐藏星名</button><button id="toggleAnimation">暂停/继续动画</button></div><script>// 获取Canvas元素和绘图上下文const canvas = document.getElementById('starCanvas');const ctx = canvas.getContext('2d');// 设置Canvas尺寸为窗口大小function resizeCanvas() {canvas.width = window.innerWidth;canvas.height = window.innerHeight;}resizeCanvas();window.addEventListener('resize', resizeCanvas);// 存储星星的数组const stars = [];// 天蝎座主星数据const scorpioStars = [{name: "心宿二",x: 0.54,y: 0.41,magnitude: 5.0,color: "#FF5252"},{name: "心宿一",x: 0.6,y: 0.3,magnitude: 2.9,color: "#FFA726"},{name: "心宿三",x: 0.58,y: 0.24,magnitude: 2.8,color: "#FFA726"},{name: "房宿四",x: 0.65,y: 0.4,magnitude: 2.8,color: "#64B5F6"},{name: "房宿三",x: 0.67,y: 0.44,magnitude: 2.9,color: "#FFF59D"}, {name: "尾宿二",x: 0.5,y: 0.7,magnitude: 3.3,color: "#FFCC80"}, {name: "尾宿七",x: 0.4,y: 0.8,magnitude: 2.6,color: "#FFCCBC"}, {name: "尾宿六",x: 0.35,y: 0.85,magnitude: 3.8,color: "#FFCCBC"}, {name: "尾宿四",x: 0.3,y: 0.8,magnitude: 3.4,color: "#FFCCBC"}, {name: "尾宿三",x: 0.28,y: 0.7,magnitude: 2.7,color: "#42A5F5"}, {name: "尾宿五",x: 0.3,y: 0.64,magnitude: 3.0,color: "#FFFFC3"},{name: "尾宿八",x: 0.25,y: 0.66,magnitude: 1.8,color: "#FF5252"},];// 天蝎座星座连线const starConnections = [// 头部[0, 1],[1, 2],[1, 3],[3, 4],// 身体[0, 5],[5, 6],[6, 7],[7, 8],[8, 9],// 尾钩[9, 10],[9, 11]];// 初始化随机星星function initStars(count) {for (let i = 0; i < count; i++) {stars.push({x: Math.random(),y: Math.random(),size: Math.random() * 2,brightness: Math.random(),twinkleSpeed: Math.random() * 0.01});}// 添加星座星星scorpioStars.forEach(star => {stars.push({x: star.x,y: star.y,size: star.magnitude,brightness: 1,isConstellation: true,name: star.name,color: star.color});});}// 绘制星空function drawStars() {// 清空画布ctx.fillStyle = '#000a1a';ctx.fillRect(0, 0, canvas.width, canvas.height);// 绘制背景星星stars.forEach(star => {if (!star.isConstellation) {// 让星星闪烁const twinkle = Math.sin(Date.now() * star.twinkleSpeed) * 0.5 + 0.5;const alpha = star.brightness * twinkle;ctx.fillStyle = `rgba(255, 255, 255, ${alpha})`;ctx.beginPath();ctx.arc(star.x * canvas.width,star.y * canvas.height,star.size,0,Math.PI * 2);ctx.fill();}});// 绘制星座连线if (showLines) {ctx.strokeStyle = 'rgb(255, 255, 255)';ctx.lineWidth = 3;starConnections.forEach(connection => {const startIndex = connection[0];const endIndex = connection[1];// 确保索引有效if (startIndex < scorpioStars.length && endIndex < scorpioStars.length) {const start = stars[stars.length - scorpioStars.length + startIndex];const end = stars[stars.length - scorpioStars.length + endIndex];ctx.beginPath();// 判断画布if (canvas.width > canvas.height) {ctx.moveTo(start.x * canvas.width, start.y * canvas.height);ctx.lineTo(end.x * canvas.width, end.y * canvas.height);} else {ctx.moveTo(start.y * canvas.width, (start.x + 0.1) * canvas.height);ctx.lineTo(end.y * canvas.width, (end.x + 0.1) * canvas.height);}ctx.stroke();}});}// 绘制星座星星scorpioStars.forEach((star, index) => {const starObj = stars[stars.length - scorpioStars.length + index];ctx.fillStyle = starObj.color;ctx.beginPath();// 判断画布if (canvas.width > canvas.height) {ctx.arc(starObj.x * canvas.width,starObj.y * canvas.height,starObj.size + 0.5,0,Math.PI * 2);} else {ctx.arc(starObj.y * canvas.width,(starObj.x + 0.1) * canvas.height,starObj.size + 0.5,0,Math.PI * 2);}ctx.fill();// 添加星名if (showNames) {ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';ctx.font = '12px Arial';if (canvas.width > canvas.height) {ctx.fillText(starObj.name,starObj.x * canvas.width + 8,starObj.y * canvas.height - 8);} else {ctx.fillText(starObj.name,starObj.y * canvas.width + 8,(starObj.x + 0.1) * canvas.height + 8);}}});}// 动画循环function animate() {if (animationRunning) {requestAnimationFrame(animate);}drawStars();}// 控制变量let showLines = true;let showNames = true;let animationRunning = true;// 初始化initStars(2000);animate();// 添加按钮事件document.getElementById('toggleLines').addEventListener('click', () => {showLines = !showLines;});document.getElementById('toggleNames').addEventListener('click', () => {showNames = !showNames;});document.getElementById('toggleAnimation').addEventListener('click', () => {animationRunning = !animationRunning;if (animationRunning) {animate();}});</script></body>
</html>

代码说明

星座特定星

// 天蝎座主星数据
const scorpioStars = [{name: "心宿二",x: 0.54,y: 0.41,magnitude: 5.0,color: "#FF5252"},{name: "心宿一",x: 0.6,y: 0.3,magnitude: 2.9,color: "#FFA726"},{name: "心宿三",x: 0.58,y: 0.24,magnitude: 2.8,color: "#FFA726"},{name: "房宿四",x: 0.65,y: 0.4,magnitude: 2.8,color: "#64B5F6"},{name: "房宿三",x: 0.67,y: 0.44,magnitude: 2.9,color: "#FFF59D"}, {name: "尾宿二",x: 0.5,y: 0.7,magnitude: 3.3,color: "#FFCC80"}, {name: "尾宿七",x: 0.4,y: 0.8,magnitude: 2.6,color: "#FFCCBC"}, {name: "尾宿六",x: 0.35,y: 0.85,magnitude: 3.8,color: "#FFCCBC"}, {name: "尾宿四",x: 0.3,y: 0.8,magnitude: 3.4,color: "#FFCCBC"}, {name: "尾宿三",x: 0.28,y: 0.7,magnitude: 2.7,color: "#42A5F5"}, {name: "尾宿五",x: 0.3,y: 0.64,magnitude: 3.0,color: "#FFFFC3"},{name: "尾宿八",x: 0.25,y: 0.66,magnitude: 1.8,color: "#FF5252"},
];// 天蝎座星座连线
const starConnections = [// 头部[0, 1],[1, 2],[1, 3],[3, 4],// 身体[0, 5],[5, 6],[6, 7],[7, 8],[8, 9],// 尾钩[9, 10],[9, 11]
];

结语

本文主要讲解了如何通过Canvas绘制天蝎座星座图,后续会继续使用Canvas绘制其余星座。对于文章中错误的地方或者有任何问题,欢迎在评论区留言分享!


http://www.hkcw.cn/article/rVrNEZqMma.shtml

相关文章

马斯克回应离任当天眼角淤青:儿子所为 与子嬉戏致伤

美国总统特朗普和企业家马斯克于5月30日在白宫举行新闻发布会。这天也是马斯克在政府效率部任职的最后一天,他的眼角淤青引起了媒体的关注。马斯克解释说,这是他五岁的儿子小X造成的。当时他在和儿子玩耍时开玩笑让儿子打他的脸,结果儿子真的打了,虽然一开始没什么感觉,但…

陈幸同生日当天遭网暴 国乒饭圈乱象再起 竞技体育不应被饭圈侵蚀

2025年5月28日,国乒女队主力陈幸同在卡塔尔多哈的运动员公寓里庆祝生日。她在世乒赛上获得女单铜牌,本应享受职业生涯的高光时刻,但社交平台上的一些恶意评论让这个生日变得复杂。事情起因是她在半决赛中以0比4输给队友王曼昱,部分球迷认为她没有尽力,甚至怀疑她故意保存体…

朴槿惠带女保镖逛菜市场 现场围了几百人 支持保守派选情

距离6月3日的韩国总统选举还有6天时间,根据封关民调显示,共同民主党候选人李在明的支持率为49%,止住了下滑趋势并出现4%的增长。国民力量党候选人金文洙排名第二,但与李在明的差距拉大到14个百分点。面对这一情况,韩国保守派阵营竭力寻求实现单一化,让金文洙与民调排名第…

粤港澳车展惊现最小车评人 11岁小孩说车引围观

在粤港澳车展上,一位11岁的小车评人引起了关注。他在体验问界M8时特别提到了这款车的一些亮点,如冷暖箱、投影和准零重力座椅。这些配置不仅吸引孩子,也是父母看重的舒适功能。问界M8的家庭属性不仅体现在宽敞的空间上,更在于其细节设计。从娱乐到实用,从智能驾驶到安全保…

日本奈良小鹿当街抢中国游客包 意外引发网络热议

近期,一则奈良小鹿抢包的视频在社交媒体上引发热议。不少网友分享了自己的“受害经历”。5月28日下午,张女士在日本奈良公园喂食小鹿时,一只小鹿闻到了她包里的鹿饼味道,便靠近了她。张女士说,她的包里有一包鹿饼,另一只小鹿把包从椅子上拽到地上,结果包挂在了它的头上。…

央视聚焦山东日照海上龙舟新体验 传统与现代交织的魅力

仲夏至,端阳临。粽叶飘香,龙舟待发。5月31日,农历端午佳节,央视新闻举办了一场“龙腾端阳 ‘粽’情万家”活动,带领全国各地的观众穿越山河,体验多彩民俗,感受传统节日的独特魅力。中午1点35分,镜头转向日照奥林匹克水上运动公园潮汐海龙舟码头,日照文旅集团龙舟体育旅…

哀牢山也是能拍电影的啊 影视文旅深度融合

5月28日,云南省玉溪市新平县政府与浙江柏杨文化产业发展有限公司在戛洒举行了《哀牢山迷境》影视文旅项目合作启动会。双方以“影视IP赋能地方文旅”为核心,开启了“影视+文旅”深度融合的创新实践。此次合作采用“内容+场景”的创新模式,为文旅融合发展提供了可借鉴的样本。…

[LitCTF 2024]SAS - Serializing Authentication

打开题目在线环境&#xff1a; 题目给的源码提示我们反序列化&#xff0c;但是重点在输入框里面的那一句**user unserialize(base64_decode( d a t a ) ) ; ∗ ∗ 将一个 B a s e 64 编码的字符串 data));** 将一个Base64编码的字符串 data));∗∗将一个Base64编码的字符串da…

解构赋值(拆包赋值)技巧

在现代编程语言中&#xff0c;解构赋值&#xff08;Destructuring Assignment&#xff09;&#xff0c;又称拆包赋值&#xff08;unpacking assignment&#xff09;&#xff0c;正逐渐成为表达复杂数据结构的利器。Python语言作为脚本语言中的翘楚&#xff0c;提供了极其灵活且…

在win10/11下Node.js安装配置教程

下载安装 官网链接https://nodejs.org/zh-cn 下载好以后双击打开&#xff0c;点击下一步 勾选&#xff0c;然后下一步 选择路径、下一步 下一步 配置环境 找到我们安装的文件夹&#xff0c;创建两个文件夹 node_global node_cache 在CMD中配置路径 npm config set p…

【速通RAG实战:进阶】15、对话式智能推荐系统全攻略:精准推荐技术与企业级实践

一、智能推荐的核心逻辑与技术架构 &#xff08;一&#xff09;推荐系统的三维驱动模型 智能推荐系统的核心是构建「用户-对话-内容」的动态关联&#xff0c;通过三大维度实现精准匹配&#xff1a; 上下文感知&#xff1a;解析对话中的实体、意图和情感&#xff0c;例如用户…

两女子被新加坡醉汉辱骂:中国人别来 旅游遭遇惊魂一刻

前段时间,中国女子小谢和朋友前往新加坡旅游,在巴士上遭到醉汉骚扰。对方还试图抢她们的手机,最终两人被迫躲上另一辆巴士寻求庇护,并报警求助。近日,她们公开讲述了这段经历。小谢称,她和朋友5月20日抵达新加坡。隔日下午,她们从中央商场乘搭980号巴士回酒店休息,不料…

媒体谈香会上马克龙和赫格塞思演讲 传递多元声音

今年的香格里拉对话会在5月30日至6月1日在新加坡举行。尽管规模不减,但一些媒体评论认为今年的会议没什么看点。中国国防部长董军没有出席今年的香会,这引起了一些外媒的关注。实际上,纵观香会历史,中国国防部长并不是每届都参加。不过,在2011年和2019年中国派出防长与会后…

尊界S800三十万差价差了什么 配置依旧顶配

尊界S800上市,这是华为和江淮合作打造的豪华电动车。最初定价为一百万起,现在最低售价降至七十多万。该车提供增程和纯电两种版本,共有四个型号,最贵的一款售价为一百零一万八。发布会上,余承东介绍了车辆的一些关键数据:纯电双电机版百公里加速4.3秒,增程三电机版为4.7…

JVM类加载高阶实战:从双亲委派到弹性架构的设计进化

前言 作为Java开发者&#xff0c;我们都知道JVM的类加载机制遵循"双亲委派"原则。但在实际开发中&#xff0c;特别是在金融支付、插件化架构等场景下&#xff0c;严格遵循这个原则反而会成为系统扩展的桎梏。本文将带你深入理解双亲委派机制的本质&#xff0c;并分享…

电力高空作业安全检测(2)数据集构建

数据集构建的重要性 在电力高空作业安全检测领域&#xff0c;利用 计算机视觉技术 进行安全监测需要大量的图像数据&#xff0c;这些数据需要准确标注不同的安全设备与作业人员行为。只有构建出包含真实场景的高质量数据集&#xff0c;才能通过深度学习等算法对高空作业中的潜…

4天后生死战!伊万自我怀疑:首发仅定5人 要和印尼搏命+先发制人 阵容调试纠结中

5月31日,体坛周报记者王晓瑞介绍了国足备战期间的一些情况。从5月29日开始,他对首发11人进行终极调试,但在这个过程中也感到纠结和反复。球队日常训练显示,伊万对防守非常重视,甚至在前些天的训练中,他会拿出一部分时间强化防守,包括整体防守中三条线球员的职责分配及战…

余承东称之前很多车厂看不上华为 质量标准引争议

华为常务董事余承东在近日的未来汽车先行者大会上表示,按照华为的质量标准,某些车企一台车都无法出货。这句话迅速引起了整个汽车行业的关注。表面上听起来刺耳,但仔细思考却令人担忧——汽车行业到底存在多少质量隐患?余承东并非空口无凭。他展示了华为采用的宁德时代电池…

主人回应河北狗王长毛爆火 小狗比主人还火

近日,河北承德一只下司犬“长毛”的视频在外网走红。视频中,“长毛”凭借威严的姿态让闹事的狗狗臣服,因此被外国网友称为“查理国王”或“狗王”,甚至有小狗的肖像被印在T恤上作为周边售卖。网友们纷纷表达了自己的惊叹与崇拜,称其为绝对王者,气场强大。“长毛”的主人表…

8岁男童走失搜寻仍在继续 全城急盼平安归来

一名8岁男童邹某樽在福建仙游县石谷解登山时与家人失联,至今已失踪近一个月。网友们纷纷呼吁,希望他能在“六一”儿童节回家过节。5月4日,邹某樽随父母到石谷解登山。下山时,与父母失去联系。当天16时左右,孩子母亲报警后,仙游县迅速启动应急响应机制,组织公安、森林消防…