【Canvas与艺术】绘制金色八卦图

【关键点】

等比例缩放各部件及将八卦转为“二进制”的过程。

【成图】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>使用HTML5/Canvas绘制八卦阵</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){//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);// 清屏    // 黑底ctx.fillStyle="black";ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);writeText(ctx,WIDTH/2-30,HEIGHT/2-6,"逆火原创","8px consolas","white");// 版权}// 画前景this.paintFg=function(ctx){const r=48;// 左边黑鱼,注意要首尾连续      ctx.beginPath();ctx.arc(0,-r,r,Math.PI*0.5,Math.PI*1.5,true);// 顺时针ctx.arc(0,0,2*r,Math.PI*1.5,Math.PI*0.5,true);   // 顺时针ctx.arc(0,r,r,Math.PI*0.5,Math.PI*1.5,false);// 逆时针ctx.closePath();ctx.fillStyle="rgb(255,215,0)";ctx.fill();// 黑鱼白眼    ctx.beginPath();        ctx.arc(0,-r,r/4,0,Math.PI*2,true);ctx.closePath();ctx.fillStyle="white";ctx.fill();// 右边白鱼,注意要首尾连续      ctx.beginPath();ctx.arc(0,0,2*r,Math.PI*1.5,Math.PI*0.5,false);  // 逆时针ctx.arc(0,-r,r,Math.PI*0.5,Math.PI*1.5,true);// 顺时针        ctx.arc(0,r,r,Math.PI*0.5,Math.PI*1.5,false);// 逆时针ctx.closePath();ctx.fillStyle="white";ctx.fill();// 白鱼黑眼    ctx.beginPath();        ctx.arc(0,r,r/4,0,Math.PI*2,true);ctx.closePath();ctx.fillStyle="rgb(255,215,0)";ctx.fill(); // 金圈ctx.beginPath();        ctx.arc(0,0,2*r+4,0,Math.PI*2,false);ctx.closePath();ctx.lineWidth=1;ctx.strokeStyle="rgb(255,215,0)";ctx.stroke(); // 绘制卦象var arr=["212","221","222","122","121","112","111","211",]for(var i=0;i<8;i++){var theta=i*Math.PI/4;var R=2*r+10;var x=R*Math.cos(theta);var y=R*Math.sin(theta);ctx.save();ctx.translate(x,y);ctx.rotate(theta+Math.PI/2);drawGua(ctx,arr[i])ctx.restore();}// 绘制卦象对应的文字var arr=["坎","艮","坤","震","离","兑","乾","巽",]for(var i=0;i<8;i++){var theta=i*Math.PI/4;var R=2*r+100;var x=R*Math.cos(theta);var y=R*Math.sin(theta);ctx.save();ctx.translate(x,y);ctx.rotate(theta-Math.PI/2);writeText(ctx,0,0,arr[i],"30px consolas","rgb(255,215,0)");ctx.restore();}}
}/*----------------------------------------------------------
函数:绘制卦象
ctx:绘图环境
txt:文本,是1和2的三位组合
----------------------------------------------------------*/
function drawGua(ctx,txt){var arr=txt.split("");const ratio=4;for(var i=0;i<arr.length;i++){var letter=arr[i];if(letter=="1"){ctx.fillStyle="rgb(255,215,0)";ctx.fillRect(-4*ratio,-16-i*3*ratio,8*ratio,2*ratio);}else{ctx.fillStyle="rgb(255,215,0)";ctx.fillRect(-4*ratio,-16-i*3*ratio,3*ratio,2*ratio);ctx.fillStyle="rgb(255,215,0)";ctx.fillRect(1*ratio,-16-i*3*ratio,3*ratio,2*ratio);}}
}/*----------------------------------------------------------
函数:创建一个二维坐标点
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://xiahunao.cn/news/2979512.html

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

相关文章

Java进阶-泛型深入理解

概述 泛型是JDK5中引入的新特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查格式&#xff1a;<数据类型>&#xff1b;泛型只支持引用数据类型集合体系的全部接口和实现类都支持泛型的使用 集合详解→http://t.csdnimg.cn/R5zQ5 自定义泛型类 …

Taro + vue3 实现自定义返回栏

算是一个简单的返回页面 <template><div class"wechat-order-detail-container"><navBar v-if"pageTitle" :page-title"pageTitle"></navBar></div> </template> <script setup> import { ref } fro…

B008-方法参数传递可变参数工具类

目录 方法参数传递可变参数冒泡排序Arrays工具类Arrays工具类常用方法 方法参数传递 /*** java中只有值传递* 基本数据类型 传递的是具体的值* 引用数据类型 传递的是地址值*/ public class _01_ParamPass {public static void main(String[] args) {// 调用方法 getSumge…

加州理工华人用AI颠覆数学证明!提速5倍震惊陶哲轩,80%数学步骤全自动化

加州理工团队解决了形式化研究神器Lean运行LLM推理时的核心技术挑战&#xff0c;可以让LLM在Lean中提出证明策略&#xff0c;允许人类以无缝的方式干预和修改。 Lean Copilot&#xff0c;让陶哲轩等众多数学家赞不绝口的这个形式化数学工具&#xff0c;又有超强进化了&#xf…

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

美国站群服务器如何提升网站SEO排名和用户体验?

美国站群服务器如何提升网站SEO排名和用户体验? 在数字化时代&#xff0c;网站的成功与否不仅取决于内容质量&#xff0c;还受到搜索引擎排名和用户体验的影响。为了在竞争激烈的网络世界中脱颖而出&#xff0c;许多企业转向了美国站群服务器&#xff0c;以提升其网站的SEO排…

机器学习:考试复习提纲

该页仅为复习资料&#xff0c;内含博客链接均通过搜索得到。 当然直接访问我的GitHub博客会更方便。 1. 线性回归 Linear Regression https://www.cnblogs.com/geo-will/p/10468253.html 要求1&#xff1a;可以按照自己的理解简述线性回归问题。 回归分析是一种预测性的建模…

VsCode一直连接不上 timed out

前言 前段时间用VsCode连接远程服务器&#xff0c;正常操作后总是连接不上&#xff0c;折磨了半个多小时&#xff0c;后面才知道原来是服务器设置的问题&#xff0c;故记录一下&#xff0c;防止后面的小伙伴也踩坑。 我使用的是阿里云服务器&#xff0c;如果是使用其他平台服务…

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之一(智能报表)

概述 在企业数字化转型的过程中&#xff0c;ERP系统与数据平台作为核心支撑工具&#xff0c;对于提升运营效率、优化决策支持、实现业务流程一体化起着至关重要的作用。然而&#xff0c;智能报表与报表的智能化合并作为其中的重要领域&#xff0c;却往往面临诸多挑战与难点&am…

Etsy多账号关联怎么办?Etsy店铺防关联解决方法

Etsy虽然相对于其他跨境电商平台来说比较小众&#xff0c;但因为平台是以卖手工艺品为主的&#xff0c;所以成本较低&#xff0c;利润很高。许多跨境卖家都纷纷入驻&#xff0c;导致平台规则越发严格&#xff0c;操作不当就会封号&#xff0c;比如一个卖家操作多个账号会出现关…

[激光原理与应用-90]:光功率计基本原理

目录 一、光功率计原理 二、光功率计硬件电路 三、光功率计探头 四、接口信号 一、光功率计原理 光功率计是用来测量光功率的仪器&#xff0c;其原理基于光电效应和电信号的检测与处理。 下面是光功率计的基本原理&#xff1a; 光电效应&#xff1a; 光功率计使用光敏元件…

家用洗地机哪款好用?盘点618值得买的洗地机品牌

对于工作忙碌或家里养了宠物的很多朋友来说&#xff0c;洗地机它集合吸尘清扫湿拖的功能&#xff0c;很大程度上解放了家庭清洁劳动的繁琐&#xff0c;让人们腾出更多的时间休息&#xff0c;那么&#xff0c;市场上有很多牌子的洗地机&#xff0c;价格也各不相同&#xff0c;那…

3.8、气泡提示(Popup)

Popup 属性可绑定在组件上显示气泡弹窗提示,设置弹窗内容、交互逻辑和显示状态。主要用于屏幕录制、信息弹出提醒等显示状态。 气泡分为两种类型,一种是系统提供的气泡 PopupOptions,一种是开发者可以自定义的气泡 CustomPopupOptions。其中 PopupOptions 为系统提供的气泡…

玩转React路由,教你根据角色动态生成路由

情景再现&#xff1a;用户登录成功后&#xff0c;我已经获取到了用户的角色&#xff0c;并且根据角色获取到了用户的拥有的权限路由。我想在登录成功后动态的生成路由&#xff0c;来实现不同角色的用户,具备不同的权限&#xff0c;应该怎么实现&#xff1f;可以我考虑以下几种方…

ATFX汇市:欧元区和美国的制造业PMI将发布,市场预期乐观

ATFX汇市&#xff1a;今日16:00&#xff0c;市场研究机构Markit将发布欧元区4月制造业PMI初值&#xff0c;前值为46.1&#xff0c;预期值46.6&#xff0c;预期将增加0.5个百分点。历史数据看&#xff0c;最近三个月&#xff0c;欧元区的制造业PMI均处于较高水平&#xff0c;期间…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本&#xff08;Y4tacker这个师傅的&#xff09; # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

qt;lt;等xml|Html转义字符

在写Android布局文件时&#xff0c;左右尖括号<>&#xff0c;括号在XML中没办法直接使用&#xff0c;需要进行转义&#xff0c;收集一些转义符&#xff0c;以便查询使用。 常用表&#xff1a; **对于文章出现的任何问题请大家批评指出&#xff0c;一定及时修改 **可联系…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统&#xff0c;目前已在多家三级级医院应用&#xff0c;并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…