如何在Fabric.js组内获取对象的左上角 [英] How to get top left of an object inside group fabricjs

查看:58
本文介绍了如何在Fabric.js组内获取对象的左上角的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我遵循了以下主题:

解决方案

工作示例,您可以在这里找到:

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

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

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

 <代码>////1.用两个矩形组成的组安排画布布局var canvas = new fabric.Canvas(document.getElementById('c'));var rect = new fabric.Rect({宽度:100,高度:100,左:50,最高:50填充:'rgba(255,0,0,0.25)'});var smallRect = new fabric.Rect({宽度:12高度:12左:150-12顶部:50 + 50-12/2-10,填充:'rgba(250,250,0,0.5)'});//2.添加可见性和调试原因的位置标记(红点)var refRect = new fabric.Rect({宽度:3,高度:3,左:100,最高:100填充:'rgba(255,0,0,0.75)'});var group = new fabric.Group([rect,smallRect],{originX:'中心',originY:中心"});canvas.add(group);canvas.add(refRect);canvas.renderAll();//3.计算画布空间坐标中子对象的坐标函数getCoords(){//分别获取对象和组的转换矩阵var mGroup = group.calcTransformMatrix(true);//标记为true表示我们需要对该对象进行局部转换,//即对象在组内的位置var mObject = smallRect.calcTransformMatrix(true);console.log("group:",fabric.util.qrDecompose(mGroup));console.log("rect:",fabric.util.qrDecompose(mObject));//获得应用于子对象的总变换//子项按以下顺序转换://画布缩放和平移=>组转换=>嵌套对象=>嵌套对象=>等等...//为简单起见,请忽略画布的缩放和平移var mTotal = fabric.util.multiplyTransformMatrices(mGroup,mObject);console.log("total:",fabric.util.qrDecompose(mTotal));//只需将转换应用于原点即可获得我们想要的var c = new fabric.Point(0,0);var p = fabric.util.transformPoint(c,mTotal);console.log("coords:",p);document.getElementById("output").innerHTML =坐标:" + JSON.stringify(p);//做些琐事,放置红点refRect.left = p.x-3/2;refRect.top = p.y-3/2;canvas.bringToFront(refRect);canvas.renderAll();} 

How can I get canvas-relative position (top, left) of triangle inside an group as bellow image?

I followed this topic: How to get the canvas-relative position of an object that is in a group? but it only right when group is not rotated.

解决方案

Working example you may find here: http://jsfiddle.net/mmalex/2rsevdLa/

Fabricjs provides a comprehensive explanation of how transformations are applied to the objects: http://fabricjs.com/using-transformations

Quick answer: the coordinates of an object inside the group is a point [0,0] transformed exactly how the object in the group was transformed.

Follow my comments in code to get the idea.

    // 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();
    }

这篇关于如何在Fabric.js组内获取对象的左上角的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆