canvas绘制不规则图形,点击获取当前图形索引

canvas给不规则图形添加点击事件

有这么一个需求,把传过来的四个坐标,连成一个图形(可能是规则的,也可能是不规则的),点击某个图形,显示当前这个图形的信息

//数据格式
dataList: {
	lonLatList: null
	seatId: 1					//图形id
	state: 0					//状态
	vehicleNo: null				//车牌号
	xyList: [					//根据经纬度转换的xy坐标
		[58, 511],
		[81, 503],
		[23, 462],
		[0, 470],
		[58, 511]
	]
}

在这里插入图片描述

因为canvas的y坐标是向下的,所以拿到数据后先翻转y坐标

polygons = polygonsInversionY(dataList.map(item => {
	const list = item.xyList
	const len = list.length
	// 如果首尾是同一个结点,则去掉尾结点
	if (list.length > 1) {
	  const lastIndex = list.length - 1
	  if (list[0][0] === list[lastIndex][0] && list[0][1] === list[lastIndex][1]) {
		return list.filter((_, index) => index < lastIndex)
	  }
	}
	return list
}))
drawPolygons = polygons

在这里插入图片描述

翻转后的坐标

翻转后的坐标

根据翻转之后的坐标开始绘图

在这里插入图片描述

效果图

在这里插入图片描述

图形绘制完毕,添加点击功能,点哪个显示哪个的信息

Mycanvas.addEventListener('click', handClick)

function handClick(e) {
  const canvasInfo = Mycanvas.getBoundingClientRect() 				//获取canvas到浏览器可视范围的距离
  rectangles = getRectangles(drawPolygons)							//拿到每组坐标最大范围的坐标 [0, 0, 81, 49]...
  const index = 
  	inPolygons([e.clientX - canvasInfo.left, e.clientY - canvasInfo.top], 
  	drawPolygons, rectangles)										//获取点击图形的索引(如何获取参考下图)
  tipsTop = Number(sessionStorage.getItem('top'))+canvasInfo.top-67
  tipsLeft = sessionStorage.getItem('left')
  	//根据点击索引,显示当前图形的信息
	if(index>=0) {
		let content = ''
		let seatId = dataList[index].seatId
		let vehicleNo = dataList[index].vehicleNo
		if(dataList[index].state == 0) {
			content = '状态:0'+'</br>'+'编号:'+seatId
		}else if(dataList[index].state == 1) {
			content = '状态:1'+'</br>'+'编号:'+seatId+'</br>'+'车牌:'+vehicleNo
			tipsTop = Number(sessionStorage.getItem('top'))+canvasInfo.top-90
		}else{
			content = '状态:2'+'</br>'+'编号:'+seatId+'</br>'+'车牌:'+vehicleNo
			tipsTop = Number(sessionStorage.getItem('top'))+canvasInfo.top-90
		}
		//引入layer.tips提示框
		layui.use('layer', function(){
		  var $ = layui.jquery,
		  layer = layui.layer; 
		  // layer.tips(content, '#'+$(that)[0].id);
		  layer.tips(content, '#'+dataList[index].seatId, {
			tips: [3, '#000000'],
			time: 0,
			success: function(layero, index) {
				//动态设置提示框位置
				layero.css('top',tipsTop+'px')
				layero.css('left',tipsLeft+'px')
			}
		  });
		})
	}else{
		layer.closeAll()
	}
	

将多边形转换为矩形

在这里插入图片描述

将点击的坐标和所有的图形坐标一 一对比,判断点击坐标是否在图形内,在的话返回图形索引,不在返回-1

在这里插入图片描述

效果图

在这里插入图片描述
在这里插入图片描述
核心代码下载:canvas.js

提取码: n972