【Canvas与标志】灰座橙底红芯辐射标志

news2024/11/28 6:47:10

【成图】

【代码】

<!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="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;

//-------------------------------
// 初始化
//-------------------------------
function init(){
    // 获得canvas对象
    var canvas=document.getElementById('myCanvas');  
    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.init=function(){
        
    }

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

    // 画背景
    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;// 基准尺寸

        //最外圈
        ctx.save();
        var r=R*1.00;
        var gnt1=ctx.createLinearGradient(0,-r,0,r);
        gnt1.addColorStop(0,"grey");
        gnt1.addColorStop(1,"black");
        ctx.fillStyle=gnt1;
        drawRoundPolygon(ctx,0,0,8,r,r/10);
        ctx.fill();
        ctx.restore();

        //第2圈
        ctx.save();
        var r=R*0.99;
        var gnt1=ctx.createLinearGradient(0,-r,0,r);
        gnt1.addColorStop(0,"rgb(248,248,248)");
        gnt1.addColorStop(0.25,"rgb(224,224,224)");
        gnt1.addColorStop(0.5,"rgb(202,202,202)");
        gnt1.addColorStop(0.75,"rgb(255,255,255)");
        gnt1.addColorStop(1,"rgb(111,111,111)");
        ctx.fillStyle=gnt1;
        drawRoundPolygon(ctx,0,0,8,r,r/10);
        ctx.fill();
        ctx.restore();

        // 外圈上部玻璃光
        ctx.save();
        var r=R*0.99;
        var start=Math.PI/8;
        var offset=Math.PI/4;

        var angle=start;
        var a=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*1;
        var b=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*2;
        var c=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*3;
        var d=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*4;
        var e=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*5;
        var f=createPt(r*Math.cos(angle),r*Math.sin(angle));

        var g=createPt(b.x/2+a.x/2,b.y/2+a.y/2);
        var h=createPt(e.x/2+f.x/2,e.y/2+f.y/2);

        ctx.fillStyle="rgba(250,250,250,0.5)"; // 填充半透明色
        ctx.beginPath();
        ctx.moveTo(g.x,g.y);
        ctx.lineTo(b.x,b.y);
        ctx.lineTo(c.x,c.y);
        ctx.lineTo(d.x,d.y);
        ctx.lineTo(e.x,e.y);
        ctx.lineTo(h.x,h.y);
        ctx.quadraticCurveTo(0,0+r/2,g.x,g.y);
        ctx.fill();
        ctx.restore();

        //第3圈
        ctx.save();
        var r=R*0.89;
        var gnt1=ctx.createLinearGradient(0,-r,0,r);
        gnt1.addColorStop(0,"rgb(110,122,131)");
        gnt1.addColorStop(1,"rgb(233,232,238)");
        ctx.fillStyle=gnt1;
        drawRoundPolygon(ctx,0,0,8,r,r/10);
        ctx.fill();
        ctx.restore();

        //第4圈
        ctx.save();
        var r=R*0.88;
        var gnt1=ctx.createLinearGradient(0,-r,0,r);
        gnt1.addColorStop(0,"black");
        gnt1.addColorStop(1,"grey");
        ctx.fillStyle=gnt1;
        drawRoundPolygon(ctx,0,0,8,r,r/10);
        ctx.fill();
        ctx.restore();

        //第5圈-橙底
        ctx.save();
        var r=R*0.87;
        var gnt1=ctx.createLinearGradient(0,-r,0,r);
        gnt1.addColorStop(0,"rgb(238,194,151)");
        gnt1.addColorStop(1,"rgb(220,132,46)");
        ctx.fillStyle=gnt1;
        drawRoundPolygon(ctx,0,0,8,r,r/10);
        ctx.fill();
        ctx.restore();

        // 辐射标志
        ctx.save();
        var rOut=R*0.60;
        var rIn=R*0.30;
        var N=3;

        for(var i=0;i<N;i++){
            var theta=Math.PI*2/N*i-Math.PI/6;

            var angle=theta+Math.PI/6;
            var r=rIn;
            var a=createPt(r*Math.cos(angle),r*Math.sin(angle));

            angle=theta+Math.PI/6;
            r=rOut;
            var b=createPt(r*Math.cos(angle),r*Math.sin(angle));

            angle=theta-Math.PI/6;
            r=rOut;
            var c=createPt(r*Math.cos(angle),r*Math.sin(angle));

            angle=theta-Math.PI/6;
            r=rIn;
            var d=createPt(r*Math.cos(angle),r*Math.sin(angle));

            ctx.fillStyle="red";
            ctx.beginPath();
            ctx.moveTo(a.x,a.y);
            ctx.lineTo(b.x,b.y);
            ctx.arc(0,0,rOut,theta+Math.PI/6,theta-Math.PI/6,true);
            ctx.lineTo(c.x,c.y);
            ctx.lineTo(d.x,d.y);
            ctx.arc(0,0,rIn,theta-Math.PI/6,theta+Math.PI/6,false);
            ctx.closePath();
            ctx.fill();
        }
        ctx.restore();

        // 中间白圆
        ctx.save();
        var r=R*0.2;
        ctx.fillStyle="red";
        ctx.beginPath();
        ctx.arc(0,0,r,0,Math.PI*2,true);
        ctx.closePath();
        ctx.fill();
        ctx.restore();

        // 上部玻璃光
        ctx.save();
        var r=R*0.87;
        var start=Math.PI/8;
        var offset=Math.PI/4;

        var angle=start;
        var a=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*1;
        var b=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*2;
        var c=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*3;
        var d=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*4;
        var e=createPt(r*Math.cos(angle),r*Math.sin(angle));

        angle=start-offset*5;
        var f=createPt(r*Math.cos(angle),r*Math.sin(angle));

        var yBias=r/10;
        var g=createPt(b.x/2+a.x/2,b.y/2+a.y/2+yBias);
        var h=createPt(e.x/2+f.x/2,e.y/2+f.y/2+yBias);

        ctx.fillStyle="rgba(220,220,220,0.3)"; // 填充半透明色
        ctx.beginPath();
        ctx.moveTo(g.x,g.y);
        ctx.lineTo(b.x,b.y);
        ctx.lineTo(c.x,c.y);
        ctx.lineTo(d.x,d.y);
        ctx.lineTo(e.x,e.y);
        ctx.lineTo(h.x,h.y);
        ctx.quadraticCurveTo(0,0+r/2+yBias,g.x,g.y);
        ctx.fill();
        ctx.restore();

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

/*----------------------------------------------------------
函数:用于绘制圆角多边形,使用贝塞尔二次曲线形成圆角效果,
适用于五边以上图形
ctx:绘图上下文
x:多边形中心横坐标
y:多边形中心纵坐标
n:多边形边数
R:多边形半径
r:圆角半径
----------------------------------------------------------*/
function drawRoundPolygon(ctx,x,y,n,R,r){
    // 取点
    const N=n;// 多边形边数
    const ROUND=r;// 圆角半径
    
    var arr=[];// 放顶点三点的数组
    for(var i=0;i<N;i++){
        var theta=Math.PI*2/N*i+Math.PI/N;

        var r=R;
        var a=createPt(x+r*Math.cos(theta),y+r*Math.sin(theta));

        r=ROUND*Math.tan(Math.PI/N);
        var angle=theta+Math.PI/2+Math.PI/N;
        var c=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));

        r=ROUND/Math.sqrt(3);
        angle=theta-Math.PI/2-Math.PI/N;
        var b=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));

        var arrInner=[b,a,c];
        arr.push(arrInner);
    }

    // 绘图
    ctx.beginPath();
    for(var i=0;i<arr.length;i++){
        var b=arr[i][0];
        var a=arr[i][1];
        var c=arr[i][2];

        ctx.lineTo(b.x,b.y);
        ctx.quadraticCurveTo(a.x,a.y,c.x,c.y);
        ctx.lineTo(c.x,c.y);
    }
    ctx.closePath();
}


/*----------------------------------------------------------
函数:用于绘制实心圆,用途是标记点以辅助作图
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

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

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

相关文章

msvcp140.dll丢失的解决方法,详细解读6种解决方法

在使用电脑时&#xff0c;我们可能会遇到提示缺少msvcp140.dll的错误信息。这个提示意味着我们的电脑中缺少MSVCP140.dll这个文件&#xff0c;它是某些程序运行所必需的。如果我们遇到这个问题&#xff0c;应该如何解决呢&#xff1f;本文将详细解析如何解决msvcp140.dll丢失的…

qemu模拟arm64环境-构建6.1内核以及debian12

一、背景 手头没有合适的arm64开发板&#xff0c;但是需要arm的环境&#xff0c;于是想到qemu模拟一个。除了硬件交互以外&#xff0c;软件层面的开发还是都可以实现的。 虚拟机还能自定义内存大小和镜像大小&#xff0c;非常适合上板前的验证&#xff0c;合适的话再买也不迟。…

深度学习:5种经典神经网络模型介绍

目录 1. LeNet&#xff1a;CNN的鼻祖 2. AlexNet&#xff1a;深度学习的开山之作 3. VGGNet&#xff1a;深度与简洁的结合 4. GoogLeNet&#xff1a;Inception模块的创新 5. ResNet&#xff1a;残差学习的革命 卷积神经网络&#xff08;CNN&#xff09;已经发展为图像识别…

张雪峰谈人工智能技术应用专业的就业前景!

一、张雪峰谈人工智能技术应用专业 在教育咨询领域&#xff0c;张雪峰老师以其深入浅出的讲解和前瞻性的视角&#xff0c;为广大学子提供了宝贵的专业选择建议。对于人工智能技术应用专业&#xff0c;张雪峰老师通常给予高度评价&#xff0c;认为这是一个充满无限可能且就业前…

DELL SC compellent存储的四种访问方式

DELL SC存储&#xff08;国内翻译为 康贝存储&#xff0c;英文是compellent&#xff09;, compellent存储是dell在大概10多年前收购的一家存储&#xff0c;原来这个公司就叫做compellent。 本文的阅读对象是第一次接触SC存储的技术朋友们&#xff0c;如何访问和管理SC存储。总…

陀螺仪LSM6DSV16X与AI集成(13)----中断获取SFLP四元数

陀螺仪LSM6DSV16X与AI集成.13--中断获取SFLP四元数 概述视频教学样品申请源码下载硬件准备SFLP开启INT中断中断读取传感器数据主程序演示 概述 本文将介绍如何通过中断机制获取 LSM6DSV16X 传感器的 SFLP&#xff08;Sensor Fusion Low Power&#xff09;四元数数据。LSM6DSV1…

深入剖析 Golang 的错误处理机制:让你的代码更加健壮与优雅

在 Go 语言中&#xff0c;错误处理是程序健壮性的重要组成部分。不同于许多其他编程语言使用的 try-catch 异常处理机制&#xff0c;Go 采用了一种更加简洁的方式&#xff0c;通过函数返回值处理错误。这种设计使得错误处理逻辑更加显式&#xff0c;代码也更容易理解和维护。 文…

Python 工具库每日推荐 【markdown2】

文章目录 引言Python文本处理库的重要性今日推荐:markdown2工具库主要功能:使用场景:安装与配置快速上手示例代码转换为HTML代码解释实际应用案例案例:博客文章处理案例分析高级特性自定义扩展安全模式命令行使用性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已…

Byzantine setting 拜占庭环境

优秀教程 拜占庭将军问题(The Byzantine Generals Problem): 拜占庭将军问题(The Byzantine Generals Problem) Byzantine setting 在联邦学习和分布式计算中&#xff0c;“Byzantine setting”&#xff08;拜占庭环境&#xff09;是指一个分布式系统中的部分参与者可能表现出…

SE-Net模型实现猴痘病识别

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

国庆出行怎么能少了这款美食

&#x1f388;国庆出游&#xff0c;怎能少了白吉饼&#xff01;&#x1f389;宝子们&#xff0c;国庆假期大家都在哪里玩耍呀&#xff1f;今天我必须给大家强烈安利国庆旅游必带美食 ——食家巷白吉饼。&#x1f60b;白吉饼看似普通&#xff0c;却有着独特的魅力。它的外表金黄…

pip install dlib 失败报错的解决方案

pip install dlib 失败报错&#xff1a; 解决方案&#xff1a; 我是按照下面三条指令按照就能解决问题 pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple pip install boost -i https://pypi.tuna.tsinghua.edu.cn/simple pip install dlib -i https://p…

Stm32新建工程

库函数的开发方式。能够了解底层逻辑。 HAL库的开方式。快速上手&#xff0c;理解浅。 库函数的文件目录 Libraries里面就是库函数的文件 project官方实例的工程和模板&#xff0c;可以参考库函数 Utilities&#xff0c;官方在用电路测评STM32时使用的程序。 蓝色为库函数的发…

机器学习课程学习周报十五

机器学习课程学习周报十五 文章目录 机器学习课程学习周报十五摘要Abstract一、机器学习部分1. 统计推断与贝叶斯推断2. GMM和EM算法补充3. 马尔可夫链蒙特卡罗法3.1 蒙特卡罗法3.2 马尔可夫链3.3 Diffusion模型中的马尔可夫链 总结 摘要 本周的学习涵盖了统计推断和贝叶斯推断…

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo 对应标注&#xff0c;格式VOC (XML)&#xff0c;选配Y0L0(TXT) label| pic_ num| box_ _num hole: (425&#xff0c; 481) suspension_ wire: (1739&#xff0c; 1782) topbasi: (46&#xff0c; 46) dirty: (613&…

近期最佳港片,探讨家庭与希望,结尾让人心碎

在当下的电影环境中&#xff0c;香港电影正在经历一场颇具深意的转变&#xff0c;逐渐将目光投向普通人的生活。这种变化在《但愿人长久》中体现得淋漓尽致&#xff0c;影片通过一个家庭的悲欢离合&#xff0c;让人深刻感受到人性的复杂。吴慷仁在片中扮演的角色&#xff0c;无…

github项目——系统设计入门

今天的github趋势&#xff0c;有几个项目印象感觉很有意思&#xff0c;之后可能会用的上&#xff0c;记录一下 系统设计入门 书籍教程类项目&#xff0c;有中文文档&#xff0c;刚好需要。 https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md…

从零开始讲PCIe(9)——PCIe总线体系结构

一、分层结构 PCIe定义了一个分层架构&#xff0c;如图2-12所示。这些层逻辑上分为两个部分&#xff0c;分别独立运行&#xff1a;一个用于发送侧&#xff0c;另一个用于接收侧。分层方法对硬件设计者是很有好的&#xff0c;因为如果逻辑划分得当&#xff0c;在迁移到新版本的P…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

《CUDA编程》5.获得GPU加速的关键

从本章起&#xff0c;将关注CDUA程序的性能&#xff0c;即执行速度 1 用CUDA事件计时 在前几章中&#xff0c;使用的是C的<time.h>库进行程序运行计时&#xff0c;CUDA也提供了一种基于CUDA event的计时方式&#xff0c;用来给一段CUDA代码进行计时&#xff0c;这里只介…