WPF: поверните прямоугольник и поместите его на холст - PullRequest
16 голосов
/ 20 июля 2010

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

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

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

1 Ответ

19 голосов
/ 20 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...