【Canvas与艺术】绘制方形斜纹生化危险Biohazard标志

【关键点】

绘制切角矩形、三角形比较费工,有时间可以把相关代码做成函数。

【成果图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>方形斜纹生化危险Biohazard标志</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>
            <img id="myImg" src="125.png" style="display:none;"/>
        </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){
        window.requestAnimationFrame(animate);   
    }
}

// 舞台类
function Stage(){

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

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

    // 画背景
    this.paintBg=function(ctx){
        ctx.clearRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);// 清屏        
    
        // 黑底
        ctx.fillStyle="black";
        ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);

        // 黄色斜45°条纹
        const step=91;
        for(i=0;i<11;i++){            
            var x=-WIDTH/2+i*step+32;
            var y=-HEIGHT/2+i*step+32;

            ctx.beginPath();
            ctx.moveTo(x,-HEIGHT/2-20);
            ctx.lineTo(-WIDTH/2-20,y);
            ctx.lineWidth=34;
            ctx.strokeStyle="rgb(255,211,63)";
            ctx.stroke();
        }

        // 外圈黑框
        ctx.beginPath();
        ctx.moveTo(-WIDTH/2,-HEIGHT/2);
        ctx.lineTo(-WIDTH/2,HEIGHT/2);
        ctx.lineWidth=60;
        ctx.strokeStyle="black";
        ctx.stroke();

        ctx.beginPath();
        ctx.moveTo(-WIDTH/2,-HEIGHT/2);
        ctx.lineTo(WIDTH/2,-HEIGHT/2);
        ctx.lineWidth=60;
        ctx.strokeStyle="black";
        ctx.stroke();

        ctx.beginPath();
        ctx.moveTo(WIDTH/2,-HEIGHT/2);
        ctx.lineTo(WIDTH/2,HEIGHT/2);
        ctx.lineWidth=60;
        ctx.strokeStyle="black";
        ctx.stroke();

        ctx.beginPath();
        ctx.moveTo(-WIDTH/2,HEIGHT/2);
        ctx.lineTo(WIDTH/2,HEIGHT/2);
        ctx.lineWidth=60;
        ctx.strokeStyle="black";
        ctx.stroke();
        
        // 黄色切角矩形
        var x=0,y=160;
        var w=400,h=120;
        var bias=18;
        ctx.beginPath();
        ctx.moveTo(x-w/2+bias,y-h/2);
        ctx.lineTo(x+w/2-bias,y-h/2);
        ctx.lineTo(x+w/2,y-h/2+bias);
        ctx.lineTo(x+w/2,y+h/2-bias);
        ctx.lineTo(x+w/2-bias,y+h/2);
        ctx.lineTo(x-w/2+bias,y+h/2);
        ctx.lineTo(x-w/2,y+h/2-bias);
        ctx.lineTo(x-w/2,y-h/2+bias);
        ctx.closePath();
        ctx.fillStyle="rgb(255,211,63)";
        ctx.fill();

        // 黑色切角矩形
        var x=0,y=160;
        var w=380,h=100;
        var bias=12;
        ctx.beginPath();
        ctx.moveTo(x-w/2+bias,y-h/2);
        ctx.lineTo(x+w/2-bias,y-h/2);
        ctx.lineTo(x+w/2,y-h/2+bias);
        ctx.lineTo(x+w/2,y+h/2-bias);
        ctx.lineTo(x+w/2-bias,y+h/2);
        ctx.lineTo(x-w/2+bias,y+h/2);
        ctx.lineTo(x-w/2,y+h/2-bias);
        ctx.lineTo(x-w/2,y-h/2+bias);
        ctx.closePath();
        ctx.fillStyle="black";
        ctx.fill();

        // 黄色字底板
        var x=0,y=160;
        var w=354,h=76;
        ctx.fillStyle="rgb(255,211,63)";
        ctx.fillRect(x-w/2,y-h/2,w,h);

        // 黑字
        ctx.textBaseline="bottom";
        ctx.textAlign="center";
        ctx.font = "54px Stencil Std";
        ctx.fillStyle="black";
        ctx.fillText("BIOHAZARD",x,y+35);

        //---下面开始画标志
        ctx.save();
        ctx.translate(0,-20);

        // 外圈黄色切角三角形
        var arr=[];
        for(var i=0;i<3;i++){
            var theta=Math.PI*2/3*i+Math.PI/6;
            var x=Math.cos(theta)*200;
            var y=Math.sin(theta)*200;
            arr.push(createPt(x,y));
        }
        var ptRight=arr[0];
        var ptLeft=arr[1];
        var ptTop=arr[2];
        var bias=12;
        ctx.beginPath();
        ctx.moveTo(ptRight.x-bias,ptRight.y);
        ctx.lineTo(ptLeft.x+bias,ptLeft.y);
        ctx.lineTo(ptLeft.x+bias/2,ptLeft.y-bias*1.732/2);
        ctx.lineTo(ptTop.x-bias/2,ptTop.y+bias*1.732/2);
        ctx.lineTo(ptTop.x+bias/2,ptTop.y+bias*1.732/2);
        ctx.lineTo(ptRight.x-bias/2,ptRight.y-bias*1.732/2);
        ctx.closePath();
        ctx.fillStyle="rgb(255,211,63)";
        ctx.fill();

        // 内圈黑色切角三角形
        var arr=[];
        for(var i=0;i<3;i++){
            var theta=Math.PI*2/3*i+Math.PI/6;
            var x=Math.cos(theta)*180;
            var y=Math.sin(theta)*180;
            arr.push(createPt(x,y));
        }
        var ptRight=arr[0];
        var ptLeft=arr[1];
        var ptTop=arr[2];
        var bias=9;
        ctx.beginPath();
        ctx.moveTo(ptRight.x-bias,ptRight.y);
        ctx.lineTo(ptLeft.x+bias,ptLeft.y);
        ctx.lineTo(ptLeft.x+bias/2,ptLeft.y-bias*1.732/2);
        ctx.lineTo(ptTop.x-bias/2,ptTop.y+bias*1.732/2);
        ctx.lineTo(ptTop.x+bias/2,ptTop.y+bias*1.732/2);
        ctx.lineTo(ptRight.x-bias/2,ptRight.y-bias*1.732/2);
        ctx.closePath();
        ctx.fillStyle="black";
        ctx.fill();

        // 内圈黄色三角形
        ctx.beginPath();
        for(var i=0;i<3;i++){
            var theta=Math.PI*2/3*i+Math.PI/6;
            var x=Math.cos(theta)*160;
            var y=Math.sin(theta)*160;
            ctx.lineTo(x,y);
        }
        ctx.closePath();
        ctx.fillStyle="rgb(255,211,63)";
        ctx.fill();


        // 下面画多刺爪
        ctx.save();
        ctx.scale(0.8,0.8);//(为省事在原有的画法基础上缩小0.8倍)
        // 三个黑实心圆
        var arr=createRegTriArr(0,0,50);
        for(var i=0;i<arr.length;i++){
            var pt=arr[i];

            ctx.beginPath();
            ctx.arc(pt.x,pt.y,52,0,Math.PI*2,false);
            ctx.closePath();
            ctx.fillStyle="black";
            ctx.fill();
        }

        // 三个偏心的黄色实心圆
        var arr=createRegTriArr(0,0,58);
        for(var i=0;i<arr.length;i++){
            var pt=arr[i];

            ctx.beginPath();
            ctx.arc(pt.x,pt.y,45,0,Math.PI*2,false);
            ctx.closePath();
            ctx.fillStyle="rgb(255,211,63)";
            ctx.fill();
        }

        // 黄圈
        for(var i=0;i<3;i++){
            var startAngle=i*Math.PI*2/3-Math.PI/28;
            var endAngle=startAngle+Math.PI/5*2;

            ctx.beginPath();
            ctx.arc(0,0,40,startAngle,endAngle,false);
            ctx.lineWidth=8;
            ctx.strokeStyle="black";
            ctx.stroke();
        }

        // 三小黄叉
        var arr=createRegTriArr(0,0,15);
        for(var i=0;i<arr.length;i++){
            var pt=arr[i];

            ctx.beginPath();
            ctx.moveTo(0,0);
            ctx.lineTo(pt.x,pt.y);
            ctx.lineWidth=3;
            ctx.strokeStyle="rgb(255,211,63)";
            ctx.stroke();
        }

        // 中心黄点
        ctx.beginPath();
        ctx.arc(0,0,6,0,Math.PI*2,false);
        ctx.closePath();
        ctx.fillStyle="rgb(255,211,63)";
        ctx.fill();

        ctx.restore();        
        ctx.restore();

        // 版权
        ctx.textBaseline="bottom";
        ctx.textAlign="center";
        ctx.font = "8px consolas";
        ctx.fillStyle="black";
        ctx.fillText("逆火原创",WIDTH/2-40,HEIGHT/2-10);
    }

    // 画前景
    this.paintFg=function(ctx){
        
        
    }
}

// 函数,创建一个二维坐标点
function createPt(x,y){
    var retval={};
    retval.x=x;
    retval.y=y;
    return retval;
}

// function:create regular triangular array
// 函数,创建一个以x,y为中心,r为半径的正三角形数组
// arr[0]为右下,arr[1]为左下,arr[2]为正上。
function createRegTriArr(x,y,r){
    var arr=new Array();

    for(var i=0;i<3;i++){
        var theta=Math.PI*2/3*i+Math.PI/6;
        var pt=createPt(r*Math.cos(theta)+x,r*Math.sin(theta)+y);
        arr.push(pt);
    }

    return arr;
}

/*--------------------------------------------------
“我大清”的故事
与曾国藩、李鸿章、左宗棠并称晚清中兴四大名臣
的张之洞,他有个口头禅就是时常把“我大清”挂在嘴边。
有一次就在朝堂上,张之洞又在说“我大清”的时候,
素来与之不和的醇亲王载沣一本正经地问他:“张大人,
你什么时候被抬的旗啊?我怎么不知道?”
张之洞诧异道:“老夫没有入旗。”
载沣得意地道:“大清是我爱新觉罗家的,你等只是
我大清养的狗,连奴才都不算。你以后不要张口我大清,
闭口我大清的,省得让人误会了,还以为大清是你们的了!”
张之洞被噎得哑口无言,慈禧太后在一旁哈哈大笑...
---------------------------------------------------*/
//-->
</script>

END

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

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

相关文章

【Golang学习笔记】从零开始搭建一个Web框架(四)

文章目录 模板渲染静态文件支持HTML 模板渲染 错误恢复完结撒花~~ 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;二&#xff09;-CSDN博客 【Golang学习笔记】从…

ChatGLM3初体验

mac本地化部署ChatGLM3 写在前面环境准备1. python环境2. 安装第三方依赖torch3.下载模型 代码准备1.clone代码 run效果 写在前面 建议直接去看官方文档 https://github.com/THUDM/ChatGLM3?tabreadme-ov-file 环境准备 1. python环境 python -V ## 3.11.42. 安装第三方依…

怎么提升公众号上限

正常可以申请多少个公众号&#xff1f;目前如果我们是企业主体的话&#xff08;包括个体户&#xff09;&#xff0c;申请公众号默认是可以申请2个公众号数量的。不过对于很多公司来说&#xff0c;2个公众号的数量肯定是远远不够用的&#xff0c;不同的产品不同品牌不同部门都可…

倍增法学习

这里i为开始下标&#xff0c;j是2的次幂

OSPF 开放式最短路径优先协议

目录 技术产生原因&#xff1a;因为RIP存在不足 OSPF优点&#xff1a; RIPV2和OSPFV2比较&#xff1a; 相同点&#xff1a; 不同点&#xff1a; OSPF的结构化部署 --- 区域划分 区域划分的主要目的&#xff1a; 区域边界路由器 --- ABR &#xff1a; 区域划分的要求&am…

医疗图像分割 | 基于Pyramid-Vision-Transformer算法实现医疗息肉分割

项目应用场景 面向医疗图像息肉分割场景&#xff0c;项目采用 Pytorch Pyramid-Vision-Transformer 深度学习算法来实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 模型架构 (2) 项目依赖&#xff0c;包括 python 3.8、pytorch 1.7.1、torchvision 0.8.2(3) 下载…

2024 ICLR Oral 泛读调研(一、关于深度学习训练技术)

调研阅读要求&#xff1a; &#xff08;1&#xff09;先读要点&#xff1a;标题、摘要&#xff0c;随后直接跳到结论。 &#xff08;2&#xff09;实验结果&#xff1a;图、表、伪代码。 &#xff08;3&#xff09;对比角度&#xff1a;实验环境、数据集、测试方法、评估指标、…

嵌入式webrtc音视频多端p2p sfu传输方案

Webrtc在实时音视频中占据重要位置&#xff0c;在小型嵌入式设备上实现音视频数据的组合传输也越来越成为趋势&#xff0c;通过方便快捷的信令调度&#xff0c;可以实时相互拉取对等方的音视频流也可以通过sfu服务器实现转发。 我们在实践中采用物联网常用的mqtt协议来实现设备…

如何发现高危的PoC和EXP?漏洞检测方法 示例,实战应急实战举例,包括:SQLi、XSS、SSTI/ELI、文件哈希、SSRF、命令执行/命令注入等等

如何发现高危的PoC和EXP?漏洞检测方法 & 示例,实战应急实战举例,包括:SQLi、XSS、SSTI/ELI、文件哈希、SSRF、命令执行/命令注入等等。 在网络安全领域,发现高危的PoC(Proof of Concept)和EXP(Exploit)对于防范和应对潜在的安全威胁至关重要。以下是关于如何发现高…

使用Python实现自动化网页答题功能-模拟考试篇

介绍 在驾驶员考试网站上进行模拟考试python自动答题 自动化原理 该脚本使用了自动化模块 DrissionPage 中的 ChromiumPage 类来实现网页的自动化操作。通过定位网页元素和模拟点击操作&#xff0c;完成了选择答案和提交答卷的过程。 用途与注意事项 用途&#xff1a;该脚本…

安卓逆向 | 某X游戏垂类Web nonce

*本案例仅做分析参考,如有侵权请联系删除 1.逻辑分析 通过XHR断点,然后逐步往上调发现nonce生出处。 在console执行下函数 其中 i,是当前日期和时间的秒级时间戳,并将其向下取整到最接近的整数。 i = ~~(+_.w() / 1e3)w</

《剑指 Offer》专项突破版 - 面试题 108 : 单词演变(C++ 实现)

目录 前言 单向广度优先搜索 双向广度优先搜索 前言 题目链接&#xff1a;单词演变 题目&#xff1a; 输入两个长度相同但内容不同的单词&#xff08;beginWord 和 endWord&#xff09;和一个单词列表&#xff08;wordList&#xff09;&#xff0c;求从 beginWord 到 end…

测试计划和测试报告

1、软件测试计划简介 测试计划&#xff0c;一般是主管写&#xff0c;在需求分析之后&#xff0c;测试工作开始之间做的一些准备划工作。一般包含以下内容&#xff1a;5W1H 目的、测试范围、测试进度安排、测试人员、测试环境、测试方法工具&#xff0c;风险评估 &#xff08;w…

ABB、FANUC机器人点位加速度用法

机器人在点位与点位之间的运动&#xff0c;会存在速度上的变化&#xff0c;加速度指令的添加可以减小机器人在运动中&#xff0c;由高速到低速间惯性的带来的影响&#xff0c;修正机器人的路径误差&#xff0c;让机器人的运动更加顺滑。 一、ABB机器人指令添加 ABB机器人加速…

TCHouse-C

一.概括 1.地域&#xff08;Region&#xff09; 地域&#xff08;Region&#xff09;指腾讯云数据仓库 TCHouse-C 物理服务器所在的地理区域。腾讯云不同地域之间网络完全隔离&#xff0c;购买后不能更换。&#xff08;地域一旦选定&#xff0c;购买后无法更改。&#xff09;…

IP地址的主要功能及其在网络中的重要性

在当今数字化时代&#xff0c;互联网已经成为人们生活和工作中不可或缺的一部分。而IP地址&#xff08;Internet Protocol Address&#xff09;作为互联网中的关键组成部分&#xff0c;发挥着至关重要的作用。本文将探讨IP地址的主要功能以及其在网络中的重要性。 IP地址查询&…

解决在嵌入式系统开发编译时遇到的“no definition for ‘xxx‘在xxx.o文件中”BUG

提示&#xff1a;本文章是自己折腾嵌入式系统开发过程学习记录 解决在嵌入式系统开发编译时遇到的“no definition for xxx在xxx.o文件中”BUG BUG描述一、编译开发环境开发语言和库 二、问题分析知识点说明函数声明&#xff1a;函数定义&#xff1a; 三、解决方案1. 检查函数声…

el-image实现旋转修改保存

2024.4.8今天我学习了用el-image组件如何实现图片的旋转然后保存旋转之后的图片&#xff0c; 代码如下&#xff1a; 一、新增确定按钮。 <template><el-image src/assets/xxx/xxx clickclickImage(/assets/xxx/xxx)/> </template><script> export d…

redis的设计与实现(五)——独立功能

1. Redis的其他功能 redis 除了简单对对象的增删改查的功能之外&#xff0c;其实还有其他高级功能&#xff0c;了解这些内容有利于我们更灵活的使用 redis 完成我们的业务功能。 2. 发布与订阅 2.1. 基本概念 很多中间件都有发布与订阅功能&#xff0c;但是&#xff0c;作为一…

leetcode经典困难题-接雨水

. - 力扣&#xff08;LeetCode&#xff09; 42. 接雨水 困难 相关标签 相关企业 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,…