canvas绘制中国国旗!

news/2024/12/29 22:46:21/

绘制中国国旗

1、题目

今天刚学了H5中的画布canvas元素,课堂上的案例挺有意思,就心血来潮想利用canvas绘制中国国旗;

2、思路

  1. 第一步,创建画布元素,在画布内作好辅助线和网格线来确定圆的位置;
  2. 第二步,作好网格线后,我们先定好大圆的坐标和小圆的坐标;
  3. 第三步,绘制出一个大圆和四个小圆;
  4. 第四步,在大圆内绘制出五角星,和在第一个小圆内画出五角星,旋转画布为固定的弧度值绘制出其他三个小五角星,并且将大五角星和四个小五角星的元素填充至黄色(外边轮廓默认为黑色);
  5. 第五步,五星红旗绘制完毕,取消辅助线渲染至页面;

3、效果展示图

(过程图)

在这里插入图片描述
(展示图)
在这里插入图片描述

4、写法

绘制辅助线和网格

  1. 将页面红色区域分为四个部分,做一条横向和竖向辅助线,将第二象限的区域绘制网格;
  2. 有了网格可以确定五角星的位置,我们将大五角星的坐标用网格坐标表示出来,同样的将四个小五角星的坐标用网格坐标表示出来,将小五角星的坐标用数组存起来;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

绘制大圆和小圆

  1. 利用大五角星的网格坐标*画布高度,绘制路径将大圆绘制在画布中;
  2. 利用小五角星的网格坐标*画布高度,绘制路径将小圆绘制在画布中;
    在这里插入图片描述

绘制大五角星和四个小五角星

  1. 在大圆中确定圆心作为原点,在大圆上绘制出五个顶点,绘制路径将其连接起来,填充五角星;
  2. 在小圆中确定圆心作为原点,在小圆上绘制出五个顶点,绘制路径将其连接起来,填充五角星;
    在这里插入图片描述

封装绘制五角星函数

  1. 创建一个五角星形状. 该五角星的中心坐标为(sx,sy),中心到顶点的距离radius,rotate=0时一个顶点在对称轴上 ; rotate:绕对称轴旋转rotate弧度
  2. 计算五角星在圆内部的顶点的角度,在循环中绘制出五角星的五条边,将顶点依次连接起来;
  3. 旋转画布,创建出剩余的五角星;
    在这里插入图片描述

5、参考代码块

<!DOCTYPE HTML><html><head><meta charset="UTF-8"><title></title></head><body><canvas id="canvas" width="600" height="400"></canvas><script type="text/javascript">// 使用HTML5绘制五星红旗   var canvas = document.getElementById("canvas");   var context = canvas.getContext('2d');   var width = canvas.width;  //确定画布的宽度(600)var height = width * 2 / 3;  //确定画布的高度 (400)var w = width / 30;//小网格的宽   (20)context.fillStyle = "red";   context.fillRect(0, 0, width, height);   var maxR = 0.15, minR = 0.05;//大五角星的半径,小五角星的半径var maxX = 0.25, maxY = 0.25;//大五星的位置   // 小五角星的位置var minX = [0.50, 0.60, 0.60, 0.50];   var minY = [0.10, 0.20, 0.35, 0.45];   // 画大 ☆   var ox = height * maxX, oy = height * maxY;   create5star(context, ox, oy, height * maxR, "#ff0", 0);//绘制五角星   // 画小 ★   for (var idx = 0; idx < 4; idx++) {   var sx = minX[idx] * height, sy = minY[idx] * height;  // 计算大五角星圆心和小五角星圆心连线的斜率(也就是画布旋转的弧度值)var theta = Math.atan((oy - sy) / (ox - sx));   create5star(context, sx, sy, height * minR, "#ff0", -Math.PI / 2 + theta);   }   //辅助线   // context.moveTo(0, height / 2)   // context.lineTo(width, height / 2);   // context.stroke();   // context.moveTo(width / 2, 0);   // context.lineTo(width / 2, height);   // context.stroke();   //画网格,竖线   // for (var j = 0; j < 15; j++) {   //     context.moveTo(j * w, 0);   //     context.lineTo(j * w, height / 2);   //     context.stroke();   // }   //画网格,横线   // for (var j = 0; j < 10; j++) {   //     context.moveTo(0, j * w);   //     context.lineTo(width / 2, j * w);   //     context.stroke();   // }   //画大圆   // context.beginPath();   // context.arc(ox, oy, maxR * height, 0, Math.PI * 2, false);   // context.closePath();   // context.stroke();   // 画小圆   // for (var idx = 0; idx < 4; idx++) {   //     context.beginPath();   //     var sx = minX[idx] * height, sy = minY[idx] * height;   //     context.arc(sx, sy, height * minR, 0, Math.PI * 2, false);   //     context.closePath();   //     context.stroke();   // }   //大圆中心与小圆中心连接线   // for (var idx = 0; idx < 4; idx++) {   //     context.moveTo(ox, oy);   //     var sx = minX[idx] * height, sy = minY[idx] * height;   //     context.lineTo(sx, sy);   //     context.stroke();   // }   //绘制五角星   /**   * 创建一个五角星形状. 该五角星的中心坐标为(sx,sy),中心到顶点的距离为radius,rotate=0时一个顶点在对称轴上   * rotate:绕对称轴旋转rotate弧度   */   function create5star(context, sx, sy, radius, color, rotato){   context.save();   context.fillStyle = color;   context.translate(sx, sy);//移动坐标原点   context.rotate(Math.PI + rotato);//旋转   context.beginPath();//创建路径   var x = Math.sin(0);   var y = Math.cos(0);   var dig = Math.PI / 5 * 4;   for (var i = 0; i < 5; i++) {//画五角星的五条边   var x = Math.sin(i * dig);   var y = Math.cos(i * dig);   context.lineTo(x * radius, y * radius);   }   context.closePath();   context.stroke();   context.fill();   context.restore();   }   </script></body></html>

6、总结

绘制五星红旗,样式其实蛮简单,主要是五星红旗的五角星很难想到如何绘制,以及计算角度很麻烦,如果克服了这些就没有什么难度了。


http://www.ppmy.cn/news/404198.html

相关文章

加密与解密 调试篇 动态调试技术 (五)-WinDbg

windbg主要厉害的地方是在他可以对内核调试 并且本身微软的产品 对windows调试适配度够高 注意 windbg给出的图形操作并不好用 主要是使用命令行来进行操作 我们省略安装 直接进入调试 file 可以打开软件 可以附加也可以分析dump文件还可以进行内核和 远程调试内核调试分为…

第十四届蓝桥杯大赛软件赛CB国赛-填空题(题目解析+完整代码)

前言 考完蓝桥杯了以后一直在咕咕咕, 所以题解直到现在才写出来&#xff08;&#xff09; 欢迎访问我的个人博客&#xff01; 第一题 题目描述 小蓝在黑板上连续写下从 1 到 2023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S 12345678910111213 . . . …

MEGA这个网盘你可以拥有,超级良心

MEGA 官网链接&#xff1a;https://mega.nz 这个网盘的特色 1.不会限速2.国内可用&#xff08;即使不会翻墙&#xff09;3.网盘云端加密&#xff0c;资源不会被封杀。4.官方还提供了Linux客户端 之后就会弹出mega的界面。界面看上去非常友好。接下来我们创建一个账号开始登陆…

访问mega网盘 的方法

目前默认状态下Mega是被和(%$)谐的。所以解决的思路是修改hosts文件。 1. hosts 文件的位置&#xff1a; Windows的位置为&#xff1a; C:\Windows\System32\drivers\etc\hostsLinux的位置为 /ect/hosts 2. 修改方法&#xff1a;首先打开hosts文件, windows下&#xff0c;将…

Samsung/三星Galaxy Mega 5.8(I9158/移动版) root教程_方法

Samsung/三星Galaxy Mega 5.8&#xff08;I9158/移动版&#xff09;的root教程在这里整理了一下&#xff0c;之前有机友说自己的手机想删除系统自带的一些无用软件&#xff0c;可是怎么也删除不了&#xff0c;所以需要先进行root才可以删除&#xff0c;不然的话是 删除不了的&a…

介绍一个好用的网盘MEGA

前言&#xff1a;偶然发现一个不错的网盘mega.nz&#xff0c;因为百度和360网盘老删我的小片片。。。 MEGA网盘有免费50G存储&#xff0c;客户端&#xff08;Windows,Linux和Chrome插件都有&#xff09;可以自动备份你所指定的文件夹&#xff0c;对咱们来说重要的就是自己写的程…

如何使用Mega cc

如何使用Mega cc Table of Contents 1 github地址&#xff1a;2 下载3 使用 3.1 安装3.2 输入文件3.3 输出文件3.4 运行MEGA-CC3.5 MEGA-Proto (分析模版)3.6 Demo1&#xff1a;实例13.7 Demo2: 实例23.8 自我实例 4 mao 文件简单解析5 在Linux下如何使用 1 github地址&#xf…

Mega的简单使用

Table of Contents 1 Mega画树的简单应用2 fas格式文件的准备3 用生成的.meg画树4 生出树的处理 4.1 修改内容&#xff0c;添加标注4.2 导出4.3 后面随着学习的进行继续修改&#xff0c;增加。 1 Mega画树的简单应用 2 fas格式文件的准备 首先我们要准备的就是fas的需要进行画…