2010-07-20 44 views
16

我在旋轉矩形時遇到了問題,並以某種方式將其放在畫布上。以下是我儘量做到:WPF:旋轉矩形並將其放置在畫布中

Rotated Rectangles http://www.freeimagehosting.net/uploads/79844652d2.jpg

圖中的大矩形是我的畫布。較小的矩形是我想要旋轉的矩形。當我旋轉矩形(虛線矩形),當然它會被剪切。爲了避免這種情況,我想重新定位右側圖片中的矩形。

這是我試過到目前爲止:

Rectangle rect = new Rectangle(); 
rect.Width = 100; 
rect.Height = 50; 
int angle = 30; 
rect.RenderTransform = new RotateTransform(angle, rect.Width/2, rect.Height/2); 
canvas.Children.Add(rect); 

double x = Math.Cos(30) * (rect.Width/2) + Math.Sin(30) * (rect.Height/2) - rect.Width/2; 
double y = Math.Sin(30) * (-rect.Width/2) + Math.Cos(30) * (rect.Height/2) - rect.Height/2; 
Canvas.SetLeft(rect, x); 
Canvas.SetTop(rect, y); 

我認爲要做到這一點的最好辦法是計算偏移x,y和Canvas.SetLeftCanvas.SetTop矩形的位置。但我有問題想出如何做數學。 (y計算似乎工作)。

其實我想在畫布的隨機位置放置幾個矩形。旋轉角度可以是-45到45度之間的值,並且矩形尺寸也可以是隨機值。但矩形應該始終在畫布中完全可見,所以我需要知道位置座標邊界的偏移量。 (矩形可能會重疊。)

我希望你能理解我的問題。如果你能幫助我,那會很好。

+0

您的線條'rect.Width/2,rect.Height/2);'解決了我的問題。正如intellisense中提到的那樣,我正在傳遞直腸中心的座標。奇怪的是,智能感知導致混淆和疑問的答案。 :-) – 2015-10-20 06:02:41

回答

19

解決方案實際上比您可能猜到的要簡單得多。而不是使用RenderTransform,而是使用LayoutTransform。它採用相同類型的轉換,而不是在渲染過程中將它們應用於元素的渲染輸出,而是在佈局過程中更改元素的佈局空間。因此,以下XAML會生成您在屏幕截圖中的第二個示例中顯示的結果。

<Canvas Width="640" Height="480"> 
    <Rectangle Fill="Blue" Width="200" Height="80"> 
     <Rectangle.LayoutTransform> 
      <RotateTransform Angle="-45"/> 
     </Rectangle.LayoutTransform> 
    </Rectangle> 
</Canvas> 

請注意,這在Silverlight中不起作用,因爲Silverlight不支持LayoutTransform。

+1

噢,夥計。爲什麼簡單,當你可以做到這一點很複雜;)這很簡單。謝啦! – user396363 2010-07-20 14:00:51

+0

謝謝。如果此答案解決了您的問題,則可以通過單擊複選標記將其標記爲已回答。 – Josh 2010-07-21 13:54:30