2017-08-25 43 views
0

总之,我正在制作一个应用程序,人们可以合作并绘制图像。正常化FabricJS中的绘图吗?

我现在有一个概念验证,但我注意到,如果两个人协作使用不同大小的窗口,那么这些图形在其他人的浏览器上显示的尺寸不正确。


解决方案是将归一化绘图输入,使得点被表示为它们跨越在画布的百分比,而不是绝对的像素值。但是,我不知道如何在FabricJS中执行此操作。最后,我需要确定该解决方案在缩放时也能正常工作。

任何正常化绘图输入的建议,将不胜感激!作为参考,这里是我的代码到目前为止。

被警告:我以前从未使用FabricJS,所以此代码示例是几篇博文和SO答案的混搭。 这是不好的代码,将完全重构,如果FabricJS是我决定去与

的重要线路已经评价

document.addEventListener('DOMContentLoaded',() => { 
    const room = window.location.href.split('/').pop(); 
    const socket = io.connect(); 

    socket.on('connect',() => { 
    socket.emit('room', room); 
    }); 

    var canvas = new fabric.Canvas('map', { 
    isDrawingMode: true 
    }); 

    let size = Math.min(window.innerWidth, window.innerHeight); 
    canvas.setHeight(size); 
    canvas.setWidth(size); 

    var img = new Image(); 
    img.onload = function() { 
    canvas.setBackgroundImage(img.src, canvas.renderAll.bind(canvas), { 
     width: canvas.width, 
     height: canvas.height, 
    }); 
    }; 
    img.src = "/images/map.jpg"; 

    canvas.wrapperEl.addEventListener('wheel', (e) => { 
    if (e.deltaY <= 0) { 
     canvas.zoomToPoint({ 
     x: e.offsetX, 
     y: e.offsetY 
     }, canvas.getZoom() * 1.1); 
    } else { 
     canvas.zoomToPoint({ 
     x: e.offsetX, 
     y: e.offsetY 
     }, canvas.getZoom() * 0.9); 
    } 
    }); 

    canvas.on('path:created', function (e) { 
    // This is where I need to normalize the path data 
    canvas.remove(fabric.Path.fromObject(JSON.stringify(e.path))); 
    socket.emit('draw_line', { 
     line: e.path.toJSON(), 
     room: room 
    }); 
    }); 

    socket.on('draw_line', function (path) { 
    // This is where I need to convert the path data from percentages to real size 
    fabric.util.enlivenObjects([path], function (objects) { 
     objects.forEach(function (o) { 
     canvas.add(o); 
     }); 
    }); 
    }); 

    var panning = false; 
    canvas.on('mouse:up', function (e) { 
    panning = false; 
    }); 
    canvas.on('mouse:out', function (e) { 
    panning = false; 
    }); 
    canvas.on('mouse:down', function (e) { 
    panning = true; 
    }); 
    canvas.on('mouse:move', function (e) { 
    //allowing pan only if the image is zoomed. 
    if (panning && e && e.e && e.e.shiftKey) { 
     var delta = new fabric.Point(e.e.movementX, e.e.movementY); 
     canvas.relativePan(delta); 
    } 
    }); 
}); 

回答

0

的一般工作解决方案库是你给你的绘图登上虚拟固定尺寸:例如,

15.000 x 15.000。

然后在每个客户端应用程序,你做你想要的画布一样大,例如1000×1000,另外将获得800 * 800

画布缩放设置为每一个将有可能看到图纸尽可能大的维护15.000空间坐标上的相同点值。

图形厚度可能会随着缩放级别而改变。

canvas.setZoom(1000/15000)canvas.setZoom(800/15000)应该足够了。

如果它不起作用,有一个地方的错误,应该修复。