Offset the mouse position by an angle

by Javier Cruz

HTML

<script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.js"></script>
<canvas id="c" width="500" height="500" style="border:1px solid #ccc"></canvas>

JavaScript

var canvas = new fabric.Canvas('c', { selection: false });

var line, isDown;
var iniPoint;

canvas.on('mouse:down', function(o){
  isDown = true;
  var pointer = canvas.getPointer(o.e);
  iniPoint = new THREE.Vector2(pointer.x, pointer.y);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
  line = new fabric.Line(points, {
    strokeWidth: 5,
    fill: 'red',
    stroke: 'red',
    originX: 'center',
    originY: 'center'
  });
  canvas.add(line);
});

canvas.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = canvas.getPointer(o.e);
  var vm = new THREE.Vector2(pointer.x,pointer.y);
  var vectDis = new THREE.Vector2();
  vectDis.sub(vm,iniPoint);
  
  var gamma = -Math.PI/4;
  var cs = Math.cos(gamma);
  var sn = Math.sin(gamma);
  var px = vectDis.x * cs - vectDis.y * sn;
  var py = vectDis.x * sn + vectDis.y * cs;
  vectDis.x = px;
  vectDis.y = py;
  vectDis.addSelf(iniPoint);
    
  line.set({ x2: vectDis.x, y2: vectDis.y });
  canvas.renderAll();
});

canvas.on('mouse:up', function(o){
  isDown = false;
});