【Canvas与艺术】绘制斜置黄色三角biohazard标志

【关键点】

径向渐变色和文字按角度偏转。

【成果图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>使用Html5/Canvas绘制斜置黄色三角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></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);// 清屏        // 中心渐变背景var rgnt=ctx.createRadialGradient(0,0,0,0,0,300);rgnt.addColorStop(0,"rgb(130,130,130)");rgnt.addColorStop(1,"rgb(40,40,40)");ctx.fillStyle=rgnt;ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);// 整体偏置ctx.save();ctx.translate(0,20);ctx.rotate(-Math.PI/10);// 白色切角三角形var arr=createRegTriArr(0,0,250);drawChamferedTriangle(ctx,arr[0],arr[1],arr[2],36);ctx.fillStyle="white";ctx.fill();// 黑色切角三角形var arr=createRegTriArr(0,0,240);drawChamferedTriangle(ctx,arr[0],arr[1],arr[2],30);ctx.fillStyle="rgb(32,26,26)";ctx.fill();// 黄色切角三角形var arr=createRegTriArr(0,0,160);drawChamferedTriangle(ctx,arr[0],arr[1],arr[2],24);ctx.fillStyle="rgb(255,240,1)";ctx.fill();// 文字var words=["SP-058-A","BIOHARZARD","DANGER"];for(i=0;i<3;i++){var theta=i*Math.PI*2/3-Math.PI/6;var pt=createPt(84*Math.cos(theta),84*Math.sin(theta));ctx.save();            if(i==1){ctx.translate(pt.x,pt.y+33);ctx.rotate(theta-Math.PI/2);}else{ctx.translate(pt.x,pt.y);ctx.rotate(theta+Math.PI/2);                }ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "27px Stencil Std";ctx.fillStyle="rgb(255,240,1)";ctx.fillText(words[i],0,0);ctx.restore();}//--------------下面开始绘制多刺爪ctx.save();ctx.scale(0.85,0.85);// 三个黑实心圆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,56,0,Math.PI*2,false);ctx.closePath();ctx.fillStyle="black";ctx.fill();}// 三个偏心的黄色实心圆var arr=createRegTriArr(0,0,62);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,240,1)";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=12;ctx.strokeStyle="black";ctx.stroke();}// 三小黄叉var arr=createRegTriArr(0,0,18);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=6;ctx.strokeStyle="rgb(255,240,1)";ctx.stroke();}// 中心黄点ctx.beginPath();ctx.arc(0,0,9,0,Math.PI*2,false);ctx.closePath();ctx.fillStyle="rgb(255,240,1)";ctx.fill();ctx.restore();ctx.restore();// 版权ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "8px consolas";ctx.fillStyle="white";ctx.fillText("逆火原创",WIDTH/2-40,HEIGHT/2-10);}// 画前景this.paintFg=function(ctx){}
}/*----------------------------------------------------------
函数:创建一个二维坐标点
x:坐标点的横坐标
y:坐标点的纵坐标
返回:坐标点对象
----------------------------------------------------------*/
function createPt(x,y){var retval={};retval.x=x;retval.y=y;return retval;
}/*----------------------------------------------------------
函数:创建一个以x,y为中心,r为半径的正三角形数组
ctx:绘图上下文
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;
}/*----------------------------------------------------------
函数:用于绘制切角正三角形
ctx:绘图上下文
ptRight:右顶点
ptLeft:左顶点
ptTop:上顶点
chamferLength:切角长度
----------------------------------------------------------*/
function drawChamferedTriangle(ctx,ptRight,ptLeft,ptTop,chamferLength){ctx.beginPath();ctx.moveTo(ptRight.x-chamferLength,ptRight.y);ctx.lineTo(ptLeft.x+chamferLength,ptLeft.y);ctx.lineTo(ptLeft.x+chamferLength/2,ptLeft.y-chamferLength*1.732/2);ctx.lineTo(ptTop.x-chamferLength/2,ptTop.y+chamferLength*1.732/2);ctx.lineTo(ptTop.x+chamferLength/2,ptTop.y+chamferLength*1.732/2);ctx.lineTo(ptRight.x-chamferLength/2,ptRight.y-chamferLength*1.732/2);ctx.closePath();
}/*---------------------------------------------
很多在美华人精英,
他们到了美国才被称为人才,
当他们还在国内时还只是:
那个不会来事的小王,
那个没眼力见的小李,
那个有点木讷的小张...
----------------------------------------------*/
//-->
</script>

【原图】

END

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

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

相关文章

spring-cloud微服务gateway

核心部分&#xff1a;routes(路由)&#xff0c; predicates(断言)&#xff0c;filters(过滤器) id&#xff1a;可以理解为是这组配置的一个id值&#xff0c;请保证他的唯一的&#xff0c;可以设置为和服务名一致 uri&#xff1a;可以理解为是通过条件匹配之后需要路由到&…

2024 CKA 基础操作教程(十二)

题目内容 考点相关内容分析 Pods Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod 是 Kubernetes 中的原子单元&#xff0c;用于封装应用程序的一个或多个容器、存储资源、唯一的网络 IP&#xff0c;以及有关如何运行容器的选项。Pod 提供了一个共享的…

一些实用的工具网站

200 css渐变底色 https://webgradients.com/ 200动画效果复制 https://css-loaders.com/classic/ 二次贝塞尔曲线 https://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html 三次贝塞尔曲线 https://blogs.sitepointstatic.com/examples/tech/c…

Day92:系统攻防-WindowsLinux远程探针本地自检任意执行权限提升入口点

目录 操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nexpose 知识点&#xff1a; 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 操作系统-远程漏扫-Nessus&Nexpose&a…

Python——详细解析目标检测xml格式标注转换为txt格式

本文简述了目标检测xml格式标注的内容&#xff0c;以及yolo系列模型所需的txt格式标注的内容。并提供了一个简单的&#xff0c;可以将xml格式标注文件转换为txt格式标注文件的python脚本。 1. xml格式文件内容 <size>标签下为图片信息&#xff0c;包括 <width> …

​​​​​​​iOS配置隐私清单文件App Privacy Configuration

推送到TestFlight后邮件收到警告信息如下&#xff0c;主要关于新的隐私政策需要补充&#xff1a; Hello, We noticed one or more issues with a recent submission for TestFlight review for the following app: AABBCC Version 10.10.10 Build 10 Although submission for …

servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 写一个servlet代码一般都是要继承httpServlet 这个类&#xff0c;然后重写里面的方法 但是它有一个特点&#xff0c;根据之前写的代码&#xff0c;我们发现好像没有写main方法也能正常执行。 原因是&#xff1a;这个代码不是直接运行的&#xff0c;而是放到…

共模电感饱和电流和额定电流的区别

共模电感饱和电流和额定电流是两个不同的概念&#xff0c;它们的区别如下&#xff1a; 1. 定义不同&#xff1a;共模电感饱和电流是指当通过共模电感的电流超过一定值时&#xff0c;共模电感的磁芯开始饱和&#xff0c;导致电感值下降。额定电流是指共模电感在正常工作条件下…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《应用图论建模输电网的电力现货市场出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

JavaSE图书管理系统实战

代码仓库地址&#xff1a;Java图书管理系统 1.前言 该项目将JavaSE的封装继承多态三大特性&#xff0c;使用了大量面向对象的操作&#xff0c;有利于巩固理解 &#xff08;1&#xff09;实现效果 2.实现步骤 第一步先把框架搭建起来&#xff0c;即创建出人&#xff1a;管理员和…

RocketMQ 02 功能大纲介绍

RocketMQ 02 主流的MQ有很多&#xff0c;比如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等。 之前阿里巴巴也是使用ActiveMQ&#xff0c;随着业务发展&#xff0c;ActiveMQ IO 模块出现瓶颈&#xff0c;后来阿里巴巴 通过一系列优化但是还是不能很好的解决&#xff0c;之后…

串口通信有哪些常见的应用领域?

串口通信是一种常见的数据通信方式&#xff0c;它使用串行接口在两个设备之间发送和接收数据。这种通信方式由于其简单性和广泛的支持&#xff0c;在多个应用领域中被广泛使用。下面是一些串口通信的常见应用领域&#xff1a; 工业自动化&#xff1a;串口通信在工业自动化中非常…

MySQL底层架构

MySQL底层架构 连接器 验证客户端连接的用户名密码、校验权限、维持和管理连接。 客户端如果超过 wailt_timeout 没有动静&#xff0c;连接器会主动将它断开&#xff0c;此时客户端再次发送请求的话&#xff0c;就会收到错误&#xff1a;lost connection to MySQL server dur…

【Modelsim】保持波形格式重编译and波形的保存与查看

文章目录 保持原波形格式重编译波形的保持与查看保存波形打开工程查看波形 保持原波形格式重编译 Modelsim 仿真设置好波形格式后&#xff0c;若需要修改代码并保持原波形格式重新查看波形&#xff0c;只需将文件重新编译后仿真即可。 1.修改代码后Project页面的代码状态变成…

外网如何访问内网数据库?

在当今信息时代&#xff0c;随着互联网的快速发展&#xff0c;很多企业和个人都面临着外网访问内网数据库的需求。外网访问内网数据库可以实现远程操作&#xff0c;方便用户在任何地点使用移动设备进行数据管理和查询。本文将介绍一种名为【天联】的组网产品&#xff0c;它是一…

数据库-Redis(12)

目录 56.Redis事务中watch是如何监视实现的? 57.为什么Redis不支持回滚? 58.Redis对ACID的支持性理解?

MongoDB聚合运算符:$radiansToDegrees

MongoDB聚合运算符&#xff1a;$radiansToDegrees 文章目录 MongoDB聚合运算符&#xff1a;$radiansToDegrees语法使用举例 $radiansToDegrees将以弧度为单位的输入值转换为度。从版本4.2开始支持。 语法 { $radiansToDegrees: <expression> }<expression>是能被解…

Unity的ScriptableObject

数据持久化&#xff1a;指将数据长期存储在持久性存储介质中&#xff0c;即使在程序结束或者系统重启后&#xff0c;数据依然可以被访问和使用。这与内存存储不同&#xff0c;内存存储是临时的。一旦程序结束或系统重启,数据就会丢失。 实现数据持久化的常见方式包括: 关系型数…

MetaGPT:一个多智能体框架,将不同的GPT模型分配到不同的角色中,形成一个协作的软件实体

MetaGPT是一个多智能体框架,旨在通过将不同的GPT模型分配到不同的角色中,形成一个协作的软件实体,以解决复杂任务3。它由中国团队开发,主要应用于软件开发等场景,利用标准作业程序(SOP)来协调基于大语言模型的多智能体系统,实现元编程技术5。MetaGPT的架构分为两层:基…

阿里云服务器公网带宽“按使用流量”如何计费的?

阿里云服务器宽带按使用流量怎么收费的&#xff1f;先使用后付费&#xff0c;根据云服务器实际公网出方向产生的流量来计费&#xff0c;一般流量价格为0.8元每GB&#xff0c;结算单位按照GB计费&#xff0c;每小时扣费&#xff0c;地域不同流量价格也不同。可以在阿里云CLUB中心…