如何在Fabric.js组内获取对象的左上角

时间:2018-10-08 07:33:30

标签: fabricjs

如何获取组内三角形相对于画布的相对位置(顶部,左侧)作为波纹管图像?

我遵循了以下主题:How to get the canvas-relative position of an object that is in a group?,但是只有在组不旋转时它才正确。

enter image description here

2 个答案:

答案 0 :(得分:0)

工作示例,您可以在这里找到:http://jsfiddle.net/mmalex/2rsevdLa/

fabricJs: calculate canvas space coordinates of child object in the group

Fabricjs提供了有关如何将转换应用于对象的全面说明:http://fabricjs.com/using-transformations

快速解答:组内对象的坐标为[0,0]点精确地转换了组内对象的变形方式

在代码中关注我的想法即可。

    // 1. arrange canvas layout with group of two rectangles
    var canvas = new fabric.Canvas(document.getElementById('c'));

    var rect = new fabric.Rect({
      width: 100,
      height: 100,
      left: 50,
      top: 50,
      fill: 'rgba(255,0,0,0.25)'
    });
    var smallRect = new fabric.Rect({
      width: 12,
      height: 12,
      left: 150 - 12,
      top: 50 + 50 - 12 / 2 - 10,
      fill: 'rgba(250,250,0,0.5)'
    });

    // 2. add a position marker (red dot) for visibility and debug reasons
    var refRect = new fabric.Rect({
      width: 3,
      height: 3,
      left: 100,
      top: 100,
      fill: 'rgba(255,0,0,0.75)'
    });

    var group = new fabric.Group([rect, smallRect], {
      originX: 'center',
      originY: 'center'
    });
    canvas.add(group);
    canvas.add(refRect);
    canvas.renderAll();

    // 3. calculate coordinates of child object in canvas space coords
    function getCoords() {
      // get transformation matrixes for object and group individually
      var mGroup = group.calcTransformMatrix(true);

      // flag true means that we need local transformation for the object,
      // i.e. how object is positioned INSIDE the group
      var mObject = smallRect.calcTransformMatrix(true);

      console.log("group: ", fabric.util.qrDecompose(mGroup));
      console.log("rect: ", fabric.util.qrDecompose(mObject));

      // get total transformattions that were applied to the child object,
      // the child is transformed in following order:
      // canvas zoom and pan => group transformation => nested object => nested object => etc...
      // for simplicity, ignore canvas zoom and pan
      var mTotal = fabric.util.multiplyTransformMatrices(mGroup, mObject);
      console.log("total: ", fabric.util.qrDecompose(mTotal));

      // just apply transforms to origin to get what we want
      var c = new fabric.Point(0, 0);
      var p = fabric.util.transformPoint(c, mTotal);
      console.log("coords: ", p);
      document.getElementById("output").innerHTML = "Coords: " + JSON.stringify(p);

      // do some chores, place red point
      refRect.left = p.x - 3 / 2;
      refRect.top = p.y - 3 / 2;
      canvas.bringToFront(refRect);
      canvas.renderAll();
    }

答案 1 :(得分:0)

获得左上角的一个非常简单的方法是

var cords = object._getLeftTopCoords();
cords.x and cord.y will give you the result