fabricjs - Using fabric.js hovering lines is fired around them (not only exactely over them) -


i have made variation of stick man example allows move not circles, lines too. problem face hovering inclined lines area affect line not exact line, space around it, too.

to see problem:

  1. move circle achieve line not horizontal or vertical
  2. try move line

te result: see posible not exactely on line.

//to save old cursor position: used on line mooving  var _curx, _cury;  $(function() {    //create fabriccanvas object & disable canvas selection    var canvas = new fabric.canvas('c', {      selection: false    });    //move objects origin of transformation center    fabric.object.prototype.originx = fabric.object.prototype.originy = 'center';      function makecircle(left, top, line1, line2) {        var c = new fabric.circle({        left: left,        top: top,        strokewidth: 2,        radius: 6,        fill: '#fff',        stroke: '#666'      });        c.hascontrols = c.hasborders = false;        c.line1 = line1;      c.line2 = line2;        return c;    }      function makeline(coords, name) {      var l = new fabric.line(coords, {        stroke: 'red',        strokewidth: 4,        selectable: true, //false        name: name      });        l.hascontrols = l.hasborders = false;        return l;    }      //initial shape information    var line = makeline([250, 125, 350, 125], "l1"),      line2 = makeline([350, 125, 350, 225], "l2"),      line3 = makeline([350, 225, 250, 225], "l3"),      line4 = makeline([250, 225, 250, 125], "l4");      canvas.add(line, line2, line3, line4);      canvas.add(      makecircle(line.get('x1'), line.get('y1'), line4, line), makecircle(line.get('x2'), line.get('y2'), line, line2), makecircle(line2.get('x2'), line2.get('y2'), line2, line3), makecircle(line3.get('x2'), line3.get('y2'), line3, line4)    );      canvas.on('object:selected', function(e) {      //find selected object type      var objtype = e.target.get('type');      if (objtype == 'line') {        _curx = e.e.clientx;        _cury = e.e.clienty;        //console.log(_curx);        //console.log(_cury);      }    });      canvas.on('object:moving', function(e) {      //find moving object type      var p = e.target;      var objtype = p.get('type');        if (objtype == 'circle') {        p.line1 && p.line1.set({          'x2': p.left,          'y2': p.top        });        p.line2 && p.line2.set({          'x1': p.left,          'y1': p.top        });        //set coordinates lines - should done if element moved programmely        p.line2.setcoords();        p.line1.setcoords();          canvas.renderall();      } else if (objtype == 'line') {        var _curxm = (_curx - e.e.clientx);        var _curym = (_cury - e.e.clienty);        //console.log("moved: " + _curxm);        //console.log("moved: " + _curym);          //loop circles , if contains line - move        (var = 0; < canvas.getobjects('circle').length; i++) {          var currentobj = canvas.getobjects('circle')[i];            if (currentobj.line1.get("name") == p.get('name') || currentobj.line2.get("name") == p.get('name')) {              currentobj.set({              'left': (currentobj.left - _curxm),              'top': (currentobj.top - _curym)            });              currentobj.setcoords();              currentobj.line1 && currentobj.line1.set({              'x2': currentobj.left,              'y2': currentobj.top            });            currentobj.line2 && currentobj.line2.set({              'x1': currentobj.left,              'y1': currentobj.top            });              currentobj.line2.setcoords();            currentobj.line1.setcoords();          }        }        _curx = e.e.clientx;        _cury = e.e.clienty;      }    });    });
canvas {    border: 1px solid #808080;  }
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>  <canvas id="c" width="500" height="500"></canvas>

inside function makeline please add perpixeltargetfind: true new fabric.line.

i made jsfiddle


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -