原理说明

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

示例效果图图如下

具体实现代码如下

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线条绘制图形的更多相关文章

  1. 浅谈JavaScript的Canvas(绘制图形)

    HTML5中新增加的一个元素canvas,要使用canvas元素,浏览器必须支持html5.通过canvas标签来创建元素,并需要为canvas指定宽度和高度,也就是绘图区域的大小. <canv ...

  2. HTML5使用Canvas来绘制图形

    一.Canvas标签: 1.HTML5<canvas>元素用于图形的绘制,通过脚本(通常是javascript)来完成. 2.<canvas>标签只是图形容器,必须使用脚本来绘 ...

  3. canvas基本绘制图形

    canvas H5新增的元素,提供了强大的图形的绘制,变换,图片,视频的处理等等.需要使用JavaScript脚本操作 浏览器支持 大多数的现代浏览器都可以支持:IE8以下的浏览器不支持 画布 可支持 ...

  4. html5 canvas 笔记一(基本用法与绘制图形)

    <canvas> 元素 <canvas id="tutorial" width="150" height="150"> ...

  5. html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  6. Canvas 2D绘制抗锯齿的1px线条

    当绘制1像素的线条时,发现多条线明显存在着粗细不均的问题,线条带有明显的锯齿. 事实上,Canvas的绘制线条指令都存在这个状况,如lineTo,arcTo,strokeRect. 解决方案是将Can ...

  7. canvas 绘制图形

    canvas 绘制图形: 注意: canvas 的宽高设置在行内,否则会使画布(canvas)产生扭曲,绘图变形: <!DOCTYPE html> <html lang=" ...

  8. canvas高效绘制10万图形,你必须知道的高效绘制技巧

    最近的一个客户项目中,简化的需求是绘制按照行列绘制很多个圆圈.需求看起来不难,上手就可以做,写两个for循环. 原始绘制方法 首先定义了很多Circle对象,在遍历循环中调用该对象的draw方法.代码 ...

  9. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

随机推荐

  1. mac安装pip

    1.下载get-pip.py curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py SaintKings-Mac-mini ...

  2. IDEA IntelliJ/ DataGrip 修改自动补全快捷键

    系统默认的是Tab键,个人喜欢用空格键作为自动补全键,设置方法如下 Setting-->Keymap-->Editor Actions:Choose Lookup Item Replace ...

  3. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

  4. Flask框架flash消息闪现学习与优化符合闪现之名

    Flask的flash 第一次知道Flask有flash这个功能时,听这名字就觉得高端,消息闪现-是跳刀blink闪烁躲技能的top10操作吗?可结果让我好失望,哪里有什么闪现的效果,不过是平常的消息 ...

  5. 转:URL,URLConnection,HttPURLConnection的使用

    URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象.其对象主要通过URL的openconnection方法获得. 值得注意的是:1.openConnectio ...

  6. IO到NIO的一个转变

    本内容来源:Jack视频讲解和自己的一个理解. 1.故事还得从网络模型或者IO开始聊起 2.你有想过传统IO真正存在的问题吗? 3.如果你是设计者,IO可以怎样改进? 4.NIO原理分析以及代码实现 ...

  7. Windows下利用IIS建立网站并实现局域网共享

    https://blog.csdn.net/qq_41485414/article/details/82754252 https://www.cnblogs.com/linuxprobe-sarah/ ...

  8. luogu P3572 [POI2014]PTA-Little Bird

    题目描述 从1开始,跳到比当前矮的不消耗体力,否则消耗一点体力,每次询问有一个步伐限制,求每次最少耗费多少体力 单调队列优化动态规划 #include<cstdio> #include&l ...

  9. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  10. LNMP架构的搭建

    第9章 LNMP架构的搭建 9.1 什么是LNMP 9.1.1 LNMP的组成 L                linux N                nginx:实现静态的服务处理 M    ...