Android 相对于旋转角度的矩形坐标

Android 相对于旋转角度的矩形坐标,android,math,game-physics,discrete-mathematics,Android,Math,Game Physics,Discrete Mathematics,我正在尝试使用Surfaceview和canvas绘图在Android中创建自定义组件。组件可通过触摸重新调整尺寸和旋转。考虑创建图像视图,其顶部、右侧、底部和左侧边缘可通过触摸和拖动所需的边缘来缩放。我使用RectF来保持组件的边界,对于旋转,我使用canvas.rotate(angle,bounds.centerX(),bounds.centerY())方法。问题是,在调整上边缘的大小时,左边缘、右边缘和下边缘应该是固定的,如果旋转角度不是0度,我无法固定它。我需要一个数学解来找出旋转矩形相

我正在尝试使用Surfaceview和canvas绘图在Android中创建自定义组件。组件可通过触摸重新调整尺寸和旋转。考虑创建图像视图,其顶部、右侧、底部和左侧边缘可通过触摸和拖动所需的边缘来缩放。我使用
RectF
来保持组件的边界,对于旋转,我使用
canvas.rotate(angle,bounds.centerX(),bounds.centerY())
方法。问题是,在调整上边缘的大小时,左边缘、右边缘和下边缘应该是固定的,如果旋转角度不是0度,我无法固定它。我需要一个数学解来找出旋转矩形相对于实际矩形边界的x,y坐标

我可以借助一些图片来解释它。 下图显示了两个矩形,它们的边界也是已知的,并以各自的颜色显示将绿色矩形视为组件的初始边界,即旋转-45度,中心为(10,10)。现在将重新调整矩形的上边缘的大小,并显示在下图2中

从图2可以看出,Y位置从6减少到4。旋转的矩形也以粉红色显示。请记住,当组件旋转角度为-45度时,我正在调整大小,因此在拖动上边缘时,不应更改矩形的左、右和底部位置。因此,图2的粉红色矩形应该具有左、右和底部坐标,与图1的绿色矩形相同。获得的矩形与预期矩形的比较如图3所示

在图3中,黄色矩形是预期/要求的输出。与绿色旋转的矩形相比,获得的矩形粉红色向上移动,并且随着旋转角度的变化而变化

  • 我有旋转角度=-45度
  • 实际(未重新调整大小)矩形的边界
  • 旋转=-45度时实际(未重新调整大小)矩形的边界
  • 重新调整大小的矩形的边界
  • 旋转时重新调整大小的矩形的边界=-45度
如何计算黄色矩形的边界/中心。这样我才能正确地调整组件的大小?让我知道有什么数学可以应用吗?

所需的点/坐标在图3中标记为红色圆圈。

此答案中的所有颜色都参考图3

如果我没弄错你的问题,你就知道如何计算粉色矩形和绿色矩形的所有细节。因此,只需计算粉色矩形的一个角点和绿色矩形的相应角点之间的差值。将该差值(两元素向量,即分别为x和y差值)添加到粉红色矩形的中心,将得到黄色三角形的所需中心

如果还需要计算粉红色矩形的尺寸,则可能需要在未旋转的坐标系中进行计算。将绿色矩形与要延伸矩形的点的坐标一起旋转+45°。然后,您可以将矩形的高度扩展到所需的值,该值将为您提供蓝色矩形,并从中旋转粉色矩形。

关键是:“如果旋转角度不是0度,我无法修复它。”

假设矩形旋转了10度

1) 将鼠标坐标围绕屏幕上的某个点旋转-10度

2) 将矩形的中心旋转-10度

。。。现在,您将问题简化为0度的矩形。矩形移动了,是的,鼠标移动了,但是它们是相对的

3) 现在执行矩形操纵。矩形中心将移动

4) 将新矩形中心旋转10度

这样你就不必考虑它,你总是在不旋转的坐标中工作


[x,y]
以角度旋转的点
a
将在
[x*cos(a)-y*sin(a),x*sin(a)+y*cos(a)]

仅旋转点,基本公式为:x=x*cos(角度)-y*sin(角度);y=y*sin(角度)+y*cos(角度);