【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 onload="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){//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);// 合掌纹饰绘制开始const R=100;			 // 最外缘半径var   N=20;				 // 个数ctx.lineWidth=1;const T=R/12;			 // 厚度,外缘到内缘的厚度const PART_T=T/3;		 // 三分之一厚度const ANGLE=Math.PI*2/N; //分度角const PART_ANGLE=ANGLE/8;// 分度角的八分之一for(var i=0;i<N;i++){var theta=Math.PI*2/N*i;var r=R-T;var a=createPt(r*Math.cos(theta),r*Math.sin(theta));var b=createPt(r*Math.cos(theta+PART_ANGLE),r*Math.sin(theta+PART_ANGLE));r=T;var angle=theta+PART_ANGLE;var c=createPt(b.x+r*Math.cos(angle),b.y+r*Math.sin(angle));r=R;var d=createPt(r*Math.cos(theta+4*PART_ANGLE),r*Math.sin(theta+4*PART_ANGLE));angle=theta+4*PART_ANGLE+Math.PI;r=2*PART_T;var e=createPt(d.x+r*Math.cos(angle),d.y+r*Math.sin(angle));angle=theta+3*PART_ANGLE;r=R-2*PART_T;var f=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+3*PART_ANGLE;r=R-1*PART_T;var g=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+2*PART_ANGLE;r=R-1*PART_T;var h=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+2*PART_ANGLE;r=R-T;var j=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+7*PART_ANGLE;r=R-T;var k=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+7*PART_ANGLE;r=R-1*PART_T;var l=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+6*PART_ANGLE;r=R-1*PART_T;var m=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+6*PART_ANGLE;r=R-2*PART_T;var n=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+5*PART_ANGLE;r=R-2*PART_T;var o=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+5*PART_ANGLE;r=R;var p=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+8*PART_ANGLE;r=R;var q=createPt(r*Math.cos(angle),r*Math.sin(angle));angle=theta+8*PART_ANGLE;r=R-T;var s=createPt(r*Math.cos(angle),r*Math.sin(angle));ctx.strokeStyle="red";ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.arc(0,0,R-T,theta,theta+PART_ANGLE,false);ctx.lineTo(b.x,b.y);ctx.lineTo(c.x,c.y);ctx.arc(0,0,R,theta+PART_ANGLE,theta+4*PART_ANGLE,false);ctx.lineTo(d.x,d.y);ctx.lineTo(e.x,e.y);ctx.arc(0,0,R-2*PART_T,theta+4*PART_ANGLE,theta+3*PART_ANGLE,true);ctx.lineTo(f.x,f.y);ctx.lineTo(g.x,g.y);ctx.arc(0,0,R-1*PART_T,theta+3*PART_ANGLE,theta+2*PART_ANGLE,true);ctx.lineTo(h.x,h.y);ctx.lineTo(j.x,j.y);ctx.arc(0,0,R-T,theta+2*PART_ANGLE,theta+7*PART_ANGLE,false);ctx.lineTo(k.x,k.y);ctx.lineTo(l.x,l.y);ctx.arc(0,0,R-1*PART_T,theta+7*PART_ANGLE,theta+6*PART_ANGLE,true);ctx.lineTo(m.x,m.y);ctx.lineTo(n.x,n.y);ctx.arc(0,0,R-2*PART_T,theta+6*PART_ANGLE,theta+5*PART_ANGLE,true);ctx.lineTo(o.x,o.y);ctx.lineTo(p.x,p.y);ctx.arc(0,0,R,theta+5*PART_ANGLE,theta+8*PART_ANGLE,false);ctx.lineTo(q.x,q.y);ctx.lineTo(s.x,s.y);ctx.stroke();}// 小六边形N=6;var r1=1.3*R;ctx.strokeStyle="red";ctx.lineWidth=4;ctx.beginPath();			for(var i=0;i<N;i++){var theta=Math.PI*2/N*i;var r=r1;var a=createPt(r*Math.cos(theta),r*Math.sin(theta));ctx.lineTo(a.x,a.y);}ctx.closePath();ctx.stroke();// 大六边形N=6;var r1=1.4*R;ctx.strokeStyle="red";ctx.lineWidth=6;ctx.beginPath();			for(var i=0;i<N;i++){var theta=Math.PI*2/N*i;var r=r1;var a=createPt(r*Math.cos(theta),r*Math.sin(theta));ctx.lineTo(a.x,a.y);}ctx.closePath();ctx.stroke();writeText(ctx,WIDTH/2-30,HEIGHT/2-5,"逆火原创","8px consolas","lightgrey");// 版权}
}/*----------------------------------------------------------
函数:创建一个二维坐标点
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.rhkb.cn/news/407081.html

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

相关文章

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总&#xff08;直接复制代码&#xff0c;注意js引入路径&#xff09; 原生js用Expo…

Linux驱动入门实验班——DHT11、DS18B20模块驱动(附百问网视频链接)

目录 前言 一、DHT11模块 1.通信协议 2.数据格式 3.编程思路 ①入口函数 ②实现read函数 ③编写中断处理函数 ④***编写数据解析函数 ⑤应用程序 二、DS18B20模块 1. 通信时序 ① 初始化时序 ② 写时序 ③ 读时序 2. 常用命令 3. 编程思路 1.启动温度转换 2…

PPT分享:埃森哲-流程制造的智能工厂规划设计

在分享PPT之前&#xff0c;笔者与大家一起熟悉下&#xff0c;流程制造是什么&#xff0c;与离散制造有哪些区别。 往期回顾>> 125页PPT&#xff1a;某行业数据架构蓝图规划方案 170页PPT&#xff1a;制造业采购供应链及财务管控业务流程蓝图规划 60页PPT:集团SRM项目业…

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务&#xff0c;在约定的特定时刻去执行任务的过程 如以下应用场景&#xff1a; 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

【图文并茂】ant design pro 如何对接后端个人信息接口

上一节我们有讲到如何对接登录接口的 【图文并茂】ant design pro 如何对接登录接口 仅仅能登录是最基本的&#xff0c;但是我们要进入后台还是需要另一个接口。 这个接口有两个作用&#xff1a; 来获取当前登录账号的信息&#xff0c;比如头像&#xff0c;用户名&#xff0…

大脑可视化:多种方式实现fMRI的ROI的绘图

前言 在探索神经科学的深邃领域中&#xff0c;我们常常面临着如何将复杂的脑区数据以一种清晰、直观的方式呈现给同行和公众的挑战。随着功能性磁共振成像&#xff08;fMRI&#xff09;技术的发展&#xff0c;我们拥有了更多工具来揭示大脑的奥秘。本文旨在介绍一系列笔者学习的…

深度学习从入门到精通——大模型认知理解

大模型认知 1. 传统区别与实际运用 1.1 小模型时代工作方式 小模型&#xff08;如视觉模型、语义模型、语音模型、决策/规划模型&#xff09;和大模型&#xff08;如GPT、BERT等大型预训练模型&#xff09;的工作方式和特点存在一些关键区别。 视觉模型 工作方式: 视觉模型…

鸿蒙崛起,前端/Java人才如何搭上这趟技术快车?

在科技飞速发展的今天&#xff0c;鸿蒙系统的崛起犹如一颗璀璨的新星&#xff0c;照亮了技术领域的新航道。对于前端和 Java 人才来说&#xff0c;这不仅仅是一个新的挑战&#xff0c;更是一次搭乘技术快车、实现职业飞跃的绝佳机遇。 一、鸿蒙崛起之势 鸿蒙系统自诞生以来&…

C++相关概念和易错语法(28)(可变模板参数、编译时和运行时逻辑、emplace_back)

1.可变模板参数 在C语言中我们学习的第一个函数就是printf&#xff0c;这个函数有一个特点&#xff0c;即支持任意个参数&#xff0c;即可变参数。C中引入了可变模板参数&#xff0c;我们可以在C中利用模板函数实现像printf那样的功能。但众所周知C语言是没有模板函数的&#…

三种方法加密图纸!2024如何对CAD图纸进行加密?分享给你

“机事不密则害成&#xff0c;是以君子慎密而不出也。” 此言道出了保密的重要性&#xff0c;尤其是在今日数字化时代&#xff0c;图纸作为设计领域的核心资料&#xff0c;其安全性更是至关重要。 CAD图纸作为设计行业的基石&#xff0c;不仅承载着设计师的心血与智慧&#x…

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…

IT圈前端已死,后端快亡?这个职业却越来越缺人

前言 不知道何时&#xff0c;“前端已死&#xff0c;后端快完”的论调便充斥着整个互联网圈子&#xff0c;掘金&#xff0c;知乎&#xff0c;B站&#xff0c;牛客&#xff0c;脉脉…… 前端是什么&#xff1f; 前端通常指的是Web开发中与用户交互的部分&#xff0c;也称为客…

MyBatis核心机制

实现MyBatis核心机制环境搭建 1.核心框架示意图 2.模块搭建 1.创建maven项目 2.引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSc…

CoppeliaSim(V-Rep)与ROS1、ROS2接口变迁-2024-

Webots&#xff1a;Webots与ROS1、ROS2接口变迁 Gazebo&#xff1a;Gazebo与ROS1、ROS2接口变迁 ROS1 2016&#xff1a;ROS_Kinetic_18 使用V-Rep3.3.1和Matlab2015b&#xff08;vrep_ros_bridge&#xff09;续 vrep_ros_bridge 插件 一、项目背景与目标 vrep_ros_bridge 是…

Linux系统之jobs命令的基本使用

Linux系统之jobs命令的基本使用 一、jobs命令介绍二、jobs命令的使用帮助2.1 jobs命令的help帮助信息2.2 jobs命令的语法解释 三、jobs命令的基本使用3.1 运行一个后台任务3.2 列出后台所有的作业3.3 列出进程ID3.4 只列出进程ID3.5 终止后台任务3.6 只显示运行任务3.7 只显示停…

设备状态图表-甘特图

1.背景&#xff1a;设备状态监控图表&#xff0c;监控不同状态的时间段&#xff0c;可以使用甘特图来展示效果 鼠标经过时的数据提示框 2、代码实现 <template><divref"ganttChartRefs":style"{ height: 6.2rem, width: 100% }"class"bg…

视频项目开发,EasyCVR视频融合平台为何成为关键驱动力

智慧类视频项目是基于多个系统融合&#xff0c;旨在实现更广泛联动功能&#xff0c;以满足智能化应用需求为基石的信息化项目。当前&#xff0c;智慧社区、智慧园区、智慧工厂乃至智慧城市等应用场景的需求日益增长。这些智慧项目的整合进程中&#xff0c;视频融合能力扮演着不…

burpsuite xssValidator插件(xss插件)

安装 1. 商城安装插件 2. 安装环境 Download PhantomJShttps://phantomjs.org/download.htmlGitHub - NetSPI/xssValidator: This is a burp intruder extender that is designed for automation and validation of XSS

房价下跌的大环境下,我的佣金为何能逆市增长?

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2199.html &#x1f3e0;&#x1f4b0;最近房地产市场可不太景气&#xff0c;房价跌跌不休&#xff0c;咱们中介们的佣金收入也受到了影响。你知道那种心情吗&#xff1f…

【IoTDB 线上小课 06】列式写入=时序数据写入性能“利器”?

【IoTDB 视频小课】更新来啦&#xff01;今天已经是第六期了~ 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 列式写入到底是&#xff1f; 上一期我们详细了解了…