Fabricjs 之后的线坐标(移动、缩放、旋转) - canvas.on('object:modified'...

Posted

技术标签:

【中文标题】Fabricjs 之后的线坐标(移动、缩放、旋转) - canvas.on(\'object:modified\'...【英文标题】:Fabricjs line coordinates after (moved, scaled, rotated) - canvas.on('object:modified'…Fabricjs 之后的线坐标(移动、缩放、旋转) - canvas.on('object:modified'... 【发布时间】:2016-09-21 05:21:18 【问题描述】:

我需要在对象被修改后找到线坐标(x1,y1,x2,y2)。 (移动、缩放、旋转)

本来想用oCoords信息,根据角度和翻转信息来决定哪些角是线端,但好像不会太准确……

有什么帮助吗?

示例:

x1:164

y1:295.78334045410156,

x2:451

y2: 162.78334045410156

x:163,y:161.78334045410156 - 左上角

x:452,y:161.78334045410156 - 右上角

x:163,y:296.78334045410156 - 左下角

x: 452, y: 296.78334045410156 - 右下角

【问题讨论】:

在检索 oCoords 值之前,您是否在 line 对象上调用 setCoords() 方法? 我没用过,但即使有它仍然有 1 个像素的差异。我有所有具有原点的对象 - “中心”。你知道角落是否有这个属性,这就是原因(如果没有设置),或者默认情况下它们会稍微移出真实的末端? 织物线对象具有以下属性:x1,y1,x2,y2。执行该转换后,值不会更新为真实值吗? 不,它们与 originalState 保持一致 无论如何感谢您的帮助,我决定忽略差异并使用它们。 【参考方案1】:

当 Fabric.js 计算 oCoords(即对象的角坐标)时,它会考虑对象的 strokeWidth

// fabric.Object.prototype
_getNonTransformedDimensions: function() 
  var strokeWidth = this.strokeWidth,
      w = this.width + strokeWidth,
      h = this.height + strokeWidth;
  return  x: w, y: h ;
,

对于大多数对象,stroke 是一种勾勒外边缘的边框,因此在计算角坐标时考虑strokeWidth 是非常有意义的。

fabric.Line 中,stroke 用于绘制线条的主体。问题中没有示例,但我认为这是实际终点坐标与oCoords 中的坐标之间存在差异的原因。

所以,如果您真的想使用oCoords 来检测端点的坐标,则必须针对strokeWidth / 2 进行调整,例如

const realx1 = line.oCoords.tl.x + line.strokeWidth / 2
const realy1 = line.oCoords.tl.y + line.strokeWidth / 2

请记住,fabric.Line 自己的 _getNonTransformedDimensions() 确实会针对 strokeWidth 进行调整,但仅当行的 widthheight 等于 0 时:

// fabric.Line.prototype
_getNonTransformedDimensions: function() 
  var dim = this.callSuper('_getNonTransformedDimensions');
  if (this.strokeLineCap === 'butt') 
    if (this.width === 0) 
      dim.y -= this.strokeWidth;
    
    if (this.height === 0) 
      dim.x -= this.strokeWidth;
    
  
  return dim;
,

【讨论】:

以上是关于Fabricjs 之后的线坐标(移动、缩放、旋转) - canvas.on('object:modified'...的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 FabricJS 中 Inkscape SVG 的缩放和旋转?

最快的变换方式(移动、旋转、缩放)

求一个C语言图形变换程序,先进行图形绘制,后能进行图形复制、移动、缩放、旋转,跪求啦。。。

canvas和白鹭引擎中平移,旋转,缩放

Getting started with Processing 第六章总结

fabricjs:缩放后如何显示对象大小