【Canvas与艺术】淡蓝辉光汽车速度仪表盘

news2024/9/23 22:50:36

【关键点】

内圈处渐变色的采用。

【效果图】

【代码】

<!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="10px" height="10px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(ctrl+A)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 边长
const LENGTH=512;

// 舞台对象
var stage;

//-------------------------------
// 初始化
//-------------------------------
function init(){
    // 获得canvas对象
    var canvas=document.getElementById('myCanvas');  
    canvas.width=LENGTH;
    canvas.height=LENGTH;

    // 初始化canvas的绘图环境
    ctx=canvas.getContext('2d');  
    ctx.translate(LENGTH/2,LENGTH/2);// 原点平移到画布中央

    // 准备
    stage=new Stage();    
    stage.init();

    // 开幕
    animate();
}

// 播放动画
function animate(){    
    stage.update();    
    stage.paintBg(ctx);
    stage.paintFg(ctx);     

    // 循环
    if(true){
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){

    // 初始化
    this.init=function(){

    }

    // 更新
    this.update=function(){

    }

    // 画背景
    this.paintBg=function(ctx){
        ctx.clearRect(-LENGTH/2,-LENGTH/2,LENGTH,LENGTH);// 清屏

        // 最外层暗蓝圈
        ctx.beginPath();
        ctx.arc(0,0,250,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(1,48,83)";
        ctx.stroke();

        // 第二层暗黑圈
        ctx.beginPath();
        ctx.arc(0,0,248,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(1,14,25)";
        ctx.stroke();

        // 第三层暗蓝圈
        ctx.beginPath();
        ctx.arc(0,0,248,0,Math.PI*2,false);
        ctx.closePath();
        ctx.fillStyle="rgb(2,30,65)";
        ctx.fill();

        // 第四层亮蓝圈
        ctx.beginPath();
        ctx.arc(0,0,246,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(6,94,149)";
        ctx.stroke();

        // 渐变色圈
        var rgnt=ctx.createRadialGradient(0,0,160,0,0,240);         
        rgnt.addColorStop(0,"rgb(9,114,161)");
        rgnt.addColorStop(0.2,"rgba(2,32,67,0.5)");
        ctx.fillStyle=rgnt;
        ctx.beginPath();
        ctx.arc(0,0,240,0,2*Math.PI,true);
        ctx.closePath();
        ctx.fill();

        // 细绿圈
        ctx.beginPath();
        ctx.arc(0,0,160,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(4,150,141)";
        ctx.stroke();

        // 暗蓝底
        ctx.beginPath();
        ctx.arc(0,0,158,0,Math.PI*2,false);
        ctx.closePath();
        ctx.fillStyle="rgb(1,14,44)";
        ctx.fill();

        // 粗绿圈
        ctx.beginPath();
        ctx.arc(0,0,150,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=6;
        ctx.strokeStyle="rgb(4,150,141)";
        ctx.stroke();

        // 暗蓝断续三圈
        ctx.beginPath();
        ctx.arc(0,0,120,0,Math.PI*2,false);
        ctx.closePath();
        ctx.lineWidth=2;
        ctx.strokeStyle="rgb(87,105,204)";
        ctx.stroke();

        for(var i=0;i<3;i++){
            var alpha=Math.PI/6+i*Math.PI*2/3;

            const r=120;
            var x=r*Math.cos(alpha);
            var y=r*Math.sin(alpha);

            ctx.save();

            ctx.translate(x,y);
            ctx.rotate(alpha);            
            ctx.beginPath();
            ctx.fillStyle="rgb(1,14,44)";
            ctx.fillRect(-4,-10,8,20);
            ctx.closePath();

            ctx.beginPath();
            ctx.moveTo(-12,0);
            ctx.lineTo(6,6);
            ctx.lineTo(6,-6);
            ctx.closePath();
            ctx.fillStyle="white";
            ctx.fill();

            ctx.restore();
        }

        // 写速度
        ctx.fillStyle="white";
        ctx.font="90px Bahnschrift SemiBold Condensed";
        ctx.textAlign="center";
        ctx.textBaseLine="Middle";
        ctx.fillText("70",0,30);

        // 写速度单位
        ctx.fillStyle="white";
        ctx.font="30px Bahnschrift Condensed";
        ctx.textAlign="center";
        ctx.textBaseLine="Middle";
        ctx.fillText("km/h",0,80);
    }

    // 画前景
    this.paintFg=function(ctx){    
        var angle=Math.PI*3/2+Math.random()*Math.PI/100+Math.PI/8;

        // 画刻度
        for(var i=0;i<=120;i++){
            var theta=Math.PI/80*i+Math.PI*3/4;
            const r=244;
            var x=r*Math.cos(theta);
            var y=r*Math.sin(theta);

            // 刻度
            ctx.save();
            ctx.translate(x,y);
            ctx.rotate(theta);
            ctx.beginPath();
            ctx.moveTo(0,0-3);
            ctx.lineTo(0-6,0-3);
            ctx.lineTo(0-6,0+3);
            ctx.lineTo(0,0+3);
            ctx.closePath();
            if(theta<angle){
                ctx.fillStyle="rgb(254,98,54)";
                ctx.fill();
            }else{
                ctx.fillStyle="rgb(187,234,250)";
                ctx.fill();
            }
            ctx.restore();

            // 文字
            if(i%20==0){
                var x3=210*Math.cos(theta);
                var y3=210*Math.sin(theta);
                ctx.fillStyle="white";
                ctx.font="30px Microsoft YaHei UI";
                ctx.textAlign="center";
                ctx.textBaseLine="Middle";
                ctx.fillText(i/10,x3,y3+8);
            }
        }

        // 画指针
        var x1=236*Math.cos(angle);
        var y1=236*Math.sin(angle);
        ctx.save();        
        ctx.translate(x1,y1);
        ctx.rotate(angle);
        // 指针上片
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(-18,4);
        ctx.lineTo(-83,4);
        ctx.lineTo(-83,0);        
        ctx.closePath();        
        ctx.fillStyle="red";
        ctx.fill();
        // 指针下片
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(-18,-4);
        ctx.lineTo(-83,-4);
        ctx.lineTo(-83,0);        
        ctx.closePath();        
        ctx.fillStyle="rgb(245,0,14)";
        ctx.fill();

        ctx.restore();
    }
}

/*-------------------------------------
《面试暗语》

工资6-10K--就是6K,可能再稍往上加加,但别想多了
抗压能力强--压力很大,准备爬屎山,各种坑要填,各种锅要背
要踏实肯干--工作很累,任务很杂,从编码测试美工到墩地打扫厕所都有,要少点心思,老老实实干活。
回家等通知--大概率没戏了
两周通知你--你非首选
有消息我第一时间通知你,领导在出差还没答复-去面别家吧
我们这边没有那么快,你可以先去看其它机会--别等了,直接去别家
什么时候来上班--大概率稳了,但也有放鸽子的。
-------------------------------------*/
//-->
</script>

【原型】

END

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

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

相关文章

【学习】Web安全测试需要考虑哪些情形

一、数据加密 某些数据需要进行信息加密和过滤后才能在客户端和服务器之间进行传输&#xff0c;包括用户登录密码、信用卡信息等。例如&#xff0c;在登录某银行网站时&#xff0c;该网站必须支持SSL协议&#xff0c;通过浏览器访问该网站时&#xff0c;地址栏的http变成https…

【智能算法】飞蛾扑火算法(MFO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2015年&#xff0c;Mirjalili等人受到飞蛾受到火焰吸引行为启发&#xff0c;提出了飞蛾算法(Moth-Flame Optimization&#xff0c;MFO)。 2.算法原理 2.1算法思想 MFO基于自然界中飞蛾寻找光源的…

【MySQL数据库】数据类型和简单的增删改查

目录 数据库 MySQL的常用数据类型 1.数值类型&#xff1a; 2.字符串类型 3.日期类型 MySQL简单的增删改查 1.插入数据&#xff1a; 2.查询数据&#xff1a; 3.修改语句&#xff1a; 4.删除语句&#xff1a; 数据库 平时我们使用的操作系统都把数据存储在文件中&#…

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

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

python爬虫基础-----运算符(第三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

ubuntu下安装minconda

1.搜索清华源 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.搜索conda 3.选一个合适自己的下载到本地 4.将下载的文件传入到ubuntu中 bash Miniconda3-py311_23.11.0-1-Linux-x86_64.sh 安装 5.source ~/.bashrc 激活即可&#xff08;必要步骤&#xff09;

了解一波经典的 I/O 模型

最近读了波网络 I/O 相关的文章&#xff0c;做下总结、摘录。&#xff08;未完&#xff09; 经典 I/O 模型 {% checkbox red checked, 阻塞式 I/O&#xff08;blocking I/O&#xff09; %}{% checkbox red checked, 非阻塞式 I/O&#xff08;non-blocking I/O&#xff09; %}…

接口关联和requests库

一、接口关联 postman的接口 postman的接口关联配置&#xff1a;js代码&#xff0c;重点在于思路。 // 定义jsonData这个变量 接受登录接口的返回结果 var jsonData JSON.parse(responseBody); // 从返回结果里提取token/id值&#xff0c;并赋值给token/id变量值作为环境变…

中电金信:打好智能风控四张牌 筑牢财务公司风险管理防护网

2021年&#xff0c;国务院印发《“十四五”数字经济发展规划的通知》&#xff0c;为我国金融行业数字化建设指明了目标和方向&#xff0c;对金融企业数字化转型提出了更高要求。企业集团财务公司作为服务于大型企业改革的金融配套政策的机构&#xff0c;30多年来立足于产融结合…

git基础-撤销操作

撤销操作 在任何阶段&#xff0c;我们都可能希望撤消某些操作。在这里&#xff0c;我们将回顾一些基本工具&#xff0c;用于撤消之前所做的更改。操作要谨慎&#xff0c;因为这些撤销可能无法修复。这是 Git 中为数不多的几个领域之一由于操作不当&#xff0c;导致丢失一些工作…

Webpack生成企业站静态页面 - 项目搭建

现在Web前端流行的三大框架有Angular、React、Vue&#xff0c;很多项目经过这几年的洗礼&#xff0c;已经都 转型使用这三大框架进行开发&#xff0c;那为什么还要写纯静态页面呢&#xff1f;比如Vue中除了SPA单页面开发&#xff0c;也可以使用nuxt.js实现SSR服务端渲染&#x…

PyTorch深度学习:如何实现遥感影像的自动化地物分类?

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

详解 net user

net user 是 Windows 操作系统自带的一个命令行工具&#xff0c;用于管理和查询本地用户账户信息。在域环境中&#xff0c;它可以用于管理本地用户账户&#xff0c;但对域用户账户的操作能力有限&#xff0c;尤其是查看域账户锁定状态等功能。以下是 net user 命令的详解&#…

国内IP节点更换攻略,一键解决烦恼

在如今的互联网时代&#xff0c;网络已经成为人们生活中不可或缺的一部分。而对于许多网民来说&#xff0c;网络速度的快慢直接关系到他们的上网体验。在国内&#xff0c;很多用户常常遇到一个问题&#xff0c;那就是网络速度不稳定。有时候可以流畅地上网&#xff0c;有时候却…

2024/03/25(C++·day1)

一、思维导图 二、练习 练习一 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream&g…

2024第14届深圳国际电子元器件展览会

2024第14届深圳国际电子元器件展览会 The 14th Shenzhen International Electronic Components Exhibition in 2024 时间&#xff1a;2024年08月28-30日 地点&#xff1a;深圳国际会展中心&#xff08;新馆&#xff09; 预订以上展会详询陆先生 I38&#xff08;前三位&…

定制化区块链交易所开发:Dapp、DeFi和IDO的全方位解决方案

随着区块链技术的不断发展&#xff0c;区块链交易所已经成为数字资产交易的主要场所之一。然而&#xff0c;由于不同项目的需求和特点各不相同&#xff0c;通用的交易所往往无法满足所有的需求。因此&#xff0c;定制化区块链交易所的需求逐渐增加&#xff0c;以满足不同项目的…

【随笔】Git -- 基本概念和使用方式(五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

用友U8Cloud FileServlet 任意文件读取漏洞复现(含nuclei-poc)

免责声明 由于传播、利用本CSDN所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担! 一、产品介绍 用友U8Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。…