Подтвердить что ты не робот

WPF: повернуть прямоугольник и поместить его в холст

У меня проблема с поворотом прямоугольника и поместите его на холст определенным образом. Вот что я пытаюсь достичь:

Вращающиеся прямоугольники 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.SetLeft и Canvas.SetTop. Но у меня проблемы с выяснением того, как делать математику. (Расчет y, похоже, работает).

На самом деле я хочу разместить несколько прямоугольников на холсте в случайных положениях. Угол поворота может быть значением от -45 до 45 градусов, а размеры прямоугольника также могут быть случайными. Но прямоугольники всегда должны быть полностью видимыми на холсте, поэтому мне нужно знать смещения для границ координат положения. (Прямоугольники могут перекрывать себя.)

Надеюсь, вы понимаете мою проблему. Было бы неплохо, если бы вы могли помочь мне.

4b9b3361

Ответ 1

Решение на самом деле намного проще, чем вы, возможно, догадались. Вместо 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.