使用raphael.js画车道线(泊位线)

使用raphael.js画车道线(泊位线)

效果图

在这里插入图片描述

场景

设备拍照上传,但是仅仅有图片,不够明显的显示问题,就要前端来绘制这个车道线(不可拖拽)。

后端数据(坐标形式)

在图片中以图片左上角作为坐标系远点,我这里后端返回的是以百分比的形式,例如一个点x,y就是距离左上的百分比距离。
TODO:因为raphael限制path绘制的方法需要传入具体的像素值,所以,需要先获取图片的实际尺寸再进行转换成实际像素值。

代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>基础画线</title>
  <style>
    #paper{
      width:500px;
      height:700px;
      background:url('img/car3.jpg');
      background-size: cover;
    }
  </style>
</head>
<body>
  <div id="paper"></div>
  <script src="js/raphael.js"></script>
  <script>
    let width = 500
    let height = 700
    let paper = new Raphael(document.getElementById("paper"), width, height)
    //模拟四点百分比  todo
    let lineData = [
      //左上 
      {
        x:24,    
        y:11,
      },//左下
      {
        x:-8,
        y:85
      },
      //右下
      {
        x:51,
        y:86,
      },//右上
      {
        x:51,
        y:11
      } 
    ]
    //横线位置   todo
    let crossData ={
      0:[
        //左上交点
        {
          y:26,
          x:0,
        },
        //左下
        {
          x:0,
          y:48
        },
      ],
      1:[
        //右上
        {
          x:0,
          y:26,
        },
        
        //右下交点
        {
          y:48,
          x:0
        }
      ]
    }
    //绘制矩形取点顺序
    let sortArr = [
      [0,1],
      [2,3],
      [0,3],
      [1,2]
    ]
    //存斜率、常数项
    let crossLine = {
      0:{
        k:0,b:0
      },
      1:{
        k:0,b:0
      },
    }
    //先转换百分比为实际的值
    let exchaneData =function(item){
      item.x = parseInt(((item.x/100).toFixed(2))*500)
      item.y = parseInt(((item.y/100).toFixed(2))*700)
    }
    //转换四个点
    lineData.forEach((ite)=>{
      exchaneData(ite)
    })
    //转换横线的点
    for(var key in crossData){
      crossData[key].forEach((val,index)=>{
        exchaneData(val)
      })
    }
    
    //计算斜率  y=kx+b
    let computedLine = function(item,idx){
      //这里可能会出现  0/0 或者 x/0等  当x/0就有问题
      if(lineData[item[1]].x - lineData[item[0]].x==0){
        crossLine[idx].x = lineData[item[0]].x
      }else{
        crossLine[idx].k = (lineData[item[1]].y - lineData[item[0]].y) / (lineData[item[1]].x - lineData[item[0]].x).toFixed(2)
        crossLine[idx].b = lineData[item[0]].y - lineData[item[0]].x * crossLine[idx].k
      }
    }
    //水平线与两条竖线的焦点坐标 
    let computedDot = function(idx){
      crossData[idx].forEach((item)=>{
        //斜率分母可能为0  即k=infinity=b
        if(crossLine[idx].x){
          item.x = crossLine[idx].x
        }else{
          item.x = (item.y-crossLine[idx].b)/crossLine[idx].k
        }
      })
      
    }

    //raphael画线段 传入两点 {x:0,y:0},{x:0,y:0}
    let raphaelDraw = function(dot,dot1,type){
      let attr = {
        stroke: 'blue',
        'stroke-width': 2,
      }
      if(type==='dashed'){
        attr['stroke-dasharray'] = '-'
      }
      paper.path(`M${dot.x} ${dot.y}L${dot1.x} ${dot1.y}`).attr(attr)
    }
    
    //绘制矩形 
    sortArr.forEach((arr,idx)=>{
      if(idx==0||idx==1){
        //绘制的时候计算斜率
        computedLine(arr,idx)
        // console.log('斜率','y1='+crossLine[idx].k+'x'+'+'+crossLine[idx].b)
        //利用斜率算出横线的交点坐标
        computedDot(idx)
      }
      //画矩形
      raphaelDraw(lineData[arr[0]],lineData[arr[1]],'')
    })
    //画横线  左边的点逐个连向右侧的点
    crossData[0].forEach((item,index)=>{
      raphaelDraw(item,crossData[1][index],'dashed')
    })
    
  </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小郑有点困了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值