【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏

【成图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title>
     <style type="text/css">
     .centerlize{
        margin:0 auto;
        width:1200px;
     }
     </style>
     </head>

     <body οnlοad="init();">
        <div class="centerlize">
            <canvas id="myCanvas" width="12px" height="12px" style="border:1px dotted black;">
                如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.
            </canvas>
        </div>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// canvas的绘图环境
var ctx;

// 高宽
const WIDTH=512;
const HEIGHT=512;

// 舞台对象
var stage;

// 暂停标志
var paused=false;

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

    // 设置点击鼠标暂停
    canvas.οnclick=function(e){
        paused=! paused;
    }

    // 设置高宽
    canvas.width=WIDTH;
    canvas.height=HEIGHT;

    // 初始化canvas的绘图环境
    ctx=canvas.getContext('2d');  
    ctx.translate(WIDTH/2,HEIGHT/2);// 原点平移

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

    // 开幕
    animate();
}

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

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

// 舞台类
function Stage(){
    this.theta=0;

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

    // 更新
    this.update=function(){ 
        if(!paused){
            this.theta+=0.02;
        }
    }

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

    // 画前景
    this.paintFg=function(ctx){
        // 底色
        ctx.save();
        ctx.fillStyle = "white";
        ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);
        ctx.restore();

        const R=210;// 基准尺寸
                
        // 第1圈
        ctx.save();
        var r=R*1.00;
        drawSolidCircle(ctx,0,0,r,"rgb(191,128,53)");
        ctx.restore();

        // 第2圈
        ctx.save();
        var r=R*0.995;
        var gnt=ctx.createLinearGradient(0,-r,0,r);
        gnt.addColorStop(0,"rgb(241,215,94)");
        gnt.addColorStop(0.5,"rgb(207,157,42)");
        gnt.addColorStop(1,"rgb(163,107,39)");
        drawSolidCircle(ctx,0,0,r,gnt);
        ctx.restore();

        // 第3圈
        ctx.save();
        var r=R*0.975;
        var gnt=ctx.createLinearGradient(0,-r,0,r);
        gnt.addColorStop(0,"rgb(165,108,32)");
        gnt.addColorStop(0.5,"rgb(212,158,44)");
        gnt.addColorStop(1,"rgb(247,215,100)");
        drawSolidCircle(ctx,0,0,r,gnt);
        ctx.restore();

        // 第4圈
        ctx.save();
        var r=R*0.955;
        var gnt=ctx.createLinearGradient(0,-r,0,r);
        gnt.addColorStop(0,"rgb(176,112,37)");
        gnt.addColorStop(0.5,"rgb(173,144,59)");
        gnt.addColorStop(1,"rgb(185,183,109)");
        drawSolidCircle(ctx,0,0,r,gnt);
        ctx.restore();

        // 第5圈 雷达屏开始
        ctx.save();
        var r=R*0.95;
        drawSolidCircle(ctx,0,0,r,"rgb(0,14,27)");
        ctx.restore();

        // 角度
        ctx.save();
        var r=R*0.90;
        var N=36;
        for(var i=0;i<N;i++){
            var theta=Math.PI*2/N*i-Math.PI/2;

            var pt=createPt(r*Math.cos(theta),r*Math.sin(theta));

            ctx.font=r/22+"px Microsoft YaHei UI";
            ctx.textAlign="center";
            ctx.textBaseLine="Middle";
            ctx.fillStyle="rgb(43,185,187)";
            ctx.fillText((i*10).toString().padStart(3, '0'),pt.x,pt.y+r/45);
            
        }
        ctx.restore();

        // 大圆
        ctx.save();
        var r=R*0.85;
        ctx.strokeStyle="rgb(43,185,187)";
        ctx.lineWidth=R/105;
        ctx.beginPath();
        ctx.arc(0,0,r,0,Math.PI*2,false);
        ctx.closePath();
        ctx.stroke();
        ctx.restore();

        // 刻度
        ctx.save();
        var r=R*0.85;
        var N=36;
        for(var i=0;i<N;i++){
            var theta=Math.PI*2/N*i;            

            var rad1=r/20*20;
            var rad2=r/20*18;    
            var rad3=r/20*19;
            var pt=createPt(rad1*Math.cos(theta),rad1*Math.sin(theta));
            var pt2=createPt(rad2*Math.cos(theta),rad2*Math.sin(theta));
            if(i%2==0){
                pt2=createPt(rad3*Math.cos(theta),rad3*Math.sin(theta));
            }

            ctx.lineWidth=R/210;
            ctx.strokeStyle="rgb(43,185,187)";
            ctx.beginPath();
            ctx.moveTo(pt.x,pt.y);
            ctx.lineTo(pt2.x,pt2.y);
            ctx.stroke();                
        }
        ctx.restore();

        // 纵横线
        ctx.save();
        var r=R*0.85;        
        
        ctx.arc(0,0,r,0,Math.PI*2,false);
        ctx.clip();// 切图圆

        ctx.strokeStyle="rgb(43,185,187)";
        ctx.lineWidth=R/420;

        var N=12;
        var PART=2*r/N;
        
        for(var i=0;i<N;i++){ // 竖线
            var a=createPt(-r+i*PART,-r);
            var b=createPt(-r+i*PART,+r);

            ctx.beginPath();
            ctx.moveTo(a.x,a.y);
            ctx.lineTo(b.x,b.y);
            ctx.stroke();
        }

        for(var i=0;i<N;i++){ // 横线
            var a=createPt(-r,-r+i*PART);
            var b=createPt(+r,-r+i*PART);

            ctx.beginPath();
            ctx.moveTo(a.x,a.y);
            ctx.lineTo(b.x,b.y);
            ctx.stroke();
        }
        ctx.restore();

        // 五个同心圆
        ctx.save();
        var r=R*0.85;
        ctx.strokeStyle="rgb(43,185,187)";
        ctx.lineWidth=R/420;

        for(var i=1;i<=5;i++){
            var radius=r/5*i;
            ctx.beginPath();
            ctx.arc(0,0,radius,0,Math.PI*2,false);
            ctx.closePath();
            ctx.stroke();
        }
        ctx.restore();

        // 扫描扇形
        ctx.save();
        const ANGLE=Math.PI/3*1;
        var r=R*0.85;
        var a=createPt(r*Math.cos(this.theta),r*Math.sin(this.theta));
        var b=createPt(r*Math.cos(this.theta+ANGLE),r*Math.sin(this.theta+ANGLE));
        var c=createPt(a.x*Math.cos(ANGLE),a.y*Math.cos(ANGLE));

        ctx.strokeStyle="rgb(43,185,187)";// 牵引棒
        ctx.lineWidth=R/210;
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(b.x,b.y);
        ctx.stroke();

        var gnt=ctx.createLinearGradient(b.x,b.y,c.x,c.y);// 线性渐变色
        gnt.addColorStop(0,"rgba(255,255,255,0.6)");
        gnt.addColorStop(0.5,"rgba(255,255,255,0.4)");
        gnt.addColorStop(1,"rgba(255,255,255,0.2)");
        ctx.fillStyle=gnt;
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(a.x,a.y);
        ctx.arc(0,0,r,this.theta,this.theta+ANGLE,false);
        ctx.closePath();
        ctx.fill();

        ctx.restore();

        // 三个模拟目标点
        ctx.save();
        var r=R*0.98;
        var startAngle=((this.theta/Math.PI*180)%360)/180*Math.PI;
        var endAngle=(((this.theta+ANGLE)/Math.PI*180)%360)/180*Math.PI;

        var l=r*0.55;
        var angle=Math.PI*0.33;
        var a=createPt(l*Math.cos(angle),l*Math.sin(angle));
        if(startAngle<angle && angle<endAngle){
            drawSolidCircle(ctx,a.x,a.y,r*0.02,"white");
        }else{            
            var gnt=ctx.createRadialGradient(a.x,a.y,0,a.x,a.y,r*0.02);// 辐射渐变
            gnt.addColorStop(0,"rgba(190,199,190,0.8)");
            gnt.addColorStop(0.5,"rgba(190,199,190,0.4");
            gnt.addColorStop(1,"rgba(190,199,190,0.1");
            drawSolidCircle(ctx,a.x,a.y,r*0.02,gnt);
        }

        l=r*0.75;
        angle=Math.PI*0.8;
        var a=createPt(l*Math.cos(angle),l*Math.sin(angle));
        if(startAngle<angle && angle<endAngle){
            drawSolidCircle(ctx,a.x,a.y,r*0.02,"white");
        }else{            
            var gnt=ctx.createRadialGradient(a.x,a.y,0,a.x,a.y,r*0.02);// 辐射渐变
            gnt.addColorStop(0,"rgba(190,199,190,0.8)");
            gnt.addColorStop(0.5,"rgba(190,199,190,0.4");
            gnt.addColorStop(1,"rgba(190,199,190,0.1");
            drawSolidCircle(ctx,a.x,a.y,r*0.02,gnt);
        }

        var l=r*0.65;
        var angle=Math.PI*1.4;
        var a=createPt(l*Math.cos(angle),l*Math.sin(angle));
        if(startAngle<angle && angle<endAngle){
            drawSolidCircle(ctx,a.x,a.y,r*0.02,"white");
        }else{            
            var gnt=ctx.createRadialGradient(a.x,a.y,0,a.x,a.y,r*0.02);// 辐射渐变
            gnt.addColorStop(0,"rgba(190,199,190,0.8)");
            gnt.addColorStop(0.5,"rgba(190,199,190,0.4");
            gnt.addColorStop(1,"rgba(190,199,190,0.1");
            drawSolidCircle(ctx,a.x,a.y,r*0.02,gnt);
        }

        ctx.restore();

        writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火制图","8px consolas","lightgrey");// 版权
    }
}

/*----------------------------------------------------------
函数:用于绘制实心圆,用途是标记点以辅助作图
ctx:绘图上下文
x:矩形中心横坐标
y:矩形中心纵坐标
r:圆半径
color:填充圆的颜色
----------------------------------------------------------*/
function drawSolidCircle(ctx,x,y,r,color){
    ctx.fillStyle=color;
    ctx.beginPath();
    ctx.arc(x,y,r,0,Math.PI*2,false);
    ctx.closePath();
    ctx.fill();
}

/*----------------------------------------------------------
函数:创建一个二维坐标点
x:横坐标
y:纵坐标
Pt即Point
----------------------------------------------------------*/
function createPt(x,y){
    var retval={};
    retval.x=x;
    retval.y=y;
    return retval;
}

/*----------------------------------------------------------
函数:延时若干毫秒
milliseconds:毫秒数
----------------------------------------------------------*/
function sleep(milliSeconds) {
    const date = Date.now();
    let currDate = null;
    while (currDate - date < milliSeconds) {
        currDate = Date.now();
    } 
}

/*----------------------------------------------------------
函数:书写文字
ctx:绘图上下文
x:横坐标
y:纵坐标
text:文字
font:字体
color:颜色
----------------------------------------------------------*/
function writeText(ctx,x,y,text,font,color){
    ctx.save();
    ctx.textBaseline="bottom";
    ctx.textAlign="center";
    ctx.font = font;
    ctx.fillStyle=color;
    ctx.fillText(text,x,y);
    ctx.restore();
}

/*-------------------------------------------------------------
人不自信的最根本原因是什么?
对世界:没有认识到,这个世界就是个巨大的草台班子
对自己:没有认识到,除了极个别天才,其他人之间差别没想象的那麽大
比你拉跨,但比你赚钱多的人有,比你牛,但没你赚钱多的人也有
放轻松,才能展示自己最好的一面。
负担不要太重,也不要怕出丑,
其实人生,无非就是:你笑笑别人,别人笑笑你。
--------------------------------------------------------------*/
//-->
</script>

END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spark Optimization —— Reducing Shuffle

Spark Optimization : Reducing Shuffle “Shuffling is the only thing which Nature cannot undo.” — Arthur Eddington Shuffle Shuffle Shuffle I used to see people playing cards and using the word “Shuffle” even before I knew how to play it. Shuffling in c…

数据结构 (22)哈夫曼树及其应用

前言 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称最优二叉树或最优树&#xff0c;是一种特殊的二叉树结构&#xff0c;其带权路径长度&#xff08;WPL&#xff09;最短。 一、哈夫曼树的基本概念 定义&#xff1a;给定N个权值作为N个叶子结点&#xff0c;构…

Android Studio安装TalkX AI编程助手

文章目录 TalkX简介编程场景 TalkX安装TalkX编程使用ai编程助手相关文章 TalkX简介 TalkX是一款将OpenAI的GPT 3.5/4模型集成到IDE的AI编程插件。它免费提供特定场景的AI编程指导&#xff0c;帮助开发人员提高工作效率约38%&#xff0c;甚至在解决编程问题的效率上提升超过2倍…

泷羽sec-shell脚本(全) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

开发者如何使用GCC提升开发效率IMG操作

看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144134160?spm1001.2014.3001.5502 stb_image库配置 https://github.com/nothings/stb 代码 #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEM…

vue3【实战】面包屑【组件封装】Breadcrumb (根据菜单自动生成,实时响应路由变化,添加顺滑的过渡动画)

效果预览 技术方案 vue3 ( vite | TS | vueUse | AutoImport ) Element Plus UnoCSS 技术要点 根据当前路由查询所有父级路由 /*** 从树状列表中获取指定节点的所有父节点** param treeList 树状列表&#xff0c;包含多个节点* param value 目标节点的路径值* param parents…

pdf也算是矢量图——pdf大小调整--福昕pdf

有时候需要把pdf作为矢量图放到latex论文中&#xff0c;有时候需要裁剪掉空白的部分&#xff0c;就需要用福昕pdf进行编辑&#xff0c; 参考文章&#xff1a;福昕高级PDF编辑器裁切工具怎么用&#xff1f;裁切工具使用方法介绍_福昕PDF软件工具集 (foxitsoftware.cn)

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

Java项目Docker部署

docker将应用程序与该程序的依赖打包在一个文件里。运行这个文件就会生成一个虚拟容器&#xff0c;就不用担心环境问题&#xff0c;还可以进行版本管理、复制修改等。 docker安装 由于在CentOS下安装docker最常用&#xff0c;所以以Linux环境安装为主 1.安装工具包 缺少依赖…

【数据结构与算法】排序算法(上)——插入排序与选择排序

文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法&#xff0c;第一是插入排序&#xff0c;二是选择排序&#xff…

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

虚拟机docker记录

最近看了一个up的这个视频&#xff0c;感觉docker真的挺不错的&#xff0c;遂也想来搞一下&#xff1a; https://www.bilibili.com/video/BV1QC4y1A7Xi/?spm_id_from333.337.search-card.all.click&vd_sourcef5fd730321bc0e9ca497d98869046942 这里我用的是vmware安装ubu…

[ACTF2020 新生赛]BackupFile--详细解析

信息搜集 让我们寻找源文件&#xff0c;目录扫描&#xff1a; 找到了/index.php.bak文件&#xff0c;也就是index.php的备份文件。 后缀名是.bak的文件是备份文件&#xff0c;是文件格式的扩展名。 我们访问这个路径&#xff0c;就会直接下载该备份文件。 我们把.bak后缀删掉…

AD单通道AD多通道

AD单通道接线图 滑动变阻器的内部结构 左边和右边的两个引脚接的是电阻的两个固定端&#xff0c;中间这个引脚接的是滑动抽头&#xff0c;电位器外边这里有个十字形状的槽可以拧&#xff0c;往左拧&#xff0c;抽头就往左靠&#xff0c;往右拧&#xff0c;抽头就往右靠。所以外…

解决Ubuntu DNS覆盖写入127.0.0.53

ubuntu22.04解析网址时报错如图所示&#xff1a; 因为/etc/resolve.conf中存在 nameserver 127.0.0.53回环地址造成循环引用 原因&#xff1a; ubuntu17.0之后特有&#xff0c;systemd-resolvd服务会一直覆盖 解决方法&#xff1a; 1、修改resolv.config文件中的nameserver…

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…

[golang][MAC]Go环境搭建+VsCode配置

一、go环境搭建 1.1 安装SDK 1、下载go官方SDK 官方&#xff1a;go 官方地址 中文&#xff1a;go 中文社区 根据你的设备下载对应的安装包&#xff1a; 2、打开压缩包&#xff0c;根据引导一路下一步安装。 3、检测安装是否完成打开终端&#xff0c;输入&#xff1a; go ve…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框&#xff0c;点左边的“Expert”&#xff08;专家&#xff09;&#xff0c;然后找到“IdleTimeout”&#xff0c;将数值设置为0&#xff0c;点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

AIGC时代 | 如何从零开始学网页设计及3D编程

文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的Unity 3D游戏 《编程真好玩&#xff1a;从零开始学网页设计及3D编程》内容简介作者简介…

virtualbox给Ubuntu22创建共享文件夹

1.在windows上的操作&#xff0c;创建共享文件夹Share 2.Ubuntu22上的操作&#xff0c;创建共享文件夹LinuxShare 3.在virtualbox虚拟机设置里&#xff0c;设置共享文件夹 共享文件夹路径&#xff1a;选择Windows系统中你需要共享的文件夹 共享文件夹名称&#xff1a;挂载至wi…