【Canvas与纹饰】环形小蜜蜂纹饰

【成图】

【代码】

<!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><img id="myImg" src="361.jpg" 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){//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.fillStyle = "white";ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);        // 外圈ctx.strokeStyle="red";ctx.lineWidth=4;ctx.beginPath();ctx.arc(0,0,230,0,Math.PI*2,false);ctx.closePath();ctx.stroke();drawBeeLoopOnmt(ctx,0,0,200,24,"red");// 内粗圈ctx.strokeStyle="red";ctx.lineWidth=3;ctx.beginPath();ctx.arc(0,0,180,0,Math.PI*2,false);ctx.closePath();ctx.stroke();// 内细圈ctx.strokeStyle="red";ctx.lineWidth=1;ctx.beginPath();ctx.arc(0,0,170,0,Math.PI*2,false);ctx.closePath();ctx.stroke();/*// 诗正文var color="red";writeText(ctx,0,-125,"出塞之二","28px 方正宋刻本秀楷简体",color);writeText(ctx,85,-105,"王昌龄","16px 方正宋刻本秀楷简体",color);// 诗歌正文var start=createPt(0,-50);var gap=54;writeText(ctx,start.x,start.y,"骝马新跨白玉鞍","32px 方正宋刻本秀楷简体",color);writeText(ctx,start.x,start.y+gap,"战罢沙场月色寒","32px 方正宋刻本秀楷简体",color);writeText(ctx,start.x,start.y+2*gap, "城头铁鼓声犹震","32px 方正宋刻本秀楷简体",color);writeText(ctx,start.x,start.y+3*gap,"匣里金刀血未干","32px 方正宋刻本秀楷简体",color);*/writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火原创","8px consolas","lightgrey");// 版权}
}/*----------------------------------------------------------
函数:用于绘制小蜜蜂回环边纹,用于圆形内外装饰
ctx:绘图上下文
x:边纹中心横坐标
y:边纹中心纵坐标
radius:边纹内半径
n:边纹个数
color:描边颜色
----------------------------------------------------------*/
function drawBeeLoopOnmt(ctx,x,y,radius,n,color){const R=radius;const N=n;const PART=Math.PI*2/N/7;// 一个角分七分const D=R*Math.sin(PART/2);// 小正方形对角线的一半for(var i=0;i<N;i++){var theta=Math.PI*2/N*i;        var r=R;var a=createPt(x+r*Math.cos(theta),y+r*Math.sin(theta));drawOneBee(ctx,a.x,a.y,theta,D,color);}
}/*----------------------------------------------------------
函数:用于绘制一只小蜜蜂
ctx:绘图上下文
x:蜜蜂中心横坐标
y:蜜蜂中心纵坐标
theta:蜜蜂中心到圆心的角度
d:小正方形对角线的一半
color:描边颜色
----------------------------------------------------------*/
function drawOneBee(ctx,x,y,theta,d,color){ctx.save();// 平移加旋转,保证从中心开始画ctx.translate(x,y);ctx.rotate(theta+Math.PI/2);const W=1;// lineWidth,线宽ctx.lineWidth=W;ctx.strokeStyle=color;const N=4;const D=d;// 圆心到最内正方形尖角距离,调节此参数即调整图大小const G=0; // Gap Wdith,隔空宽度const T=d*0.3;// 心形凸台高度// 画蜜蜂本体for(var i=0;i<N;i++){var theta=Math.PI*2/N*i;var a=createPt(D*Math.cos(theta),D*Math.sin(theta));// a段var angle=theta-Math.PI/4;var r=Math.sqrt(2)*D-W/2-G;var a1=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));angle=theta+Math.PI/4*3;r=Math.sqrt(2)*D-W/2-G;var a2=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(a1.x,a1.y);ctx.lineTo(a2.x,a2.y);ctx.stroke();// b段angle=theta-Math.PI/4;r=Math.sqrt(2)*D+W/2+G;var b1=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));angle=theta-Math.PI/4;r=T;var b2=createPt(b1.x+r*Math.cos(angle),b1.y+r*Math.sin(angle));var radius=D*Math.sqrt(2)/2;angle=theta+Math.PI/4;r=radius;var b3=createPt(b2.x+r*Math.cos(angle),b2.y+r*Math.sin(angle));angle=theta+Math.PI/4;r=radius*2;var b4=createPt(b2.x+r*Math.cos(angle),b2.y+r*Math.sin(angle));angle=theta+Math.PI/4*3;r=Math.sqrt(2)*D+T;var b5=createPt(b4.x+r*Math.cos(angle),b4.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(b1.x,b1.y);ctx.lineTo(b2.x,b2.y);ctx.arc(b3.x,b3.y,radius,theta-Math.PI/4*3,theta+Math.PI/4,false);ctx.lineTo(b4.x,b4.y);ctx.lineTo(b5.x,b5.y);ctx.stroke();// C段angle=theta+Math.PI/4;r=W/2+G;var c1=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));angle=theta+Math.PI/4;r=Math.sqrt(2)*D+T+W/2+G;var c2=createPt(a.x+r*Math.cos(angle),a.y+r*Math.sin(angle));angle=theta-Math.PI/4;radius=D*Math.sqrt(2)/2;r=radius;var c3=createPt(c2.x+r*Math.cos(angle),c2.y+r*Math.sin(angle));angle=theta-Math.PI/4;r=2*radius;var c4=createPt(c2.x+r*Math.cos(angle),c2.y+r*Math.sin(angle));angle=theta-Math.PI/4*3;r=T;var c5=createPt(c4.x+r*Math.cos(angle),c4.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(c1.x,c1.y);ctx.lineTo(c2.x,c2.y);ctx.arc(c3.x,c3.y,radius,theta+Math.PI/4*3,theta-Math.PI/4,true);ctx.lineTo(c4.x,c4.y);ctx.lineTo(c5.x,c5.y);ctx.stroke();// d段angle=theta-Math.PI/4*3;r=W+2*G;var d1=createPt(c5.x+r*Math.cos(angle),c5.y+r*Math.sin(angle));angle=theta-Math.PI/4*3;r=Math.sqrt(2)*D*2-W-2*G;var d2=createPt(d1.x+r*Math.cos(angle),d1.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(d1.x,d1.y);ctx.lineTo(d2.x,d2.y);ctx.stroke();}// 右翼var angle=0;var r=5*d;var right=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=0;r=2*d;var r1=createPt(right.x+r*Math.cos(angle),right.y+r*Math.sin(angle));angle=Math.PI/2;r=2*d;var r2=createPt(right.x+r*Math.cos(angle),right.y+r*Math.sin(angle));angle=Math.PI;r=2*d;var r3=createPt(right.x+r*Math.cos(angle),right.y+r*Math.sin(angle));angle=Math.PI/2*3;r=2*d;var r4=createPt(right.x+r*Math.cos(angle),right.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(r1.x,r1.y);ctx.quadraticCurveTo(r4.x,r4.y,r3.x,r3.y);ctx.quadraticCurveTo(r2.x,r2.y,r1.x,r1.y);ctx.closePath();ctx.stroke();// 左翼var angle=Math.PI;var r=5*d;var left=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=0;r=2*d;var l1=createPt(left.x+r*Math.cos(angle),left.y+r*Math.sin(angle));angle=Math.PI/2;r=2*d;var l2=createPt(left.x+r*Math.cos(angle),left.y+r*Math.sin(angle));angle=Math.PI;r=2*d;var l3=createPt(left.x+r*Math.cos(angle),left.y+r*Math.sin(angle));angle=Math.PI/2*3;r=2*d;var l4=createPt(left.x+r*Math.cos(angle),left.y+r*Math.sin(angle));ctx.beginPath();ctx.moveTo(l1.x,l1.y);ctx.quadraticCurveTo(l4.x,l4.y,l3.x,l3.y);ctx.quadraticCurveTo(l2.x,l2.y,l1.x,l1.y);ctx.closePath();ctx.stroke();ctx.restore();
}/*----------------------------------------------------------
函数:用于绘制实心圆,用途是标记点以辅助作图
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.xdnf.cn/news/1524047.html

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

相关文章

《OpenCV计算机视觉》—— 模板匹配

文章目录 一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle() 三、代码实现 一、模板匹配简单介绍 在Python中&#xff0c;模板匹配是一种在图像中查找与给定模…

【Next】4. 全局通用布局快速搭建

笔记来源&#xff1a;编程导航 基础布局 Next.js 支持全局根布局&#xff08;每个页面都会生效&#xff09;以及嵌套布局&#xff08;可以只对部分页面生效&#xff09;&#xff0c;详情可 参考文档。 在 src 下新建 layouts 目录&#xff0c;用于存放项目中的各种布局。在该目…

无法访问Github?Steam++来帮你

前言 有许多小伙伴发现在国内访问Github真的真的很难&#xff0c;毕竟Github的DNS很容易就被***。 昨天还看到有小伙伴在群上聊天问&#xff1a;如何访问Github&#xff0c;实际上你只需要安装个加速器&#xff0c;或者使用国内的镜像站就可以轻松访问。 当然&#xff0c;如…

【面试八股总结】MySQL 锁:全局锁、表级锁、行级锁

1. 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。 MySQL 提供了⼀个加全局读锁的方法&#xff1a; flush tables with read lock 释放全局锁&#xff0c;执行命令&#xff1a; unlock tables 需要让整个库处于只读状态的时候&#xff0c;可以使用全局锁命…

用AI将你变成二次元角色!——Face Cartoon API 使用教程

人像动漫化 API 对接说明 本文将介绍一种通过输入一张人脸照片&#xff0c;生成个性化的二次元动漫形象&#xff0c;可用于打造个性头像、趣味活动、特效类应用等场景&#xff0c;提升社交娱乐的体验。 接下来介绍下 人像动漫化 API 的对接说明。 注册试用链接 注册试用链接…

渣土车识别算法解决城市治理难题

随着城市化进程的加速&#xff0c;渣土车作为建筑工程中不可或缺的运输工具&#xff0c;其频繁的穿行和装载运输过程往往引发一系列问题&#xff0c;如超载、扬尘污染、乱倒渣土等&#xff0c;对城市环境和交通秩序造成了不良影响。为了解决这些问题&#xff0c;采用基于视觉分…

解决网站发邮件导致IP泄露的问题

原文网址&#xff1a;解决网站发邮件导致IP泄露的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍解决网站发邮件导致IP泄露的问题。 问题描述 网站一般都会加发邮件功能&#xff0c;比如&#xff1a;用户注册时使用邮箱注册&#xff0c;通过邮箱验证码验证&#xff1b;给用…

安装Selenium进行web⾃动化测试

目录 驱动安装驱动管理工具selenium安装selenium驱动浏览器的⼯作原理自动化测试常⽤函数1. 元素定位1.1. find_element 的基本用法1.2. 常见的 find_element 定位方式1.3. find_element 的使用注意事项1.4. find_element 的进阶用法 2. 操作测试对象3. 窗口操作4. 屏幕截图5. …

牛客周赛 Round 58(ABCDF)

目录 A.会赢吗&#xff1f; B.能做到的吧 C.会赢的&#xff01; D.好好好数 F.随机化游戏时间 A.会赢吗&#xff1f; 思路&#xff1a; 签到题&#xff0c;比大小 void solve() {double a,b;cin>>a>>b;if(a>b) cout<<"NO";else cout<&…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

阿里云Ubuntu系统安装/简单使用Kafka

一、安装kafka 1.下载安装包 1.1下载地址 https://kafka.apache.org/downloads 注意&#xff1a; 版本可以随意选择&#xff0c;我们选择版本为2.4.1 2.压缩文件上传/解压 2.1上传 2.2解压文件 #解压文件指令 tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/ #创建软…

【C/C++】C语言实现蛇形矩阵

目录 题目描述输入描述:输出描述:示例思路代码 题目描述 给你一个整数n&#xff0c;输出n∗n的蛇形矩阵。 输入描述: 输入一行&#xff0c;包含一个整数n 输出描述: 输出n行&#xff0c;每行包含n个正整数&#xff0c;通过空格分隔。 1<n<1000 示例 输入 4输出 …

集成电路学习:什么是OLED有机发光二极管

一、OLED&#xff1a;有机发光二极管 OLED&#xff0c;全称有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;是一种电流型的有机发光器件。以下是关于OLED的详细介绍&#xff1a; 二、OLED的定义与原理 OLED是基于有机半导体材料和发光材料在…

恶意代码分析 | Lab1

前言 穿插virus分析的学习&#xff0c;毕竟逆向技术最后要用在攻防中。 Lab1就没必要动态分析了&#xff0c;静态学学写法。 Lab01-01.exe 前面是内存映射技术&#xff0c;对内存进行修改操作。 将Kernel32.dll和Lab01-01.dll的内存都Map出来&#xff0c;便于后续更改&…

遥感技术在环境监测中的应用:揭秘地球变化的天眼

当我们仰望星空&#xff0c;探索宇宙的奥秘时&#xff0c;别忘了脚下的这片土地同样蕴藏着无数未解之谜。遥感技术&#xff0c;这个听起来似乎遥不可及的名字&#xff0c;其实正是我们透视地球环境变化的“天眼”。今天将带大家一探遥感技术如何在环境监测中大显身手&#xff0…

将OpenHarmony RK设备散包镜像打包为一个整包

本篇文章教大家使用瑞芯微的Linux_Pack_Firmware工具将rk设备的多个镜像文件打包为一个固件。首先感谢大佬AlgoIdeas开源的打包工具&#xff0c;开源地址&#xff1a;https://gitee.com/openharmony-driver/ril_adapter 接下来进行演示&#xff0c;下面我们使用OpenHarmony 4.…

工控常用滤波方法(限幅+中值+算术平均+滑动平均)

工控常用滤波方法 简介限幅滤波法中值滤波法算术平均滤波法滑动平均滤波 简介 在实际的工程应用中&#xff0c;实际反馈的信号由于是通过电压及电流转换而来的数字量信号&#xff0c;在现场可能会受到比较大的干扰问题&#xff0c;这样的扰动会影响控制系统的输出精度&#xf…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.9-1.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第一周 卷积神经网络&#xff08;Foundations of Convolutional Neural Networks&#xff09;1.9 池化层&#xff08;Pooling layers&#xff09;1.10 卷 积 神 经 网 络 示 例 &#xff08; …

ChatTTS容器构建教程

一、模型介绍 ChatTTS 是专门为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务。它支持英文和中文两种语言。最大的模型使用了 10 万小时以上的中英文数据进行训练。在 HuggingFace 中开源的版本为 4 万小时训练且未 SFT 的版本。 ChatTTS WebUI如下&#x…

SprinBoot+Vue二手回收微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…