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

7
我正在尝试使用Surfaceview和画布绘制创建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中,黄色矩形是所需的输出。获得的矩形粉色向上移动,与绿色旋转矩形相比有所偏移,并且这取决于旋转角度。
如何计算黄色矩形的边界/中心点,以便正确实现组件的调整大小?请告诉我是否有可以应用的数学方法?
所需的点/坐标在图3中标为红色圆圈。

1
只需旋转点,基本公式如下: x_ = x * cos(angle) - y * sin(angle); y_ = y * sin(angle) + y * cos(angle);http://en.wikipedia.org/wiki/Rotation_(mathematics) - user1410657
2个回答

2
关键在于:“如果旋转角度不是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)]

0

本答案中的所有颜色均指您的图3。

如果我正确理解了您的问题,您知道如何计算粉色矩形和绿色矩形的所有细节。因此,只需取粉色矩形的一个角和相应绿色矩形的对应角之间的差。将该差(一个二元向量,即xy差分别)加到粉色矩形的中心,即可得到所需的黄色三角形中心。

如果您还需要计算粉色矩形的尺寸,您可能希望在未旋转的坐标系中这样做。将您的绿色矩形与您想要扩展矩形的点的坐标一起,并将它们向后旋转+45°。然后,您可以将矩形的高度扩展到所需值,从而得到蓝色矩形,再通过旋转得到粉色矩形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接