javascript - 如何使用 Fabric.js 绘制与网格对齐的多条线

标签 javascript html5-canvas fabricjs

我正在使用 FabricJs 和 Canvas 构建一个简单的线条绘制工具。使用鼠标可以沿着网格线画一条线。 喜欢这张图片:

Figure 1

我的目标是限制线条只能沿着网格垂直、水平和对 Angular 绘制。至此线条不再粘在网格上,可以在 Canvas 上自由绘制线条。

参见带有红线的图片:

Wrong way

我不确定如何实现该部分,任何帮助将不胜感激。

这是我到目前为止所拥有的。 谢谢。

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

var grid = 30;

// create grid
//line
var line, isDown;


function createGrid(board) {
  for (var i = 0; i < (600 / grid); i++) {
    board.add(new fabric.Line([ i * grid, 0, i * grid, 600], { stroke: '#000', selectable: false }));
    board.add(new fabric.Line([ 0, i * grid, 600, i * grid], { stroke: '#000', selectable: false }))
  }
}
//create grids

createGrid(canvasA);


//handle line drawing
drawLine(canvasA);


function drawLine (board) {
// add objects
board.on('mouse:down', function(o){
  isDown = true;
  var pointer = board.getPointer(o.e);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
  line = new fabric.Line(points, {
    strokeWidth: 2,
    fill: 'black',
    stroke: 'red',
    originX: 'center',
    originY: 'center',
  
  });
  board.add(line);
});

board.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = board.getPointer(o.e);
  line.set({ x2: pointer.x, y2: pointer.y });
  board.renderAll();
});

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

}
canvas{
    
    background-color: transparent;
    margin: 3px;
    width: 120px;
    height: 240px;
    border: 2px solid #ccc;
    padding-left: 0;

}


.boards  {
    display: inline;
    padding-left: 0;
}

    .boards canvas {
        list-style: none;
        display: inline-block;
        background-color: transparent;
        margin: 3px;
        width: 120px;
        height: 240px;
    
    }
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.19/fabric.js"></script>
        <h1>Fabric Js Snap To grid </h1>
        <div class="boards">
        <canvas id="a" width="120" height="240"></canvas>

最佳答案

您可以使用此 if 语句找到垂直线。
if(Math.abs(line.x1 - line.x2) > Math.abs(line.y1 - line.y2))
鼠标松开
board.remove(line);

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

var grid = 30;

// create grid
//line
var line, isDown;


function createGrid(board) {
  for (var i = 0; i < (600 / grid); i++) {
    board.add(new fabric.Line([ i * grid, 0, i * grid, 600], { stroke: '#000', selectable: false }));
    board.add(new fabric.Line([ 0, i * grid, 600, i * grid], { stroke: '#000', selectable: false }))
  }
}
//create grids

createGrid(canvasA);


//handle line drawing
drawLine(canvasA);


function drawLine (board) {
// add objects
board.on('mouse:down', function(o){
  isDown = true;
  var pointer = board.getPointer(o.e);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
  line = new fabric.Line(points, {
    strokeWidth: 2,
    fill: 'black',
    stroke: 'red',
    originX: 'center',
    originY: 'center',
  
  });
  board.add(line);
});

board.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = board.getPointer(o.e);
  line.set({ x2: pointer.x, y2: pointer.y });
  board.renderAll();
});

board.on('mouse:up', function(o){
   if(Math.abs(line.x1 - line.x2) > Math.abs(line.y1 - line.y2))
     board.remove(line);
  isDown = false;
});

}
canvas{
    
    background-color: transparent;
    margin: 3px;
    width: 120px;
    height: 240px;
    border: 2px solid #ccc;
    padding-left: 0;

}


.boards  {
    display: inline;
    padding-left: 0;
}

    .boards canvas {
        list-style: none;
        display: inline-block;
        background-color: transparent;
        margin: 3px;
        width: 120px;
        height: 240px;
    
    }
<script type='text/javascript' src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.19/fabric.js"></script>
        <h1>Fabric Js Snap To grid </h1>
        <div class="boards">
        <canvas id="a" width="120" height="240"></canvas>

关于javascript - 如何使用 Fabric.js 绘制与网格对齐的多条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019720/

相关文章:

javascript - FabricJS:对象控件在共同选择之前不起作用

javascript - 如何在javascript中删除附加子元素

javascript - 即时获取方法形式?

javascript - 如何在react.js中使用json

javascript - Google Maps API - 在 map 外显示标记信息

javascript - 向已有图像的 Canvas 添加水印 - HTML5, Canvas

javascript - 如何使用Canvas制作3D动画

javascript - 在 three.js 中的球体上使用纹理

javascript - 如何将 html 元素放在 fabric.js 元素上

image - 在高清图像上应用 WebGL 过滤器会剪切图像(结构 V2-beta-6)