【Canvas与艺术】硬朗风格十二棱表表盘

【效果图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>硬朗风格十二棱表表盘</title><style type="text/css">.centerlize{margin:0 auto;width:1200px;}</style></head><body οnlοad="init();"><div class="centerlize"><canvas id="myCanvas" width="512px" height="512px" style="border:1px dotted black;">如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.</canvas></div></body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/// canvas的绘图环境
var ctx;// 边长
const LENGTH=512;// 舞台对象
var stage;//-------------------------------
// 初始化
//-------------------------------
function init(){// 获得canvas对象var canvas=document.getElementById('myCanvas');  // 初始化canvas的绘图环境ctx=canvas.getContext('2d');  ctx.translate(LENGTH/2,LENGTH/2);// 原点平移到画布中央// 准备stage=new Stage();    stage.init();
}// 每一秒调用paintClock函数
setInterval(paintClock,1000);//-------------------------------
// 绘制时钟
//-------------------------------
function paintClock(){stage.update();    stage.paintBg(ctx);stage.paintFg(ctx);     
}// 舞台类
function Stage(){// 初始化this.init=function(){}// 更新this.update=function(){}// 画背景this.paintBg=function(ctx){ctx.clearRect(-LENGTH/2,-LENGTH/2,LENGTH,LENGTH);// 清屏// 准备正十二边形var polyArr=[];for(var i=0;i<12;i++){var theta=Math.PI/6*i;var pt={};pt.x=Math.cos(theta);pt.y=Math.sin(theta);polyArr.push(pt);}// 最外圈ctx.beginPath();for(let i=0;i<polyArr.length;i++){ctx.lineTo(250*polyArr[i].x,250*polyArr[i].y);}ctx.closePath();var linegrad=ctx.createLinearGradient(-250,-250,250,250);linegrad.addColorStop(0,"rgb(103,103,103)");linegrad.addColorStop(1,"rgb(32,32,32)");ctx.fillStyle=linegrad;ctx.fill();// 第二圈ctx.beginPath();for(let i=0;i<polyArr.length;i++){ctx.lineTo(240*polyArr[i].x,240*polyArr[i].y);}ctx.closePath();var linegrad=ctx.createLinearGradient(-240,-240,240,240);linegrad.addColorStop(0,"rgb(43,43,43)");linegrad.addColorStop(1,"rgb(184,184,184)");ctx.fillStyle=linegrad;ctx.fill();// 第三圈ctx.beginPath();for(let i=0;i<polyArr.length;i++){ctx.lineTo(230*polyArr[i].x,230*polyArr[i].y);}ctx.closePath();ctx.fillStyle="rgb(49,49,49)";ctx.fill();// 十二时辰var hours=["03","04","05","06","07","08","09","10","11","12","01","02"]; for(var i=0;i<12;i++){var theta=i*Math.PI/6;var x3=190*Math.cos(theta);var y3=190*Math.sin(theta);ctx.save();ctx.translate(x3,y3);ctx.rotate(theta+Math.PI/2);ctx.font="36px Microsoft YaHei UI";ctx.textAlign="center";ctx.textBaseLine="Middle";ctx.fillStyle="rgb(238,176,75)";ctx.fillText(hours[i],0,0);ctx.restore();}// 内圈刻度for(var i=0;i<60;i++){var theta=i*Math.PI/30;var x1=180*Math.cos(theta);var y1=180*Math.sin(theta);var x2=160*Math.cos(theta);var y2=160*Math.sin(theta);ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.closePath();ctx.lineWidth=(i%5==0)?3:1;ctx.strokeStyle="rgb(231,219,111)";ctx.stroke();}        }// 画前景this.paintFg=function(ctx){// 得到当前时间var now=new Date();var s=now.getSeconds();var m=now.getMinutes();var h=now.getHours()+m/60;// 画时针ctx.save();ctx.rotate(h*Math.PI/6-Math.PI/2);ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-20,0);ctx.lineTo(-20,4);ctx.lineTo(120,4);ctx.lineTo(130,0);ctx.closePath();ctx.fillStyle="rgb(171,172,166)";ctx.fill();ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-20,0);ctx.lineTo(-20,-4);ctx.lineTo(120,-4);ctx.lineTo(130,0);ctx.closePath();ctx.fillStyle="rgb(252,252,250)";ctx.fill();ctx.beginPath();ctx.moveTo(80,1);ctx.lineTo(110,1);ctx.lineTo(110,-1);ctx.lineTo(80,-1);ctx.closePath();ctx.fillStyle="rgb(49,49,49)";ctx.fill();ctx.restore();// 画分针ctx.save();ctx.rotate(m*Math.PI/30-Math.PI/2);ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-25,0);ctx.lineTo(-25,4);ctx.lineTo(130,4);ctx.lineTo(140,0);ctx.closePath();ctx.fillStyle="rgb(171,172,166)";ctx.fill();ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-25,0);ctx.lineTo(-25,-4);ctx.lineTo(130,-4);ctx.lineTo(140,0);ctx.closePath();ctx.fillStyle="rgb(252,252,250)";ctx.fill();ctx.beginPath();ctx.moveTo(90,1);ctx.lineTo(120,1);ctx.lineTo(120,-1);ctx.lineTo(90,-1);ctx.closePath();ctx.fillStyle="rgb(49,49,49)";ctx.fill();ctx.restore();// 画秒针ctx.save();ctx.rotate(s*Math.PI/30-Math.PI/2);ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-30,0);ctx.lineTo(-30,2);ctx.lineTo(130,2);ctx.lineTo(130,6);ctx.lineTo(160,0);ctx.closePath();ctx.fillStyle="rgb(171,172,166)";ctx.fill();ctx.beginPath();ctx.moveTo(0,0);ctx.lineTo(-30,0);ctx.lineTo(-30,-2);ctx.lineTo(130,-2);ctx.lineTo(130,-6);ctx.lineTo(160,0);ctx.closePath();ctx.fillStyle="rgb(252,252,250)";ctx.fill();ctx.beginPath();ctx.moveTo(134,2);ctx.lineTo(146,0);ctx.lineTo(134,-2);ctx.closePath();ctx.fillStyle="rgb(251,143,56)";ctx.fill();ctx.restore();// 画中心小圆点ctx.beginPath();ctx.arc(0,0,6,0,Math.PI*2,true);ctx.closePath();ctx.fillStyle="rgb(251,143,56)";ctx.fill();ctx.beginPath();ctx.arc(0,0,2,0,Math.PI*2,true);ctx.closePath();ctx.fillStyle="rgb(49,49,49)";ctx.fill();// 日期var tMonth = now.getMonth()+1;  var tDate = now.getDate();ctx.font="24px Microsoft YaHei UI";ctx.textAlign="center";ctx.textBaseLine="Middle";ctx.fillStyle="white";ctx.fillText(tMonth+"/"+tDate,0,80);// 星期ctx.textAlign="center";ctx.textBaseLine="Middle";ctx.fillStyle="rgb(238,176,75)";ctx.fillText(getWeekDay(now.getDay()),0,120);}
}// 取当天是星期几
function getWeekDay(idx){const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];return days[idx];
}
/*---------------------------------------------
笼鸡有粮刀汤近,野鹤无粮天地宽。
----------------------------------------------*/
//-->
</script>

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来&#xff0c;本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

深入Facebook的世界:探索数字化社交的无限可能性

引言 随着数字化时代的到来&#xff0c;社交媒体平台已经成为了人们日常生活中不可或缺的一部分&#xff0c;而其中最为突出的代表之一便是Facebook。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅仅是一个社交网络&#xff0c;更是一个数字化社交的生态系统&#…

机器人机械手加装SycoTec 4060 ER-S电主轴高精密铣削加工

随着科技的不断发展&#xff0c;机器人技术正逐渐渗透到各个领域&#xff0c;展现出前所未有的潜力和应用价值。作为机器人技术的核心组成部分之一&#xff0c;机器人机械手以其高精度、高效率和高稳定性的优势&#xff0c;在机械加工、装配、检测等领域中发挥着举足轻重的作用…

C#使用iText7画发票PDF——字体与自定义颜色

字体可以引用windows自带的字体&#xff0c;引用方式如下&#xff1a; //楷体 PdfFont KT PdfFontFactory.CreateFont(“C://Windows//Fonts//SIMKAI.TTF”, PdfEncodings.IDENTITY_H); //宋体 PdfFont ST PdfFontFactory.CreateFont(“C://Windows//Fonts//SIMFANG.TTF”, P…

Spring 的 Ioc配置

HappyComponent.java package com.atguigu.Ioc_01;public class HappyComponent {// 默认包含无参的构造方法public void dowork(){System.out.println("HappyComponent.dowork");} }ClientService.java package com.atguigu.Ioc_01;静态工厂类 public class Clien…

BIM自动化简介

毫无疑问&#xff0c;BIM 方法已成功提高和提高了建筑行业流程的效率。 世界各地的各种私人机构和公共实体都认识到这一点&#xff0c;他们决定在几年内实施这种项目设计、管理和施工方法&#xff0c;最大限度地减少执行时间和经济成本。 建筑流程融入数字和技术时代&#xff…

解决Spring boot添加了actuator导致StreamBridge未自动加载的bug

案情说明 在Spring boot项目中&#xff0c;如果同时依赖了spring-cloud-starter-stream-rabbit和spring-boot-start-actuator两个包&#xff0c;启动时可能会出现StreamBridge组件找不到的问题。如下&#xff1a; *************************** APPLICATION FAILED TO START **…

Unity WebRequest 变得简单

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注…

Python学习:lambda(匿名函数)、装饰器、数据结构

Python Lambda匿名函数 Lambda函数&#xff08;或称为匿名函数&#xff09;是Python中的一种特殊函数&#xff0c;它可以用一行代码来创建简单的函数。Lambda函数通常用于需要一个函数作为输入的函数&#xff08;比如map()&#xff0c;filter()&#xff0c;sort()等&#xff0…

C++ 多线程和互斥锁(一文搞定)

实验 简介&#xff1a;我们启动并行启动两个线程&#xff0c;但设置一个全局互斥锁&#xff0c;在两个线程中等待并占用互斥锁&#xff0c;然后输出日志。 代码 #include <iostream> #include <thread> /* C 多线程库 */ #include <mutex> …

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…

设计模式之基于接口而非实现的设计原则

概念 基于接口而非实现的设计原则是一种重要的软件设计原则&#xff0c;它强调在设计和开发软件时&#xff0c;应该更多地关注接口而非具体的实现细节。这一原则有助于实现软件的可扩展性、可维护性和灵活性。 首先&#xff0c;基于接口的设计原则有助于实现软件的可扩展性。…

Axios和Ajax俩者的区别

Axios 和 Ajax 都是用于发起 HTTP 请求的工具&#xff0c;但它们之间有一些重要的区别&#xff1a; Ajax&#xff1a; Ajax 是一种使用 JavaScript 发起异步 HTTP 请求的技术&#xff0c;通常通过 XMLHttpRequest 对象来实现。在使用 Ajax 时&#xff0c;需要手动处理请求和响应…

2015年认证杯SPSSPRO杯数学建模A题(第二阶段)绳结全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 A题 绳结 原题再现&#xff1a; 给绳索打结是人们在日常生活中常用的技能。对登山、航海、垂钓、野外生存等专门用途&#xff0c;结绳更是必不可少的技能之一。针对不同用途&#xff0c;有多种绳结的编制方法。最简单的绳结&#xff0c;有时称…

机器学习和深度学习的简单对比

如图1-2所示&#xff0c;深度学习&#xff08;DeepLearning&#xff0c;DL&#xff09;属于机器学习的子类。它的灵感来源于人类大脑的工作方式&#xff0c;这是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念&#xff0c;可理解为包含多…

实战 | 微调训练TrOCR识别弯曲文本

导 读 本文主要介绍如何通过微调训练TrOCR实现弯曲文本识别。 背景介绍 TrOCR&#xff08;基于 Transformer 的光学字符识别&#xff09;模型是性能最佳的 OCR 模型之一。在我们之前的文章中&#xff0c;我们分析了它们在单行打印和手写文本上的表现。 TrOCR—基于Transforme…

系统分析师-数学与经济管理

系统架构设计师 系统架构设计师-软件开发模型总结 文章目录 系统架构设计师前言一、最小生成树二、最短路径三、网络与最大流量四、不确定型决策 前言 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽象思维能力和逻辑推理能…

go中函数与方法的区别与go中关于面向对象理解

声明方法的区别 函数是一段可以独立调用的代码块&#xff0c;它可以有参数和返回值。函数的声明不依赖于任何类型&#xff0c;可以直接通过函数名进行调用。 函数的声明格式如下&#xff1a; func functionName(parameters) returnType {// 函数体 }示例&#xff1a; func A…