【Canvas与艺术】绘制“Best Product Guaranteed”标志

【图示】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>用Canvas绘制“Best Product Guaranteed”标志</title><style type="text/css">.centerlize{margin:0 auto;width:1200px;}</style></head><body οnlοad="init();"><div class="centerlize"><canvas id="myCanvas" width="512px" height="512px" 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 gearArr=getGearArray(96,Math.PI/96,250,240);                ctx.beginPath();for(var i=0;i<gearArr.length;i++){ctx.lineTo(gearArr[i].x,gearArr[i].y);}ctx.closePath();ctx.fillStyle="rgb(149,30,36)";ctx.fill();// 下半圆        const outerRadius=210;const innerRadius=150;var theta=Math.PI/10;var x1=outerRadius*Math.cos(theta);var y1=outerRadius*Math.sin(theta);var beta=Math.asin(y1/innerRadius);var x2=Math.sqrt(innerRadius*innerRadius-y1*y1);ctx.beginPath();ctx.moveTo(x1,y1);        ctx.arc(0,0,outerRadius,theta,Math.PI-theta,false);    ctx.lineTo(-x2,y1);ctx.arc(0,0,innerRadius,Math.PI-beta,beta,true);    ctx.lineTo(x2,y1);ctx.lineTo(x1,y1);ctx.closePath();ctx.lineWidth=15;ctx.strokeStyle="rgb(245,247,225)";ctx.stroke();ctx.fillStyle="rgb(29,159,149)";ctx.fill();var txts=["G","U","A","R","A","N","T","E","E","D"];for(var i=0;i<txts.length;i++){var letter=txts[i];var gama=Math.PI/180*132-i*Math.PI/19;var x=190*Math.cos(gama);var y=190*Math.sin(gama);ctx.save();ctx.translate(x,y);ctx.rotate(gama-Math.PI/2);ctx.scale(1,0.5);ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "48px Bahnschrift SemiBold";ctx.fillStyle="white";ctx.fillText(letter,0,0);ctx.restore();}// 上半圆ctx.beginPath();ctx.moveTo(x1,-y1);        ctx.arc(0,0,outerRadius,-theta,Math.PI+theta,true);    ctx.lineTo(-x2,-y1);ctx.arc(0,0,innerRadius,Math.PI+beta,-beta,false);    ctx.lineTo(x2,-y1);ctx.lineTo(x1,-y1);ctx.closePath();ctx.lineWidth=15;ctx.strokeStyle="rgb(245,247,225)";ctx.stroke();ctx.fillStyle="rgb(29,159,149)";ctx.fill();txts=["B","E","S","T"," ","P","R","O","D","U","C","T"];for(var i=0;i<txts.length;i++){var letter=txts[i];var gama=Math.PI/180*218+i*Math.PI/19;var x=167*Math.cos(gama);var y=167*Math.sin(gama);ctx.save();ctx.translate(x,y);ctx.rotate(gama+Math.PI/2);ctx.scale(1,0.5);ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "48px Bahnschrift SemiBold";ctx.fillStyle="white";ctx.fillText(letter,0,0);ctx.restore();}// 画中间右半边五角星const R=120;// 五角星外角半径const r=60;// 五角星内角半径ctx.save();ctx.rotate(Math.PI/10);ctx.beginPath();var alpha=0*2*Math.PI/5-3*Math.PI/5;ctx.moveTo(0,0);var x1=R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.moveTo(x1,y1);var beta=0*2*Math.PI/5-2*Math.PI/5;var x2=r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);alpha=1*2*Math.PI/5-3*Math.PI/5;var x1=R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.lineTo(x1,y1);beta=1*2*Math.PI/5-2*Math.PI/5;var x2=r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);alpha=2*2*Math.PI/5-3*Math.PI/5;var x1=R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.lineTo(x1,y1);beta=2*2*Math.PI/5-2*Math.PI/5;var x2=r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);ctx.closePath();ctx.fillStyle="rgb(189,180,39)";ctx.fill();ctx.restore();// 右半边ctx.save();ctx.rotate(-Math.PI/10);ctx.beginPath();var alpha=0*2*Math.PI/5-3*Math.PI/5;ctx.moveTo(0,0);var x1=-R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.moveTo(x1,y1);var beta=0*2*Math.PI/5-2*Math.PI/5;var x2=-r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);alpha=1*2*Math.PI/5-3*Math.PI/5;var x1=-R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.lineTo(x1,y1);beta=1*2*Math.PI/5-2*Math.PI/5;var x2=-r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);alpha=2*2*Math.PI/5-3*Math.PI/5;var x1=-R*Math.cos(alpha);var y1=R*Math.sin(alpha);ctx.lineTo(x1,y1);beta=2*2*Math.PI/5-2*Math.PI/5;var x2=-r*Math.cos(beta);var y2=r*Math.sin(beta);ctx.lineTo(x2,y2);ctx.closePath();ctx.fillStyle="rgb(239,228,61)";ctx.fill();ctx.restore();}// 画前景this.paintFg=function(ctx){}
}//-------------------------------------------------------
// 取得一个齿轮全部控制点的函数
// n:齿轮齿数
// angle:齿斜面倾角
// outerRadius:齿轮外径
// innerRadius:齿轮内径
//-------------------------------------------------------
function getGearArray(n,angle,outerRadius,innerRadius){// 准备齿轮数组var gearArr=new Array();for(var i=0;i<n*2;i++){var alpha=Math.PI/n*i;var bata=alpha+angle;var x1,y1,x2,y2;if(i%2==1){x1=innerRadius*Math.cos(alpha);y1=innerRadius*Math.sin(alpha);x2=outerRadius*Math.cos(bata);y2=outerRadius*Math.sin(bata);                }else{                x1=outerRadius*Math.cos(alpha);y1=outerRadius*Math.sin(alpha);x2=innerRadius*Math.cos(bata);y2=innerRadius*Math.sin(bata);}gearArr.push({x:x1,y:y1});gearArr.push({x:x2,y:y2});}return gearArr;
}/*---------------------------------------------
可以改变命运的八个途径:1.比大多数人勤奋认真;
2.做好每一件小事;
3.微笑面对任何命运的不公;
4.时间比金钱重要;
5.养成好习惯,习惯决定命运;
6.不断与人性的弱点斗争;
7.天才都是有心人;
8.机会无大小,只有时间早晚。
----------------------------------------------*/
//-->
</script>

【原图】

上面这个阴影太不好弄了,索性就简化设计了。

END

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

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

相关文章

剖析C++中的继承

剖析C继承 文章目录 剖析C继承前言一、继承的概念1. 概念2. 定义方式3. 注意要点 二、基类与派生类对象赋值转换三、继承中的作用域四、基类与派生类默认成员函数调用关系五、继承与友元函数六、继承与静态成员七、菱形继承总结 前言 ​ 继承是C中非常重要的一大特性&#xff…

一分钟了解MOS管基础知识

场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是电子技术中广泛使用的一种半导体器件&#xff0c;具有高输入阻抗、噪声低和低功耗等优点。 简介 场效应管是一种电压控制器件&#xff0c;其工作原理是通过改变栅极&#xff08;Gate&#xff09;…

python的pip如何升级

升级pip的方法如下&#xff1a; 打开命令行工具。在Windows系统中&#xff0c;可以通过按下WinR键&#xff0c;然后输入"cmd"来打开命令提示符&#xff1b;在Mac或Linux系统中&#xff0c;可以直接打开终端。检查当前pip版本。在终端或命令行中输入以下命令&#…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:C…

银行数字化转型导师坚鹏:银行数字化转型给分行带来的8大价值

银行数字化转型给分行带来的8大价值 银行数字化转型对不仅对总行产生了深远影响、给总行带来了新质生产力&#xff0c;对分行也会产生重要价值&#xff0c;银行数字化转型导师坚鹏从以下8个方面进行详细分析&#xff0c;相信能够给您带来重要启发&#xff0c;从而加速银行分行…

ubuntu1404安装dockerce

1. 升级linux kernel 2. 手动下载deb包进行安装 Install from a package If you cant use Dockers apt repository to install Docker Engine, you can download the deb file for your release and install it manually. You need to download a new file each time you wan…

[HackMyVM]靶场Economists

难度:Easy kali:192.168.56.104 靶机:192.168.56.145 端口扫描 ┌──(root㉿kali2)-[~] └─# nmap 192.168.56.145 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-04 18:58 CST Nmap scan report for 192.168.56.145 Host is up (0.000081s latency). Not show…

动态规划 Leetcode 72 编辑距离

编辑距离 Leetcode 72 学习记录自代码随想录 要点&#xff1a;1.dp数组定义&#xff1a;dp[i][j]以word1[i-1]结尾时将其转换为word2[0:j-1]需要的最少操作数&#xff1b; 2.递推公式&#xff1a;if(word1[i-1] word2[j-1]) dp[i][j] dp[i-1][j-1] else dp[i][j] min(dp[…

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 完美运营版商城/拼团/团购/秒杀/积分…

Bitmap

一张位图所占用的内存&#xff1a;图片长度&#xff08;px) x 图片宽度&#xff08;px&#xff09;x 一个像素点所占的字节数 在Android中&#xff0c;存储一个像素点所占用的字节数是使用枚举类型Bitmap.Config中的各个参数来表示的参数如下&#xff1a; ALPHA_8&#xff1a…

深入解析语言模型:原理、实战与评估

引言 随着人工智能的飞速发展&#xff0c;语言模型作为自然语言处理&#xff08;NLP&#xff09;的核心技术之一&#xff0c;日益受到业界的广泛关注。本文旨在深入探讨语言模型的原理、实战应用以及评估方法&#xff0c;帮助读者更好地理解和应用这一技术。 一、语言模型原理…

C++模板基础2——定义类模板

类模板 类模板是用来生成类的蓝图的。 与函数模板的不同之处是&#xff0c;编译器不能为类模板推断模极参数类型。 如我们已经多次看到的&#xff0c;为了使用类模板&#xff0c;我们必须在模板名后的尖括号中提供额外信息——用来代替模板参数的模板实参列表。 定义类模板…

Windows常用快捷键(效率、组合键、文字编辑、文件、Home、End、Delete)

这是一行测试语言&#xff0c;没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义。这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言&#xff0c;没有其他的含义。这是一行测试语言, 没有其他的含义.这是…

变量的作用范围:在函数中对全局变量进行赋值,python和JavaScript有点不一样。

JavaScript 和 Python 对于在函数中对全局变量进行赋值的行为略有不同&#xff1a; JavaScript&#xff1a; 在 JavaScript 中&#xff0c;函数可以对全局变量进行赋值&#xff0c;但需要注意以下几点&#xff1a; 如果在函数中直接使用变量名进行赋值&#xff0c;且该变量未…

上位机图像处理和嵌入式模块部署(qmacvisual之tcp客户端)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 视觉算法出了结果之后&#xff0c;一般都要通知到其他设备进行某些动作的。以前通信的方式&#xff0c;一般都是有线的&#xff0c;什么232、485、…

TiDB单机版安装和连接访问

TiDB单机版安装和连接访问 1、下载 $wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz 2、解压缩 $tar -zxvf tidb-latest-linux-amd64.tar.gz 3、启动TiDB 启动PD $./bin/pd-server --data-dirpd --log-filepd.log 启动tikv $./bin/tikv-server --pd…

ARM IHI0069F GIC architecture specification (5)

Ch2 中断分配与路由 2.1 The Distributor and Redistributors Distributor 为 SPI 提供路由配置&#xff0c;并保存所有关联的路由和优先级信息。 Redistributor 提供 PPI 和 SGI 的配置设置。 Redistributor总是在有限的时间内向 CPU 接口呈现具有最高优先级的待处理中断。 …

957: 逆置单链表

学习版 【C语言】 #include<iostream> using namespace std; typedef struct LNode {char data;struct LNode* next;LNode(char x) :data(x), next(nullptr) {} }LNode; void creatlist(LNode *&L) {int n;char e;cin >> n;LNode* p1, * p2;p1 L;for (int i…

帝国CMS模板源码整站安装说明(图文)

安装步骤 第一步&#xff1a;先把得到的文件解压缩&#xff0c;把文件通过FTP传到空间里。&#xff08;请不要把类似www.lengleng.net这个文件夹传到FTP&#xff0c;请传这个大文件夹下面的所有文件夹和文件到空间根目录&#xff0c;请不要上传到2级目录&#xff0c;除非你自己…

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…