【问题标题】:Can't get proper coordinates for selected objects on canvas无法为画布上的选定对象获取正确的坐标
【发布时间】:2021-11-05 11:32:49
【问题描述】:

例如,让我们创建两个矩形。 然后我们选中这两个矩形,想看看它们的坐标:

var greyBox = new fabric.Rect({
    left:100,
    top:100,
    fill: 'grey',
    width: 100,
    height: 100
});

var redBox = new fabric.Rect({
    left:300,
    top:300,
    fill: 'red',
    width: 100,
    height: 100
});

function createCanvas(id){
    canvas = new fabric.Canvas(id);
    canvas.add(greyBox);
    canvas.add(redBox);

    canvas.on('selection:created', function(e) {
        const activeSelection = e.target;

        console.log(activeSelection._objects[0].left);
        console.log(activeSelection._objects[1].left);
    });

    return canvas;
} 

我们确切地知道他们的左边是 100 和 300。 但相反,我们看到的是:-150 和 49:

我们如何获得正确的坐标?

【问题讨论】:

  • 对象在选择中的位置是相对于选择的,在这种情况下是从中心测量的。由于选择的宽度为 301(边框多出 1 个像素),因此灰色框的位置为 -150.5,因为它位于最左边缘。如果您考虑选择的位置和宽度,您将获得正确的值,即-150.5 + 100 + 150.5 = 100
  • 谢谢,它解释了错误坐标

标签: fabricjs


【解决方案1】:

要在组或多选中查找对象的位置属性,您可以使用calcTransformMatrix() 方法。

var matrix = activeSelection._objects[0].calcTransformMatrix();
var options = fabric.util.qrDecompose(matrix);
console.log(options.translateX, options.translateY);

选项对象将具有您需要的转换后的值。请参阅http://fabricjs.com/using-transformations 以更好地了解 transformMatrix 系统。

【讨论】:

  • 不幸的是,它不起作用。 “Var 选项”没有左/上等属性。相反,它有“angle”、“scaleX”、“skewX”。
  • 我更新了我的示例。变换矩阵中的顶部/左侧值实际上称为 translateX 和 translateY。如果您仍然没有任何运气,请分享一个小提琴或代码 sn-p 演示该问题。
  • 还是有问题。我确切地知道坐标是 top100/left 100。但是在你看到的小提琴上,它们是 150.5/150.5。小提琴:jsfiddle.net/ov7z84gx
  • 我看到了这个问题。假设中心的 originX 和 originY 给出 translateX 和 translateY 值。由于您没有使用中心原点,您只需将坐标调整对象宽度/高度的一半
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多