2016-07-26 94 views
-3

我正在嘗試爲旋轉的矩形創建一個邊界框,我允許用戶通過指定角度進行旋轉。要做到這一點,我給你矩形的RotateTransform的的RenderTransform和編輯的角度來做到這一點,它完美的作品:爲什麼RotateTransform.Transform()返回這個Point?

public void Rotate(double _angle) 
{ 
    rotateTransform.Angle = _angle; 
} 

的問題,當我嘗試構建邊界框這個旋轉矩形出現。在此之前,我什麼都試過了我能找到這裏了,這給了我準確的結果是唯一的功能:

GeneralTransform transform = Rectangle.TransformToVisual(Container); 
Rect boundingBox = transform.TransformBounds(new Rect(Rectangle.RenderSize)); 

不過,我並不總是有機會獲得容器傳遞給TransformToVisual()和任何我在這裏看到的其他排列返回不正確的值。所以我決定通過計算矩形的4個角點(我可以訪問左邊,頂部,寬度和高度)來構建我自己的內部邊界框,然後使用之前的RotateTransform對這4個點進行變換:

Point upperLeft = new Point(Rectangle.Left, Rectangle.Top); 
Point upperRight = new Point(Rectangle.Left + Rectangle.Width, Rectangle.Top); 
Point lowerLeft = new Point(Rectangle.Left, Rectangle.Top + Rectangle.Height); 
Point lowerRight = new Point(Rectangle.Left + Rectangle.Width, Rectangle.Top + Rectangle.Height); 

upperLeft = rotateTransform.Transform(upperLeft); 
upperRight = rotateTransform.Transform(upperRight); 
lowerLeft = rotateTransform.Transform(lowerLeft); 
lowerRight = rotateTransform.Transform(lowerRight); 

這適用於矩形未旋轉(rotateTransform.Angle == 0)的情況,但每當它旋轉時都會返回奇數值。我的問題是爲什麼?我對WPF還是比較陌生的,我似乎無法弄清楚這一點。我也嘗試過傳遞四角({0,0},{Width,0},{0,Height},{Width,Height})的局部空間版本,即使矩形沒有旋轉。

UPDATE 我解決了我的問題,請參閱下面的答案。

+0

第一個PLZ告訴所需的目標,然後告訴你的方法。可能有更好的方法。 – AnjumSKhan

+0

我期望的目標是爲我的旋轉形狀創建一個邊界框,該邊框完全符合形狀。我提到了我在我的問題(TransformToVisual().TransformBounds()和RotateTransform.Transform(Point))中嘗試過的內容,我想知道後者爲什麼會返回不正確的數據),還有其他特定的需求嗎?如果這能提供幫助,我可以提供一些例子嗎? – RichardJones

+0

你是什麼意思的邊界框?你的意思是顯示一個新的矩形外部旋轉形狀? – AnjumSKhan

回答

0

所以我想出了我的問題是什麼。應用於我的Rectangle的RotateTransform將其CenterX和CenterY屬性設置爲0,這是默認值。由於我正在使用Rectangle的RenderTransformOrigin來旋轉矩形,所以我不關心自己。但是,使用RotateTransform轉換Point時,這些值會變得很重要,因爲我假定在此計算中不考慮RenderTransformOrigin。所以,我通過在變形之前將CenterX和CenterY分配到我的Rectangle的左側和頂部來解決問題,並在完成後將它們分配回0。也許這不是最優雅的解決方案,但它解決了我的問題:

rotateTransform.CenterX = Rectangle.Left; 
rotateTransform.CenterY = Rectangle.Top; 

upperLeft = rotateTransform.Transform(upperLeft); 
upperRight = rotateTransform.Transform(upperRight); 
lowerLeft = rotateTransform.Transform(lowerLeft); 
lowerRight = rotateTransform.Transform(lowerRight); 

rotateTransform.CenterX = 0; 
rotateTransform.CenterY = 0;