原理说明

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

示例效果图图如下

具体实现代码如下

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. python 备忘录

    1. python 变量 区分大小写 2. 字符串可以用   'X'  "X"  '''X'''  """X""" 3. ...

  2. ruby传参之引用类型

    ruby是完全面向对象语言,所有的变量所储存的,其实是对象的引用. 所以ruby方法的参数,也都是引用类型.即使是基本的类型,比如布尔,整数,小数等,也是一样. class MyObject attr ...

  3. [UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画

    1. UWP中的其它裁剪方案 之前在 这篇文章 里,我介绍了如何使用UIElement.Clip裁剪UIElement的内容,使用代码如下: <Canvas> <Image Sour ...

  4. [TimLinux] Python 装饰器

    1. 装饰器 一种语法格式,用于替换另外一个编码风格,一种语法糖,通过语法结构明确标识出这样一种语法. 自动在被装饰对象尾部执行代码(不使用装饰器语法时,需要明确写明的代码) 被装饰对象可以为函数.类 ...

  5. 2018HDU多校训练-3-Problem D. Euler Function

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 Problem Description In number theory, Euler's toti ...

  6. HDU3191-How many paths are there(次短路的长度及其个数)

    oooccc1 is a Software Engineer who has to ride to the work place every Monday through Friday. For a ...

  7. Java并发编程系列-(4) 显式锁与AQS

    4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...

  8. 【CSS】357- 坚定地使用 CSS Custom Properties

    自定义属性(Custom Properties)是一个很有魅力的 CSS 新特性,现代浏览器广泛 支持.但是遇到那些不支持 CSS Custom Properties 的老掉牙浏览器我们该怎么办?等着 ...

  9. kubernetes-单机实验(入门)

    一.安装kubernetes   实验环境: centos7.0(建议使用7.5版本) 实验机器IP:192.168.1.4 安装方式:yum安装 需求环境:Tomcat+Mysql   1:关闭防火 ...

  10. 【Maven】使用学习

    Maven使用 Maven Jar 搜索:https://mvnrepository.com/ Maven 国内镜像库 <mirror> <id>nexus-aliyun< ...