【问题标题】:Getting the dimensions of a rotated image获取旋转图像的尺寸
【发布时间】:2012-12-08 18:34:13
【问题描述】:

我有一个画布,可以在上面绘制图像。图像可以在绘制之前旋转一定的度数(EG:30)。

我需要绘制一个框来包含绘制的图像;这很容易,但宽度和高度会根据图像旋转的角度而变化。

我在这里看到了一些非常相似的问题,但我无法将答案实现到我的代码中,因为它们要么是用另一种语言(如 ActionScript)编写的,要么它们正在旋转 div 或不在画布内的其他元素。我一直无法计算出它背后的主要数学原理。

我已经为你创建了一个 JSFiddle 来适应:

http://jsfiddle.net/ZY7Ux/

我在这个 JSFiddle 中创建了两个函数:

drawImageToCanvasRotated(URL, X, Y, Angle);
drawRectangle(X, Y, Width, Height);

您应该注意,位置值是针对图像/矩形的中心的。

谢谢。

【问题讨论】:

  • 这不是纯几何吗?边界矩形的大小不会是 [width*(sin(x)+cos(x)), height*(sin(x)+cos(x))]?

标签: javascript html canvas


【解决方案1】:

你旋转图像,所以新的宽度变成了:

  • 宽度的 x 尺寸,比全宽略小(使用余弦)
  • 高度的 x 维度,略高于 0(使用正弦)

类似的计算适用于新高度。 http://jsfiddle.net/ZY7Ux/1/

var a = Width * Math.cos(Angle);
var b = Height * Math.sin(Angle);
var c = a + b;

var p = Width * Math.sin(Angle);
var q = Height * Math.cos(Angle);
var r = p + q;

context.strokeRect(
    X - c / 2,
    Y - r / 2,
    c,
    r
);

【讨论】:

  • 谢谢!这正是我所需要的,也是一个很好的解释。
  • @CHRIS:请注意,如果负角/角度大于 90 度,此计算将失败,因为它背后的想法不适用于这种情况。
  • 我很难将其调整为适用于 -360 到 360 之间的所有值。我试过做一个原始的 if(imageRotation >= 90)... else... 但我认为它可以做得更好。请帮忙,谢谢。
  • 我不太明白怎么做:context[i ? "lineTo" : "moveTo"](xM[i], yM[i]);作品。存储矩形的起始 X 和 Y 和结束 X 和 Y 或宽度和高度的变量是什么?我已经尝试记录 xM 和 yM 的所有值并将线条绘制代码更改为: context.strokeStyle = "#00F"; context.strokeRect(X + xM[0], Y + yM[0], X + xM[1], Y + yM[1]);但正如我所说,我不确定 xM 和 yM 变量究竟存储了什么。
  • @CHRIS:每一对xM[i], yM[i] 是边界矩形的一个角。它由旋转矩形的最小/最大 x/y 组成。
猜你喜欢
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多