【Canvas与艺术】时尚钟表

news2025/3/9 23:09:23

【实现效果图示】

【实现代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>时尚钟表</title>
     </head>

     <body onload="draw()">
        <canvas id="myCanvus" width="400px" height="400px" style="border:0px dashed black;">
            出现文字表示您的浏览器不支持HTML5
        </canvas>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/
function draw(){
	var canvas=document.getElementById('myCanvus');	
	canvas.width=400;
	canvas.height=400;	

	context=canvas.getContext('2d');	
	context.translate(200,200);
	
	clock=new Clock(200);	
	clock.init();

	animate();
};

// 绘图上下文
var context;

// 时钟对象
var clock;

function animate(){	
	context.clearRect(-200,-200,400,400);// 清屏
	
	clock.paintBg(context);
	clock.paintScale(context);
	clock.paintPointers(context);

	if(true){
		window.requestAnimationFrame(animate);
	}
}

// 钟表类
function Clock(radius){
	this.radius=radius;
	this.img;
	
	this.init=function(){
		this.img=new Image();
		this.img.src="bg.jpg";
	}

	// 画背景
	this.paintBg=function(ctx){
		ctx.beginPath();
		ctx.arc(0,0,200,0,2*Math.PI,true);
		ctx.closePath();
		ctx.stroke();

		// 用以上的圆去切割下面的图片
		ctx.clip();

		ctx.drawImage(this.img,0,0,400,400,-200,-200,400,400);
		ctx.fillStyle="red";
		
		var width = ctx.canvas.width;
        var height = ctx.canvas.height;
		var BL = width / 200;
		
		var r=this.radius;
		ctx.save();//保存一下最开始时钟的环境
		ctx.beginPath();
		ctx.lineWidth = 13.8 * BL;//线要 乘上 比例
		ctx.arc(0, 0, r - ctx.lineWidth / 2, 2 * Math.PI, false);//乘上比例
		ctx.strokeStyle = "#000080";
		ctx.stroke();

		ctx.fillStyle="white";
		var hourNumber = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
		ctx.font = 18 * BL + 'px Arial';//字体也有乘比例 字符串拼接
		ctx.textAlign = 'center';
		ctx.textBaseline = 'middle';

		hourNumber.forEach(function (number, i) {
			var rad = 2 * Math.PI / 12 * i;
			var x = Math.cos(rad) * (r - 30 * BL);
			var y = Math.sin(rad) * (r - 30 * BL);
			ctx.fillText(number, x, y);
		});

		for (var i = 0; i < 60; i++) {
			var rad = 2 * Math.PI / 60 * i;
			var x = Math.cos(rad) * (r - 18 * BL);
			var y = Math.sin(rad) * (r - 18 * BL);
			ctx.beginPath();
			if (i % 5 == 0) {
				ctx.fillStyle = '#800080';
				ctx.arc(x, y, 2 * BL, 0, 2 * Math.PI, false);
			} else {
				ctx.fillStyle = '#c0c0c0';
				ctx.arc(x, y, 2 * BL, 0, 2 * Math.PI, false);
			}

			ctx.fill();
		}
		
		ctx.restore();
	};

	//  画汉字
	this.paintScale=function(ctx){
		var arr=["富强","民主","文明","和谐","自由","平等","公正","法治","爱国","敬业","诚信","友善"];
		var offset=16;

		ctx.save();
		ctx.rotate(getRad(-94.5));

		for(var i=0;i<60;i++){
			var degree=i*6;
			var x=(this.radius-offset)*Math.cos(getRad(degree));
			var y=(this.radius-offset)*Math.sin(getRad(degree));

			if((i % 5)==0){
				ctx.save();	
				
				var x1=(this.radius-20)*Math.cos(getRad(degree));
				var y1=(this.radius-20)*Math.sin(getRad(degree));

				ctx.translate(x1,y1);
				ctx.rotate(getRad(degree+96));
				ctx.font="bold 16px 宋体";
				ctx.fillStyle='white';
				ctx.fillText(arr[i/5],0,0);

				ctx.restore();
			}	
		}

		ctx.restore();
	};


	// 画指针
	this.paintPointers=function(ctx){
		var date = new Date();
		var hour=date.getHours();
		var minute=date.getMinutes();
		var second=date.getSeconds();

		ctx.font="bold 12px 宋体";
		ctx.fillStyle="white";
		ctx.fillText(hour+":"+minute+":"+second,-20,-100);
		
		var angleS=second*6;
		var angleM=minute*6;
		var angleH=hour*30+angleM/360*30;

		var width = ctx.canvas.width;
        var height = ctx.canvas.height;
		var BL = width / 200;
		
		context.save();
			context.rotate(getRad(-90));
			var x,y;
			
			// 画时针
			x=(this.radius-60)*Math.cos(getRad(angleH));
			y=(this.radius-60)*Math.sin(getRad(angleH));
			ctx.strokeStyle = "white";
			ctx.lineWidth = 3 * BL;//定义指针的宽
	        ctx.lineCap = 'round';//指针顶部为弧
				
			ctx.beginPath();
	        ctx.moveTo(-x/8, -y/8);
	        ctx.lineTo(x,y);
	        ctx.stroke();
	        ctx.closePath();
			
			// 画分针
			x=(this.radius-45)*Math.cos(getRad(angleM));
			y=(this.radius-45)*Math.sin(getRad(angleM));
			ctx.strokeStyle = "white";
			ctx.lineWidth = 2 * BL;//定义指针的宽
	        ctx.lineCap = 'round';//指针顶部为弧
			
			ctx.beginPath();
	        ctx.moveTo(-x/8, -y/8);
	        ctx.lineTo(x,y);
	        ctx.stroke();
	        ctx.closePath();

		context.restore();

		// 画秒针
		ctx.save();
			ctx.lineWidth=0.5;

			ctx.strokeStyle = "black";
			ctx.beginPath();

			var r=this.radius;
			ctx.rotate(getRad(angleS));
		    ctx.moveTo(-2 * BL, 20 * BL);//画出一个秒针 x轴-2 y轴20
			ctx.lineTo(2 * BL, 20 * BL);
			ctx.lineTo(1, -r + 18 * BL);
			ctx.lineTo(-1, -r + 18 * BL);
			ctx.fill();
				
	        ctx.stroke();
			ctx.closePath();

			ctx.strokeStyle = 'yellow';
			ctx.beginPath();
			ctx.arc(1, -r + 18 * BL, 2 * BL, 0, 2 * Math.PI, false);
			ctx.closePath();
			ctx.stroke();
	        
		ctx.restore();

		// 画中心小圆点
		ctx.save();
			ctx.beginPath();
			ctx.arc(0,0,5,0,2*Math.PI,true);
			ctx.closePath();
			ctx.strokeStyle="#6F00D2";
			ctx.fillStyle="#F9F900";
			ctx.fill();    
			ctx.stroke();
		ctx.restore();
	};
}

//  常规函数:角度得到弧度
function getRad(degree){
	return degree/180*Math.PI;
}

/*----------------------------------
有一天,我突然想明白了一件事:我们都会死的。
也许是十年后,
也许是二十年后,
也许是五十年后,
谁知道呢?
有一天我终将死去,
这个世界上会没有我任何存在过的痕迹。
----------------------------------*/
//-->
</script>

 【下载地址】

https://files.cnblogs.com/files/heyang78/66.fashion-clock-20240315-2.rar?t=1710515286&download=true

END

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

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

相关文章

iptables详细介绍

在 CentOS 中,iptables 是一种用于配置和管理网络防火墙的工具,它提供了一种灵活和强大的方式来控制进出服务器的网络流量。以下是 CentOS 中 iptables 的主要内容: 规则链(Chains): iptables 使用规则链来组织规则,常见的链包括: INPUT:处理进入服务器的数据包。OUTP…

Binance Labs领投的安全赛道龙头GoPlus Security零撸教程

简介&#xff1a;SecWarex是Goplus推出的个人安全产品&#xff0c;可以理解为web3版的360安全卫士&#xff0c;它通过提供开放、无权限、用户驱动的安全服务&#xff08;包括代币检测、NFT 检测、恶意地址、审批安全 API 和 dApp 合约安全等&#xff09;&#xff0c;打造 Web3 …

OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09; 导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&a…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PatternLock)

图案密码锁组件&#xff0c;以九宫格图案的方式输入密码&#xff0c;用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态&#xff0c;手指离开屏幕时结束输入状态完成密码输入。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#…

人工智能原理:探索智能的奥秘

人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。是新一轮科技革命和产业变革的重要驱动力量&#xff0c;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组成部分&a…

java-ssm-jsp基于java的校园疫情管理系统

java-ssm-jsp基于java的校园疫情管理系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

Android Studio实现内容丰富的安卓宠物用品管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

BFS 最短路径

目录 原理剖析&#xff1a; 1、 1926. 迷宫中离入口最近的出口 2、 433. 最小基因变化 3、 127. 单词接龙 4、 675. 为高尔夫比赛砍树 原理剖析&#xff1a; 为什么BFS能够解决最短路径问题&#xff1f; 对于无权图(边权为1)或所有边权重相等的情况&#xff0c;BFS是一种有…

PTA题解 --- N个数求和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;今天我们要讲解N个数求和&#xff0c;题目如下&#xff1a; 要解决这个问题&#xff0c;我们可以用C语言编写一个程序来处理和简化分数。程序的基本思路如下&#xff1a; 1. 定义一个函数来计算两个数的最大公约数&#xff08;GCD&a…

【Python爬虫基础教程 | 第一篇】URL、HTTP基础必知必会

前言 该专栏开设的目的在于给初学者提供一个学习爬虫的成长平台&#xff0c;文章涉及内容均为必备知识。 可订阅专栏&#xff1a;【Python爬虫教程】 | CSDN秋说 文章目录 前言URL概念及组成结构HTTP概念简述浏览器接收资源HTTP协议的结构请求结构请求行请求头请求体请求差异及…

win10虚拟机安装驱动教程

在虚拟机菜单栏中选择安装VMware Tools&#xff1a; 安装好后&#xff0c;在虚拟机中打开此电脑&#xff0c;双击DVD驱动器进行安装&#xff1a; 一直点击下一步&#xff1a; 安装完成&#xff1a; 此时重启虚拟机&#xff0c;发面小屏幕页面的虚拟机自动占满了全部屏幕&#x…

Java Web开发从0到1

文章目录 总纲第1章 Java Web应用开发概述1.1 程序开发体系结构1.1.1 C/S体系结构介绍1.1.2 B/S体系结构介绍1.1.3 两种体系结构的比较1.2 Web应用程序的工作原理1.3 Web应用技术1.3.1 客服端应用技术1.3.2 服务端应用技术1.4 Java Web应用的开发环境变量1.5 Tomcat的安装与配置…

OpenCV(八)——基本线条操作

基本线条操作 OpenCV中提供了基本的线条的操作&#xff0c;包括画直线、画矩形、画圆形等。 &#xff08;1&#xff09;画直线&#xff0c;在OpenCV中利用line()画直线&#xff0c;形式为image_with_line cv2.line(image, start_point, end_point, color, thickness)。line(…

使用 Docker Compose 快速搭建监控网站 uptime-kuma

有时候需要监控自己搭建的一些网站、服务是否正常运行&#xff0c; 这时候可以考虑使用一个监控网站&#xff0c; 定时的进行检测&#xff0c; 记录网站、服务的运行状态&#xff0c; 在这推荐使用 uptime-kuma。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539…

学生打架支小蜜AI校园防欺凌系统可以识别到吗?

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;为我们的生活带来了极大的便利。在校园安全领域&#xff0c;AI技术的应用也日益广泛&#xff0c;其中&#xff0c;AI校园防欺凌系统更是受到了广泛关注。那么&#…

【SystemVerilog】结构体真是太好用了~

前言 Verilog最大的缺陷之一是没有数据结构。在SystemVerilog中可以使用struct创建结构&#xff0c;struct只是把数据组织到一起&#xff0c;是数据的集合&#xff0c;所以是可综合的。 结构体是可以通过模块接口进行传递的&#xff0c;这就是本文想描述的内容。 一、结构体的…

进程及进程状态

1.PCB及task_struct 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为进程属性的集合。 书上称之为 PCB &#xff08; process control block &#xff09;&#xff0c; Linux 操作系统下的 PCB 是 : task_struct。 task_struct是PCB的一种。 task_struc…

MySQL教程-安装与卸载

MySQL官网 https://www.mysql.com MySQL 官方提供了两种不同的版本&#xff1a; 社区版 MySQL Community Server&#xff0c;免费&#xff0c;但不提供任何技术支持商业版 MySQL Enterprise Server&#xff0c;收费&#xff0c;官方可提供技术支持 本教程采用MySQL的社区版作…

看!Chat4.0如何看待AI与光纤资源管理软件的应用结合点及价值

问&#xff1a;你好&#xff0c;AI在光纤资源管理软件中有那些应用结合点&#xff0c;请详细描述应用结合点及价值? 答&#xff1a;AI在光纤资源管理软件中的应用结合点涉及多个方面&#xff0c;它们通过智能化的手段提高资源管理的效率和准确性。以下是一些关键的应用结合点及…

阿里云服务器centos安装msf教程

msf官方命令行一键安装 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && chmod 755 msfinstall && ./msfinstall 稍微等待几分钟即可安装成功&am…