【问题标题】:difference between Rotate(angle) and Rotate(angle, px, py) in matrix transformation android矩阵变换android中Rotate(angle)和Rotate(angle, px, py)的区别
【发布时间】:2016-08-16 11:47:35
【问题描述】:

根据Android on Matrix的官方文档。

XXRotate(浮点数) -- 处理矩阵以围绕 (0,0) 旋转指定的度数。

XXRotate(float degree, float px, float py) -- 处理矩阵以旋转指定的度数,轴心点位于 (px, py)。

  • XX 根据需要设置、发布或预先设置。

例如:XXRotate(90, center_point_x_of_view, center_point_y_of_view)

  • 在指定一些枢轴点时是否需要对枢轴点进行一些转换?

  • 第一次旋转后视图上的原点坐标点有何变化?

【问题讨论】:

  • 最简单的答案就是用 XXRotate 运行代码,然后自己学习东西是如何工作的

标签: android matrix rotation imageview


【解决方案1】:

我们以一个宽高为 10 的正方形为例。左上角位于 (0,0) 的原点,右下角位于 (10,10)。

如果我们用matrix.setRotate(180F) 变换那个正方形,我们会期望原点(即轴心点)不会移动,而右下角会移动到 (-10, -10)。

现在假设我们用matrix.setRotate(180F, 5F, 5F) 变换正方形。我们已经把轴心点放在了正方形的中心,所以我们期望原点移动到(10, 10),右下角移动到(0, 0)。

所以在你看了所有的数学之后,结果是

matrix.setRotate(theta, pivotX, pivotY);

实际上只是一个较短的版本

matrix.setRotate(theta);
matrix.preTranslate(-pivotX, -pivotY);
matrix.postTranslate(pivotX, pivotY);

如果你想知道点的变化,对于旋转,X 随角度的余弦变化,y 随角度的正弦变化。

如此简单的旋转:

float thetaR = theta * Math.PI / 180F; // convert degrees to radians
int x2 = Math.round(x * (float) Math.cos(thetaR));
int y2 = Math.round(y * (float) Math.sin(thetaR));

把它们放在一起,你有

float thetaR = theta * Math.PI / 180F; // convert degrees to radians
int x2 = Math.round((x - pivotX) * (float) Math.cos(thetaR) + pivotX);
int y2 = Math.round((y - pivotY) * (float) Math.sin(thetaR) + pivotY);

【讨论】:

  • 明白了..!我尝试了这两种组合......!那么第一次旋转后视图上原点坐标点的变化是什么?
  • 旋转当然涉及三角学。我更新了我的公式答案。
  • 有关轮换的更多澄清问题,请参阅此-i.imgur.com/Hvic6SL.pngstackoverflow.com/questions/38811559/…
  • 所以您的其他问题将我引向您在 pastebin 上的 CropperImageView 课程。我的问题是,你所有的旋转都限制在 90 度增量吗?也就是说,能不能只有90、180、270、-90等?
  • 另外,你是不是总是从图像的中心旋转,而此时它恰好被转换了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多