有一个ImageView,它有一个图像,已被缩放和旋转 .
看图:
图像由 android.graphics.Matrix 缩放 .
android.graphics.Matrix
您可以看到红点是图像的中心点,也是蓝色边框 . 怎么计算它们?
(更新:我想操作蓝色边框内的女孩的图像,而不是整个图片,那是背景)
两者之间存在数学依赖关系 . 如果还有其他可用信息: - 假设矩形对所有角落都有直角 - .
center.X = (aCorner.X + oppositeCorner.X)/2; center.Y = (aCorner.Y + oppositeCorner.Y)/2;
其中aCorner是一个任意角落,而cornerCorner则与aCorner相对 .
这是微不足道的,包括计算边界(以及更多信息;中心位置,宽度和图片的高度以及旋转角度)的更多努力 . 假设图像的宽度为“w”,高度为“h”,角度为“a”,中心为“cX”和“cY” . 第一个角落;
length = sqrt(w^2+h^2)/2; x = (length)*(cos(a)*(-w/length) - (h/length)*sin(a)) + cX; y = (length)*(sin(a)*(-w/length) + (h/length)*cos(a)) + cY;
第二个角落;
x = (length)*(cos(a)*(w/length) + sin(a)*(h/length)) + cX; y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;
第三;
x = -(length)*(cos(a)*(-w/length) + (h/length)*sin(a)) + cX; y = -(length)*(sin(a)*(-w/length) - (h/length)*cos(a)) + cY;
第四;
x = -(length)*(cos(a)*(w/length) - sin(a)*(h/length)) + cX; y = (length)*(cos(a)*(h/length) - sin(a)*(w/length)) + cY;
长度是矩形对角线的一半 . cos和sin的内部是三角变换的结果:
sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b) [....]
并且cX和cY用于将角从任意坐标系转换为特定坐标系 .
我知道,我知道这有点矫枉过正 . Matrix类可以单独使用此功能 . 我相信如果有的话,其中使用的方法可以分解为我在这里描述的方法 .
注意:角度 - 实际上甚至sin(a)和cos(a),这是更好的 - 可以通过访问Matrix.getValues(float []值)
大多数2D矩阵使用此方案:
| sin(a) 0 0 | | 0 -cos(a) 0 | | 0 0 scale|
我不确定Android API的具体实现 .
顺便说一句,那里可能有一些签名错误,所以要小心 .
1 回答
两者之间存在数学依赖关系 . 如果还有其他可用信息: - 假设矩形对所有角落都有直角 - .
其中aCorner是一个任意角落,而cornerCorner则与aCorner相对 .
这是微不足道的,包括计算边界(以及更多信息;中心位置,宽度和图片的高度以及旋转角度)的更多努力 . 假设图像的宽度为“w”,高度为“h”,角度为“a”,中心为“cX”和“cY” . 第一个角落;
第二个角落;
第三;
第四;
长度是矩形对角线的一半 . cos和sin的内部是三角变换的结果:
并且cX和cY用于将角从任意坐标系转换为特定坐标系 .
我知道,我知道这有点矫枉过正 . Matrix类可以单独使用此功能 . 我相信如果有的话,其中使用的方法可以分解为我在这里描述的方法 .
注意:角度 - 实际上甚至sin(a)和cos(a),这是更好的 - 可以通过访问
Matrix.getValues(float []值)
大多数2D矩阵使用此方案:
我不确定Android API的具体实现 .
顺便说一句,那里可能有一些签名错误,所以要小心 .