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

news2024/9/23 23:33:19

【成图】

【代码】

<!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.coloradmin.cn/o/2105421.html

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

相关文章

Mysql基础练习题 1378.使用唯一标识符替换员工ID (力扣)

1378. 展示每位用户的 唯一标识码&#xff08;unique ID &#xff09;&#xff1b;如果某位员工没有唯一标识码&#xff0c;使用 null 填充即可。 你可以以任意顺序返回结果表。 题目链接&#xff1a; https://leetcode.cn/problems/replace-employee-id-with-the-unique-i…

k8s调度、污点、容忍、不可调度、排水、数据卷挂载

一、Kubernetes的list-watch机制 1、List-watch K8S集群中&#xff0c;通过List-watch机制进行每个组件的协作&#xff0c;保持数据同步。这种设计可以实现每个组件之间的解耦 kubectl配置文件&#xff0c;统一向集群内部apiserver发送命令——通过apiserver把命令发送到各个…

C# 不安全代码

当一个代码块使用 unsafe 修饰符标记时&#xff0c;C# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。 指针变量 指针 是值为另一个变量的地址的变量&#xff0c;即&#xff0c;内存位置的直接地址。就像其他变量或常量&#xff0c;您必须在…

【系统架构设计师-2022年】综合知识-答案及详解

文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6~7题】【第8题】【第9题】【第10题】【第11~12题】【第13题】【第14题】【第15题】【第16题】【第17~18题】【第19题】【第20题】【第21题】【第22题】【第23题】【第24题】【第25题】【第26题】【第27题】【第28题…

力扣刷题(复习版2)

题目&#xff1a; 计数质数 原题链接&#xff1a; 计数质数 题解 public int countPrimes(int n) {if (n < 2) return 0;// boolean 数组&#xff0c;初始时假设所有数都是质数boolean[] isPrime new boolean[n];Arrays.fill(isPrime, true); // 全部初始化为true// 从 …

网页版修改本地数据器:重新布局,引入 highlight.js高亮显示代码

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>修改数据器</title><!-- 引入 highlight.js 的 CSS 文件 --><link rel"stylesheet" href"https://cdnjs.cloudflare.…

Tauri应用开发实践指南(4)— Tauri 原生能力

本文首发于微信公众号&#xff1a;前端徐徐。欢迎关注&#xff0c;获取更多前端技能分享。 原生能力简介 Tauri 是一个用于构建安全的小型桌面应用程序的框架,它结合了 Web 前端和系统后端技术。Tauri 提供了一些原生能力,让您的 Web 应用程序能够访问本地系统资源和 API,主要…

聚焦新能源未来,望繁信科技邀您共赴CNDS 2024中国新能源产业数智峰会

在全球能源转型的关键时刻&#xff0c;新能源产业正以迅猛的速度向前发展&#xff0c;而数字化技术则为这一产业注入了前所未有的动力。为进一步推动新能源产业与数字化的深度融合&#xff0c;CNDS 2024中国新能源产业数智峰会即将于2024年9月13日在北京盛大举行。作为大数据流…

节日庆典中的白酒文化,传承与创新并存

在中华五千年的文明长河中&#xff0c;白酒文化如同一颗璀璨的明珠&#xff0c;熠熠生辉。它既是历史的见证者&#xff0c;也是文化的传承者。在节日庆典的喜庆氛围中&#xff0c;白酒更是不可或缺的元素&#xff0c;其背后蕴藏着深厚的文化底蕴和时代价值。豪迈白酒&#xff0…

The Llama 3 Herd of Models【论文原文下载】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 The Llama 3 Herd of Models【论文原文】 点击下载&#xff1a;原文下载链接 摘要 现代人工智能&#xff08;AI&#xff09;系统由基础模型驱动。本文介绍了一组新的基础模型&#xff0c;称为 Llama 3。它是…

Anaconda最新安装教程

1 概述 1 介绍 Anaconda是一个专注于数据分析的Python发行版本&#xff0c;它为科学计算和数据科学领域提供了强大的支持。Anaconda是一个开源的Python发行版&#xff0c;包含了conda、Python以及超过190个科学包及其依赖项。这些包涵盖了数据分析、机器学习、深度学习等多个…

突破视觉理解极限,Qwen2-VL重磅登场

前沿科技速递&#x1f680; 经过近一年的持续努力&#xff0c;Qwen团队宣布推出最新一代的视觉语言模型&#xff1a;Qwen2-VL。基于Qwen2的基础&#xff0c;Qwen2-VL在多个方面实现了显著提升&#xff0c;相较于前代模型Qwen-VL&#xff0c;它具备以下核心优势&#xff1a; 1. …

24/9/3算法笔记 kaggle泰坦尼克

题目&#xff1a; 这次我用两种算法做了这道题 逻辑回归二分类算法 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metr…

信息打点day.06

一、知识点 1、黑盒测试 黑盒测试是一种评估网络安全性的方法&#xff0c;它模拟了攻击者在不了解系统内部结构和工作机制的情况下&#xff0c;仅通过外部接口&#xff08;如网络协议、应用程序界面等&#xff09;尝试渗透、攻击或绕过安全控制的行为。通过模拟真实的攻击场景…

心觉:如何填平想象和愿望之间的鸿沟?

愿望是什么&#xff1f; 你想变得富有 你想减掉20斤 你想拥有自己的Dream Car 你想拥有S型身材 这些都是愿望&#xff0c;非常美好的想法或者目标 想象是什么&#xff1f; 我能变得富有吗&#xff0c;我啥也不会&#xff0c;除了上班&#xff0c;就是上班 我怎么可能减肥…

多少次幂的计算器,指数计算器

https://miniwebtool.com/zh-cn/exponents-calculator/?n10.95&n2100&prec10

智慧平台赋能政务管理,声通科技助力政务管理智能化

在智能时代的大潮中&#xff0c;政务管理也在不断寻求创新与突破&#xff0c;在这方面&#xff0c;涌现出了很多优秀的公司。比如声通科技的子公司西安金讯数智信息技术有限公司&#xff0c;就在AI政务热线领域有很多创新成果&#xff0c;为政务管理的智能化升级提供了新思路。…

一文教你学会java代码审计

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

如何借助前端表格控件实现债券网下发行数字化?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 概要 作为金融市场中至关重要的一环&#xff0c;债券行业扮演着融资、投资、风险管理等多重角色&#xff0c;对经济的发展和稳定起着举足轻重的作用。随着证券行业全面实施注册制的推进…

硬件工程师笔试面试——上拉电阻、下拉电阻

目录 1.3、上拉电阻 原理图 1.3.1、定义 1.3.2、作用 1.3.3、工作原理 1.3.4、选择上拉电阻的值 1.3.5、应用场景 1.3.6、与下拉电阻的区别 1.3.7、设计考虑 1.3.8电路设计中的注意事项 1.3.9、与ESD保护的结合 1.3.10、实际应用 1.3.11、上拉电阻在不同电压等级的…