基于canvas线条绘制图形
原理说明
绘制一个正方形,正放心每条边等比例均分,具体分配多少根据自身情况而定,按照最上边边顺时针方向依次绘制线条,相邻两条边上的点依次连接,知道所有的点全部连接完便绘制完成。
示例效果图图如下

具体实现代码如下
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var range = 130;
var region = 4;
var lineColor = '#0de4cd';
var lineColor2 = '#7aea94';
var centerX = 0;
var centerY = 0;
var pointArray = [];
draw();
function draw() {
var width = $('body').innerWidth();
var height = $('body').innerHeight();
ctx.clearRect(0,0,width,height);
pointArray = [];
centerX = width / 2;
centerY = height / 2;
canvas.width = width;
canvas.height = height;
getPoint();
drawRect();
drawLine();
}
function drawRect () {
var rectSize = range * region;
var linearGradient= ctx.createLinearGradient(centerX - rectSize / 2,centerY - rectSize / 2,rectSize,rectSize);
linearGradient.addColorStop(0,lineColor)
linearGradient.addColorStop(1,lineColor2)
//添加渐变颜色
ctx.strokeStyle=linearGradient;
ctx.beginPath();
ctx.moveTo(centerX - rectSize / 2,centerY - rectSize / 2);
ctx.lineTo(centerX + rectSize / 2,centerY - rectSize / 2);
ctx.lineTo(centerX + rectSize / 2,centerY + rectSize / 2);
ctx.lineTo(centerX - rectSize / 2,centerY + rectSize / 2);
ctx.closePath();
ctx.stroke();
}
function getPoint () {
var rectSize = range * region;
for (var i = 0; i < 4; i ++) {
for (var j = 0; j < range; j ++) {
if (i == 0) {
_pointArray.push({x:centerX - rectSize / 2 + region * j,y:centerY - rectSize / 2});
}
if (i == 1) {
_pointArray.push({x:centerX + rectSize / 2,y:centerY - rectSize / 2 + region * j});
}
if (i == 2) {
_pointArray.push({x:centerX + rectSize / 2 - region * j,y:centerY + rectSize / 2});
}
if (i == 3) {
_pointArray.push({x:centerX - rectSize / 2,y:centerY + rectSize / 2 - region * j});
}
}
pointArray.push(_pointArray);
}
console.log(pointArray)
}
function drawLine () {
pointArray.forEach(function (item, index) {
var extraArray = pointArray[index + 1] ? pointArray[index + 1] : pointArray[0];
item.forEach(function (child, childrenIndex) {
ctx.beginPath();
var linearGradient= ctx.createLinearGradient(child.x,child.y,extraArray[childrenIndex].x,extraArray[childrenIndex].y);
linearGradient.addColorStop(0,lineColor)
linearGradient.addColorStop(1,lineColor2)
//添加渐变颜色
ctx.strokeStyle=linearGradient;
//ctx.strokeStyle = lineColor;
ctx.moveTo(child.x,child.y);
ctx.lineTo(extraArray[childrenIndex].x,extraArray[childrenIndex].y);
ctx.stroke();
})
})
}
示例预览地址:canvas线条之美
后话
希望上述讲解能够帮助到读者!!!
基于canvas线条绘制图形的更多相关文章
- 浅谈JavaScript的Canvas(绘制图形)
HTML5中新增加的一个元素canvas,要使用canvas元素,浏览器必须支持html5.通过canvas标签来创建元素,并需要为canvas指定宽度和高度,也就是绘图区域的大小. <canv ...
- HTML5使用Canvas来绘制图形
一.Canvas标签: 1.HTML5<canvas>元素用于图形的绘制,通过脚本(通常是javascript)来完成. 2.<canvas>标签只是图形容器,必须使用脚本来绘 ...
- canvas基本绘制图形
canvas H5新增的元素,提供了强大的图形的绘制,变换,图片,视频的处理等等.需要使用JavaScript脚本操作 浏览器支持 大多数的现代浏览器都可以支持:IE8以下的浏览器不支持 画布 可支持 ...
- html5 canvas 笔记一(基本用法与绘制图形)
<canvas> 元素 <canvas id="tutorial" width="150" height="150"> ...
- html5 Canvas绘制图形入门详解
html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...
- Canvas 2D绘制抗锯齿的1px线条
当绘制1像素的线条时,发现多条线明显存在着粗细不均的问题,线条带有明显的锯齿. 事实上,Canvas的绘制线条指令都存在这个状况,如lineTo,arcTo,strokeRect. 解决方案是将Can ...
- canvas 绘制图形
canvas 绘制图形: 注意: canvas 的宽高设置在行内,否则会使画布(canvas)产生扭曲,绘图变形: <!DOCTYPE html> <html lang=" ...
- canvas高效绘制10万图形,你必须知道的高效绘制技巧
最近的一个客户项目中,简化的需求是绘制按照行列绘制很多个圆圈.需求看起来不难,上手就可以做,写两个for循环. 原始绘制方法 首先定义了很多Circle对象,在遍历循环中调用该对象的draw方法.代码 ...
- 软件项目技术点(7)——在canvas上绘制自定义图形
AxeSlide软件项目梳理 canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...
随机推荐
- PAT(甲级)2019年秋季考试
第一题用搜索,超时了,待补 更新第一题思路 dfs + 剪枝,首先确定 n的最后一位数字肯定是9,为什么呢,因为 任意两个相邻的数肯定互为质数(gcd=1),所以 n 的末尾肯定是9,这样n+1产生的 ...
- 一句话总结flux,以及我们为何需要flux
如果让你用一句话总结一下什么是flux,该怎么说? 官网上有这样的介绍:flux是一种思想,一种框架,是facebook给react... 这样的解释对程序员来说,显得过于抽象又不具体了. 阮老师的文 ...
- 三角形列表前缀.html
发过火刮腹湔肠封官赐爵法规及法规及提供 发过火刮腹湔肠封官赐爵法规及法规及提供 发过火刮腹湔肠封官赐爵法规及法规及提供 发过火刮腹湔肠封官赐爵法规及法规及提供 发过火刮腹湔肠封官赐爵法规及法规及提供 ...
- 一招教你如何修复MySQL slave中继日志损坏问题
[摘要]MySQL的Crash safe slave是指slave crash后,把slave重新拉起来可以继续从Master进行复制,不会出现复制错误也不会出现数据不一致. PS:华为云数据库特惠专 ...
- Python 命令行之旅:深入 click 之增强功能
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 关于Block内部要不要使用weakSelf的几种情况
本文转载自http://www.jianshu.com/p/c6ca540861d9 关于Block内部要不要使用weakSelf的几种情况 我们知道当对block使用不当时会造成循环引用导致内存泄露 ...
- 常用的iOS第三方资源
一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa pod 'ReactiveCocoa', '~> ...
- LightOj-1027 A Dangerous Maze(期望)
You are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. Th ...
- [golang] nats的消息传递模型介绍
目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...
- 【Web技术】399- 浅谈前端代码加密
作者简介:于航,PayPal Senior Software Engineer,在 PayPal 上海负责 Global GRT 平台相关的技术研发工作.曾任职于阿里巴巴.Tapatalk 等企业.f ...