7

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

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

图1

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

图 2

在图 3 中,黄色矩形是预期/必需输出。与绿色旋转的矩形相比,获得的矩形粉红色向上移动,并且变化取决于旋转角度

  • 我有旋转角度= -45度
  • 实际(未调整大小)矩形的边界。
  • 旋转时实际(未调整大小)矩形的边界 = -45 度。
  • 重新调整大小的矩形的边界。
  • 旋转时重新调整大小的矩形的边界 = -45 度。

如何计算黄色矩形的边界/中心。这样我就可以正确地调整组件的大小了吗?让我知道有什么数学可以应用吗?

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

图 3

4

2 回答 2

1

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

于 2017-08-10T21:30:03.373 回答
0

此答案中的所有颜色均参考您的图 3。

如果我正确理解了您的问题,您就会知道如何计算有关粉红色矩形和绿色矩形的所有细节。所以简单地取粉红色矩形的一个角和绿色矩形的对应角之间的差异。将该差值(一个二元素向量,即分别为xy的差值)添加到粉红色矩形的中心将为您提供所需的黄色三角形中心。

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

于 2012-10-17T14:24:33.780 回答