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

做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)² + (y1-y2)²]
            let distance = Math.sqrt(Math.pow((x1 - x2),2) + Math.pow((y1 - y2),2)) // 距离计算
 
      // 向量夹角公式 vector  cos0 = (x1x2+y1y2)/[√(x1²+y1²)*√(x2²+y2²)]
            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度
    }
  }
}
是不是挺有意思的,有特殊需求还可以利用函数,几何等找关键值,发现高中数学作用很大,另外物理公式同样可以效仿。
posted @ 2020-07-09 15:11  清风引佩下瑶台  阅读(922)  评论(0编辑  收藏  举报