【问题标题】:MATH reverting rotated coordinatesMATH 还原旋转坐标
【发布时间】:2023-04-01 22:50:01
【问题描述】:

情况:

画布包含一个可以旋转、缩放和平移(移动)的图像。 该图像是一个 SVG 内部有许多路径,因此必须检索原始坐标以检查哪个路径封装了鼠标。

SVG 在画布上呈现。

      //calculates the distance between two points
      var distance = function(x1, y1, x2, y2) {
        return Math.sqrt(Math.pow(Math.abs(x1 - x2), 2),
            Math.pow(Math.abs(y1 - y2), 2));
      };

      //defines the center of the image
      //this is also the rotational point
      var center = {
        x : target.getWidth() / 2,
        y : target.getHeight() / 2
      };

      //defines the click location
      var click = {
        x : event.layerX / target.getScaleX() - target.getLeft(),
        y : event.layerY / target.getScaleY() - target.getTop()
      };

上面的代码确保xy 是路径中使用的正确值,前提是没有旋转。

所以基本上:假设用户已将图像旋转 45 度并点击图像:点击坐标需要向后旋转 45 度才能获得所需的坐标。但我已经有好几年没有做过这样的数学了……

图像的原点(旋转点)是它的中心。

【问题讨论】:

  • 你知道旋转的角度和中心吗?
  • 是的,我都可以访问。
  • 你确定不能作弊并使用浏览器的鼠标事件吗?
  • 埃里克,你是什么意思?
  • <path onmouseover="selection=this">

标签: javascript math fabricjs


【解决方案1】:

您正在寻找toLocalPoint,它会为您完成大部分工作:http://fabricjs.com/docs/fabric.Object.html#toLocalPoint

你可以see in the source of the function,它不考虑缩放,但它会旋转和平移对象。

var p = canvas.getPointer(event);
var loc = target.toLocalPoint(new fabric.Point(p.x,p.y), "left", "top");

var pos_in_target = {
    x : loc.x / target.getScaleX(),
    y : loc.y / target.getScaleY()
};

【讨论】:

  • 有了你的第一个答案,我感到很幸运,因为你讲了这么多细节,当我休息回来时,我看到了编辑(打字时的当前版本),我就像在哪里做的那样去!我现在确实了解(因为您之前的修订版)它是​​如何工作的,并且实现如此简单......你是最好的人,非常感谢
  • 哈哈,是的,我详细介绍了一些细节,您可以在此处访问:stackoverflow.com/revisions/27757399/7,但虽然我得到了相反的矩阵就好了,但我在从 fabricjs 获取矩阵时遇到了麻烦。使用getTransformMatrix() 总是返回null,而fabric.parseTransformAttribute(target.getSvgTransform()) 由于忘记了度数到弧度的转换而失败,所以我不得不手动构建矩阵。然后通过代码,我发现了许多在文档中不太明显的有用功能......因此答案更短。但是在这里查看比较:jsfiddle.net/1fy8s309/4
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2014-04-26
  • 2012-02-29
相关资源
最近更新 更多