一、html部分

<div><el-row><el-col :span="3"><div class="toolbar"><div ><el-button type="primary" size="mini" icon="el-icon-plus" @click="add">添加</el-button><el-button type="primary" size="mini" icon="el-icon-view" @click="addExhibition">展示</el-button></div></div></el-col><el-col :span="20"><div class="canvas-box" style="width: 1276px; height: 718px;"><canvas id="mapcvs" width="1276" height="718"></canvas><canvas id="cvs" width="1276" height="718"></canvas></div></el-col></el-row></div>

二、js部分

1、增加
add() {flag = false //防止重复clicksNum++ //当前第一几条数据points[clicksNum] = {point:[],color:this.color16()} //随机颜色cvs.addEventListener('mousedown', this.mousedownHandler, false)cvs.addEventListener('dblclick', this.mousedbclick, false)
},
2、鼠标按下绘制
mousedownHandler(event) {if (event.button == 0 && !flag) {points[clicksNum].point.push({x: event.pageX - cvsClientRect.x,y: event.pageY - cvsClientRect.y})if (points.length >= 1) {cvs.addEventListener('mousemove', this.mousemoveHandler, false)}this.drawPolygon(points[clicksNum].point,points[clicksNum].color)}
},
3、鼠标双击确定绘制范围
mousedbclick(event) {flag = truecvs.removeEventListener('mousemove', this.mousemoveHandler)
},
4、清空绘制
clear() {points = []ctx.clearRect(0, 0, cvs.width, cvs.height)
},

三、全部代码

<template><div><el-row><el-col :span="3"><div class="toolbar"><div ><el-button type="primary" size="mini" icon="el-icon-plus" @click="add">添加</el-button><el-button type="primary" size="mini" icon="el-icon-view" @click="addExhibition">展示</el-button></div><div class="record" v-for="(item,index) in pointsData" :key="index"><div  :style="{ backgroundColor: item.color}"></div><el-button type="success" icon="el-icon-edit" circle ></el-button><el-button type="danger" icon="el-icon-delete" circle @click="itemClear(index)"></el-button></div></div></el-col><el-col :span="20"><div class="canvas-box" style="width: 1276px; height: 718px;"><canvas id="mapcvs" width="1276" height="718"></canvas><canvas id="cvs" width="1276" height="718">不支持canvas</canvas></div></el-col></el-row></div>
</template><script>
var cvs
var cvsClientRect
var ctx
let points//绘制数据
let clicksNum = -1
var flag
var mapcntx
var mapcanvas
export default {props:['imgSrc'],data() {return {pointsData:[],绘制数据colorList: ['#EB675E',"#EB675E","#B33EA1","#FDCF78","#6991ED","#9599E1","#D3AAE1","#FF88B3","#E77B79","#0FABEB","#ADFFC1",'#92D2E1','#9FB0E1'],colorActionList:[]}},mounted() {cvs = document.getElementById('cvs')cvsClientRect = cvs.getClientRects()[0]ctx = cvs.getContext('2d')points = []flag = falsemapcanvas = document.getElementById('mapcvs')mapcntx = mapcanvas.getContext('2d')var img = new Image()img.src = this.imgSrcimg.onload = function() {var pattern = mapcntx.createPattern(img, 'no-repeat')mapcntx.drawImage(img, 0, 0)mapcntx.fillStyle = patternmapcntx.fillRect(0, 0, 300, 300)}},methods: {//增加add() {flag = falseclicksNum++console.log(clicksNum)points[clicksNum] = {point:[],color:this.color16()}cvs.addEventListener('mousedown', this.mousedownHandler, false)cvs.addEventListener('dblclick', this.mousedbclick, false)},//全部删除clear() {points = []ctx.clearRect(0, 0, cvs.width, cvs.height)},mousedownHandler(event) {if (event.button == 0 && !flag) {points[clicksNum].point.push({x: event.pageX - cvsClientRect.x,y: event.pageY - cvsClientRect.y})if (points.length >= 1) {cvs.addEventListener('mousemove', this.mousemoveHandler, false)}this.drawPolygon(points[clicksNum].point,points[clicksNum].color)}},//鼠标双击mousedbclick(event) {flag = truecvs.removeEventListener('mousemove', this.mousemoveHandler)},//canvas绘制drawPolygon(point,color) {ctx.clearRect(0, 0, cvs.width, cvs.height)ctx.strokeStyle = colorctx.beginPath()ctx.lineWidth=3ctx.moveTo(point[0].x, point[0].y)for (var i = 1; i < point.length; i++) {ctx.lineTo(point[i].x, point[i].y)}ctx.closePath()ctx.stroke()this.$nextTick(()=>{  this.pointsData = points.filter(d => d)this.$emit('drawAreaDataEv',points)this.$forceUpdate()})},//鼠标左键抬起当前位置mousemoveHandler(event) {this.drawPolygon(points[clicksNum].point.concat({x: event.pageX - cvsClientRect.x,y: event.pageY - cvsClientRect.y}),points[clicksNum].color)},//全部展示addExhibition() {ctx.clearRect(0, 0, cvs.width, cvs.height)points.forEach(ite=>{ctx.strokeStyle = ite.colorctx.beginPath()ctx.lineWidth=3ctx.moveTo(ite.point[0].x, ite.point[0].y)ite.point.forEach(it=>{ctx.lineTo(it.x, it.y)})ctx.closePath()ctx.stroke()})},//删除其中一条数据itemClear(index) {points = points.filter(d => d)this.colorList.unshift(this.pointsData[index].color)this.colorActionList.splice(clicksNum,1)points.splice(index,1)this.pointsData.splice(index,1)clicksNum--this.$emit('drawAreaDataEv',points)this.addExhibition()},//判断距离distanceCheck(lng_a, lat_a, lng_b, lat_b) {var pk = 180 / 3.14169;var a1 = lat_a / pk;var a2 = lng_a / pk;var b1 = lat_b / pk;var b2 = lng_b / pk;var t1 = Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2);var t2 = Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2);var t3 = Math.sin(a1) * Math.sin(b1);var tt = Math.acos(t1 + t2 + t3);return Math.floor(6366000 * tt);},//十六进制颜色随机color16(){let color = ''if(clicksNum>=this.colorList.length-1) {color = this.colorList[this.colorList.length-1]}else {color = this.colorList[clicksNum]this.colorActionList.push(color)this.colorList.splice(clicksNum,1)}return color}}
}
</script><style lang="scss">
canvas {// border: 1px solid #000;position: absolute;
}
.record {display: flex;align-items: center;margin-top: 10px;>div {width: 80px;height: 3px;margin: 0 10px;cursor: pointer;}
}
.toolbar {margin-right: 20px;
}
</style>

vue canvas绘制多边形相关推荐

  1. canvas绘制多边形

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  2. vue + canvas绘制扇形圆盘

    vue + canvas绘制扇形圆盘 html: <canvas style="position: fixed;z-index:-1" width="545&quo ...

  3. vue+canvas绘制时间轴

    vue+canvas绘制时间轴 最近在研究canvas绘制时间轴,直接上代码,希望分享能给大家带来帮助,效果如下: 代码如下,可以拷贝到vue项目中直接预览 <template><d ...

  4. vue canvas画多边形

    第一个版本,只是单纯用来画多边形的,而且只能画一个. <template><div class="main"><div>这纷纷飞花,这纷纷飞花已 ...

  5. vue + canvas绘制背景图、矩形

    最近有需求做图片人脸识别,在系统上传图片后,后台返回坐标将识别到的人脸画上矩形. 效果图如下: 实现过程: 1.利用绘制canvas实例 //html <canvas id='imgCanvas ...

  6. vue+canvas绘制时间轴组件

    说明: 此组件使用vue2语法以及canvas实现. 效果图: 线上地址: time-select-line 安装: npm i time-select-line --save 导入: import ...

  7. (三)canvas绘制样式

    beginPath() 对画线点的一个开始限制 moveTo() 画线的起点,只在开头使用 参数两个x轴,y轴 lineTo() 后续连线 两个参数x轴,y轴 stroke() 连线无填充 fill( ...

  8. Vue+Openlayer使用Draw实现交互式绘制多边形并获取面积

    场景 Vue+Openlayer使用Draw实现交互式绘制线段: Vue+Openlayer使用Draw实现交互式绘制线段_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面的基础上实 ...

  9. html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形

    html5: Canvas 绘制基本图形 从绘制直线 到 路径 Jack Lee 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.n ...

最新文章

  1. 如何设计一个通用的权限管理系统
  2. [JSP]解决Maven创建项目失败
  3. selenium元素的定位以及操作 第二章
  4. pandas python groupby_pandas之分组groupby()的使用整理与总结
  5. python 希尔伯特变换_python scipy signal.hilbert用法及代码示例
  6. ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)
  7. 自底向上伸展树(之字形旋转+一字形旋转)
  8. vmware服务器虚拟化实施文档,VMware服务器虚拟化
  9. __str__是什么函数_PHP str_shuffle()函数与示例
  10. 怎么引jsp包_电机引接线的制作流程防护等级
  11. Mr.J--JS学习(Clone)
  12. richtextbox自动滚动到最下面_Axure RP 9教程:banner轮播最简单的实现方法
  13. Java Web学习笔记08:分页技术
  14. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
  15. python爬虫怎么赚钱-python爬虫怎么赚钱
  16. android中listview没有item也能点击事件,ListView中的Item不能点击的解决方法
  17. 鸢尾花lris数据集的SVM线性分类
  18. 仿美剧天蝎计划 scorpion 12集微型千斤顶机械装置
  19. Spark SQL原理及常用方法详解(二)
  20. 计算机钥匙英语,计算机加锁--把U盘变成打开电脑的钥匙 - 信息科学 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. 微演示 ppt/pdf/doc 转html5 用法 (2)-- 前端脚本接口
  2. Js 数组转JSON格式
  3. 您有一个快递方便签收吗?打电话的可能是机器人
  4. Python实现软件自动登录超时锁屏
  5. CentOS7破解root密码
  6. mysql 锁表与解锁
  7. 爬虫项目 | 爬取XX网站招聘信息
  8. pd虚拟机共享网络给mac
  9. 高大上的名字-数据可视化
  10. 基于ubuntu的C语言基础