一组字符串坐标,转换成二维数组坐标,找中心点坐标,两点间的距离,以及向量夹角


做canvas绘制时会遇到计算很多,给一段字符串坐标去绘制图形,需要处理数据,处理成二维数组都比较好操作。

另外有时需要找到中心坐标,将关键数据筛选出来,可以利用排序方便筛选最大值最小值;

结合高中数学,两点间的距离公式计算距离,两向量的夹角公式计算夹角cosθ值,再转化为角度。

data(){

  return {  

    heatArea: [              {area: '0,0 0,4.69 5.5,4.65 30.2,4.69 30.2,0 20,0 5,0 0,0', rangeId: 0},             {area: '30.2,0 30.2,4.65 42,4.65 50.2,4.69 60.2,4.69 60.2,0 38,0 30.2,0', rangeId: 1},             {area: '60.2,0 60.2,4.69 75,4.65 82.2,4.69 82.2,0 80,0 75,0 60.2,0', rangeId: 2},             {area: '82.2,0 82.2,4.65 88.5,4.65 100.2,4.69 100,0 87,0 85,0 82.2,0', rangeId: 3},         ], methods: {   // 处理点集合区域的中心点坐标     centralPoint () {       this.heatArea.forEach((item, index) => {         let arrArea = item.area.split(' ')         let arr= [] // 拿到二维数组点坐标集合         arrArea.forEach(value => {           arr.push(value.split(','))         })         let arrX = []         let arrY = []         arr.forEach(val => {           arrX.push(val[0])           arrY.push(val[1])         })         arrX.sort((a,b) => {           return b - a         })         arrY.sort((a,b) => {           return b - a         })         let maxX = arrX[0]         let maxY = arrY[0]         let minX = arrX[arrX.length - 1]         let minY = arrY[arrX.length - 1]         let x = Number((maxX - minX) / 2) + Number(minX) // 中心点坐标x         let y = Number((maxY - minY) / 2) + Number(minY) // 中心点坐标y                 this.centerPoint.push({x, y, maxX, maxY, minX, minY}) // 中心点坐标x,y,最大x,最大y,最小x,最小y         console.log(x,y,'中心点坐标xy',this.centerPoint);       })     },     createCanvas () {     // 省略非内容代码     for (let n = 0; n <= this.heatArea.length - 2; n++) {       let x1 = this.centerPoint[n].x             let x2 = this.centerPoint[n + 1].x             let y1 = this.centerPoint[n].y             let y2 = this.centerPoint[n + 1].y            // 两点之间的距离公式 √[(x1-x2)2 + (y1-y2)2]             let distance = Math.sqrt(Math.pow((x1 - x2),2) + Math.pow((y1 - y2),2)) // 距离计算         // 向量夹角公式 vector  cos0 = (x1x2+y1y2)/[√(x12+y12)*√(x22+y22)]             let vector = ((x1 * x2 + y1 * y2) / (Math.sqrt(Math.pow(x1,2) + Math.pow(y1,2)) * Math.sqrt(Math.pow(x2,2) + Math.pow(y2,2)))).toFixed(6)       let angle = Math.cos(vector * 180 / Math.PI).toFixed(6) // 角度计算会因精度问题而偏差不到1度     }   } } 是不是挺有意思的,有特殊需求还可以利用函数,几何等找关键值,发现高中数学作用很大,另外物理公式同样可以效仿。