2012-10-17 279 views
7

我想在Android中使用Surfaceview和畫布繪製來創建自定義組件。這些組件可通過觸摸進行調整大小和旋轉。考慮創建一個圖像視圖,可以通過觸摸和拖動所需的邊來擴展它的Top,Right,Bottom和Left邊緣。我正在使用RectF來保持組件的邊界,對於旋轉,我使用canvas.rotate(angle, bounds.centerX(),bounds.centerY())方法。問題在於調整頂邊的大小時,Let,Right和Bottom邊緣應該是固定的,並且如果旋轉角度不是0度,我無法修復它。我需要一個數學解決方案來找出相對於實際矩形邊界的旋轉矩形的x,y座標。關於旋轉角度的矩形座標

我可以在一些圖像的幫助下解釋它。 下圖顯示了兩個矩形,其邊界也是已知的,並以相應的顏色顯示。 考慮綠色矩形作爲組件的起始邊界,即。旋轉-45度,中心是(10,10)。現在要重新大小的頂邊的矩形的,並顯示在下一圖2

Figure 1

從圖2可以理解,在Y位置從6.轉動減少到4矩形也以粉紅色顯示。請記住,我正在調整組件的旋轉角度-45度時調整大小,因此拖動時頂部邊緣矩形的左側,右側和底部位置不應更改。所以圖2的粉紅色矩形應該有左,右和底座標相同圖1的綠色矩形。所獲得的和預期的矩形的比較示於圖3。

Figure 2

在圖3中黃色矩形是預期的/所需出放。所獲得的矩形粉紅色的綠色旋轉矩形相比向上移位,並且這取決於旋轉角度

  • 我有旋轉角= -45度
  • 界的實際(不重新調整大小)的矩形。
  • Rotation = -45度處的實際(未重新調整大小)矩形的界限。
  • 重新調整長方形的邊界。
  • Rotation = -45度時重新調整長方形的邊界。

如何計算黃色矩形的邊界/中心。這樣我可以正確實現我的組件的大小調整?讓我知道是否有任何數學可以應用?

需要的點/座標標記爲紅色圓圈,如圖3

Figure 3

+0

只需旋轉點結束, 基本公式是: X_ = X * cos(角度) - Y * SIN(角度); y_ = y * sin(角度)+ y * cos(角度); http://en.wikipedia.org/wiki/Rotation_(mathematics) – user1410657

回答

0

在這個答案的所有顏色代表你的如圖3所示。

如果我正確理解你的問題,你知道如何計算關於粉紅色矩形和綠色矩形的所有細節。因此,簡單地將粉紅色矩形的一個角與綠色矩形的相應角之間的差異。將該差值(兩個元素矢量,即分別爲x的差異)添加到粉紅色矩形的中心將給出黃色三角形的所需中心。

如果您還需要計算粉紅色矩形的尺寸,則可能需要在未旋轉的座標系中進行此操作。將您的綠色矩形與您想要擴展矩形的點的座標一起,並將其旋轉回+ 45°。然後你可以將矩形的高度擴展到你想要的值,這會給你藍色的矩形,並通過旋轉粉紅色的矩形。

1

關鍵是這樣的:「如果旋轉角度不是0度,我無法修復它。」

假設您的矩形旋轉了10度。

1)旋轉鼠標由-10度

圍繞在屏幕上某點座標由-10度

2)旋轉所述矩形的中心...現在你減小該問題的在0度的矩形。矩形移動了,是的,鼠標移動了,但它們應該是彼此相對的。

3)現在做矩形操作。矩形中心將會移位。

4)旋轉10度

這樣新的矩形中心,你不必去想它,你總是在非旋轉座標的工作。在[x, y]

點由角度旋轉a將在[x*cos(a) - y*sin(a), x*sin(a) + y*cos(a)]