Пакет Microsoft Expression Blend содержит визуальные средства для трансформации объектов (рис. 6.1):
(рис 6.1) Трансформация объектов в Microsoft Expression Blend
Группа инструментов "Transform" – отличный помощник при изучении трансформаций. В XAML – графике подерживаются следующие трансформации:
TranslateTransform (трансляция, перенос) – перемещение объекта к новым координатам X и Y.RotateTransform ( вращение) – поворот на заданный угол Angle.ScaleTransform ( масштабирование) – изменение геометрических размеров объекта при помощи кратных величин ScaleX и\или ScaleY.SkewTransform ( искажение) – смещение объекта вдоль горизонтальной и\или вертикальной оси, задаваемое с помощью углов AngleX и AngleY.MatrixTransform (M11, M12, M21, M22, OffsetX, OffsetY) – задание параметров трансформации в виде матрицы.Команды аддитивны, то есть при последовательном применении нескольких команд результат будет представлять собой сумму отдельных преобразований.
Команда TranslateTransform представляет собой перенос начала системы отсчета в новую точку с заданными координатами. Рассмотрим следующий фрагмент кода:
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Rectangle.RenderTransform>
</Rectangle>
Координаты обоих прямоугольников и их геометрические размеры совпадают. Следовательно, на рисунке второй прямоугольник должен был бы наложится на первый. Но для второго прямоугольника была применена команда TranslateTransform и теперь начало его собственной системы координат располагается в точке 100, 75 (рис. 6.2):
(рис 6.2) Применение команды TranslateTransform
Трансформация применяется к фигуре при помощи специального тега RenderTransform. В табл. 6.1 приводятся примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.1.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Перенос фигуры в точку с координатами 100, 75. Как обычно, координаты отсчитываются от верхнего левого угла прямоугольника. Однако специальный атрибут ) позволяет установить центральную точку, относительно которой будет осуществляться преобразование. Она определяется в кратных долях от геометрических размерах объекта. Понятно, что в случае команды трансляции эффект практически не будет заметен. | ||
| № | Код | Вид в браузере |
| 6.1.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="180"
Height="80" Canvas.Left="10"
Canvas.Top="10">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" />
<Canvas.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Применение команды TranslateTransform для элемента Canvas. Внутри группы расположен один элемент |
||
| № | Код | Вид в браузере |
| 6.1.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock
FontFamily="Arial"
FontSize="24"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate"></TextBlock>
<TextBlock
FontFamily="Arial"
FontSize="24"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate">
<TextBlock.RenderTransform>
<TranslateTransform X="30"
Y="30" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Трансформация текста | ||
| № | Код | Вид в браузере |
| 6.1.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock
FontFamily="Arial"
FontSize="40"
FontWeight="Bold"
Foreground="Gray"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate">
<TextBlock.RenderTransform>
<TranslateTransform X="2"
Y="2" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
FontFamily="Arial"
FontSize="40"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate"></TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Трансформация текста – получение эффекта тени | ||
Команда RotateTransform поворачивает систему координат относительно точки отсчета на задаваемый угол (рис. 6.3):
(рис 6.3) Применение команды RotateTransform
Поскольку объекты расположены чаще всего не в начале исходной системы координат, то для поворота фигуры около своей оси приходиться применять сочетание команд RotateTransform и TranslateTransform. В таблице 6.2 приводятся примеры использования этих команд.
| № | Код | Вид в браузере |
|---|---|---|
| 6.2.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210"
Height="210" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow" S
troke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<RotateTransform Angle="45"/>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Поворот системы координат на 45 градусов. Фигура поворачивается и смещается | ||
| № | Код | Вид в браузере |
| 6.2.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="0"
Height="0" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<RotateTransform Angle="45"/>
<TranslateTransform X="33.5"
Y="-73"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Для получения поворота фигуры вокруг своей оси после поворота начало отсчета было перенесено при помощи отдельных команд (рис 6.4) Опорная точка для поворачиваемой фигуры в Microsoft Expression Blend | ||
| № | Код | Вид в браузере |
| 6.2.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock Text="Поворот"
FontSize="16" Foreground="Blue"
Canvas.Left="50" Canvas.Top="10">
<TextBlock.RenderTransform>
<RotateTransform Angle="45" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Поворот текста | ||
| № | Код | Вид в браузере |
| 6.2.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210"
Height="210" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<RotateTransform Angle="45"
CenterX="107" CenterY="0" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Здесь мы не стали применять команду (рис 6.5) Конутры элемента Canvas при задании опорной точки с помощью атрибутов CenterX и CenterY
Атрибуты |
||
Команда ScaleTransform позволяет масштабировать объект с указанием кратности вдоль горизонтальной и вертикальной осей (рис. 6.6):
(рис 6.6) Применение команды ScaleTransform
При масштабировании фигуры следует помнить, что при увеличении размеров фигуры, скажем в два раза, происходит увеличение ее площади в четыре. Если в команде указывается один атрибут, то он принимается только для указанной оси. Например, можно определить только атрибут ScaleX:
ScaleTransform ScaleX="2"
Результатом станет увеличение фигуры в два раза только в горизонтальном направлении. В табл. 6.3 приведены примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.3.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
Opacity="0.3" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение фигуры в два раза по горизонтали и вертикали. Отсчет осуществляется относительно верхней левой точки. Задав полупрозрачность, замечаем, что площадь фигуры увеличилась ровно в четыре раза | ||
| № | Код | Вид в браузере |
| 6.3.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Применение команды ScaleTransform с масштабом, равным 1, не изменяет размеров прямоугольника (Для сопоставления прямоугольники смещены Canvas.Top ="25" и Canvas.Top ="50" |
||
| № | Код | Вид в браузере |
| 6.3.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="1" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали | ||
| № | Код | Вид в браузере |
| 6.3.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по вертикали | ||
| № | Код | Вид в браузере |
| 6.3.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали и вертикали | ||
| № | Код | Вид в браузере |
| 6.3.6 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="150" Background="White" x:Name="Page"> <Rectangle Canvas.Left="25" Canvas.Top="25" Width="50" Height="25" Fill="skyblue" Stroke="red" StrokeThickness="2"/> <Rectangle Canvas.Left="25" Canvas.Top="50" Width="50" Height="25" Fill="palegreen" Stroke="red" StrokeThickness="2" > <Rectangle.RenderTransform> <ScaleTransform ScaleX="2" /> </Rectangle.RenderTransform> </Rectangle> </Canvas> |
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали без указания второго параметра | ||
| № | Код | Вид в браузере |
| 6.3.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="200"
Height="150" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" />
<Canvas.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="1.5" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Применение команды scale для трансформации группы, заключенной в элементе Canvas | ||
| № | Код | Описание |
| 6.3.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="420" Height="220"
Background="White"
x:Name="Page">
<TextBlock
Canvas.Left="50"
Canvas.Top="50"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст"
/>
<TextBlock
Canvas.Left="150"
Canvas.Top="50"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="3"
ScaleY="1" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
Canvas.Left="50"
Canvas.Top="100"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="3" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
Canvas.Left="150"
Canvas.Top="100"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="
3" ScaleY="3" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
Масштабирование текста | |
| Вид в браузере | ||
|
||
| № | Код | Вид в браузере |
| 6.3.9 | ||
<Canvas
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="200"
Height="150" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
Opacity="0.5" />
<Canvas.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" CenterX="25"
CenterY="13" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Для смещения трансформированной фигуры мы применяли задание значений Canvas.Left и Canvas.Top. Такой же эффект получается при использовании атрибутов CenterX и CenterY |
||
Отражение объектов – одна из наиболее часто встречающихся задач при работе с любой графикой. Сочетания команд ScaleTransform и TranslateTransform позволяет легко получать нужный результат (рис. 6.7):
(рис 6.7) Отражение объекта при помощи команд ScaleTransform и TranslateTransform
Исходная фигура находится в правой нижней части рисунка. При подстановке координат в команды их можно варьировать в некоторых пределах для получения определенного эффекта, например "перекрытия". Исходное изображение можно заменить отражением, если указывать смещение на длину и высоту фигуры (рис. 6.8):
(рис 6.8) Замещение исходного изображения отражением
В табл. 6.4приводится различные варианты отражения объекта.
| № | Код | Вид в браузере |
|---|---|---|
| 6.4.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Исходная фигура (Нижняя правая)-->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Исходная фигура. Применение команд ScaleTransform и TranslateTransform с указанными параметрами не изменяет масштаба и расположения |
||
| № | Код | Вид в браузере |
| 6.4.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Нижняя левая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево со смещением на ширину | ||
| № | Код | Вид в браузере |
| 6.4.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Верхняя правая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-110"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры снизу вверх со смещением на высоту | ||
| № | Код | Вид в браузере |
| 6.4.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Верхняя левая фигура -->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55"
Width="100" Height="50"
Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="-110"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево и снизу вверх со смещением на ширину и высоту | ||
| № | Код | Вид в браузере |
| 6.4.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Исходная фигура (Нижняя правая)-->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Нижняя левая фигура -->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Верхняя правая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-110"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Верхняя левая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="-110"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Исходная фигура и три отражения | ||
| № | Код | Вид в браузере |
| 6.4.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево с замещением исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.4.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Снизу вверх-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-160"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры снизу вверх с замещением исходной фигуры. | ||
| № | Код | Вид в браузере |
| 6.4.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Снизу вверх и справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50" Height="25"
Fill="green" Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="-160"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево и снизу вверх с замещением исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.4.9 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Canvas Width="220" Height="120"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105" Canvas.Top="55"
Width="100" Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105" Canvas.Top="55"
Width="50" Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Снизу вверх и справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" Opacity="0.6">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="-160"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| При расположении фигуры бывает довольно трудно подобрать нужные координаты. Задачу можно упростить, если оставить исходный объект, а позиционирование осуществлять с полупрозрачной фигурой | ||
Команда SkewTransform предназначена для искажения формы фигуры в направлении горизонтальной ( AngleX ) и вертикальной осей ( AngleY ) (рис. 6.9):
(рис 6.9) Команды SkewTransform с атрибутами AngleX и AngleY
Применение пары аргументов AngleX и AngleY приводит к одновременному искажению фигуры вдоль обеих осей. При использовании команды SkewTransform с атрибутом AngleX абсциссы фигуры остаются прежними, а ординаты автоматически вычисляются по формуле Y*tg(n) где n – значение угла в градусах, принимаемое конструктором. Аналогично, применение команды SkewTransform с атрибутом AngleY оставляет прежними ординаты, изменяя абсциссы по формуле X*tg(n). В табл. 6.5приводятся примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.5.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform AngleX="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении. Заметно смещение верхней левой точки объекта относительно исходной фигуры. | ||
| № | Код | Вид в браузере |
| 6.5.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="45" />
<TranslateTransform X="-10"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении с компенсацией смещения при помощи команды TranslateTransform |
||
| № | Код | Вид в браузере |
| 6.5.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="235" />
<TranslateTransform X="-10"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении при угле 235 градусов (180+45). Заметно смещение верхней левой точки объекта относительно исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.5.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="235" />
<TranslateTransform X="-14"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении при угле 235 градусов (180+45) с компенсацией смещения при помощи команды TranslateTransform |
||
| № | Код | Вид в браузере |
| 6.5.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleY="45" />
<TranslateTransform X="0"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в вертикальном направлении. Заметно смещение верхней левой точки объекта относительно исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.5.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleY="45" />
<TranslateTransform X="0"
Y="-10"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении. Компенсация смещения | ||
| № | Код | Описание |
| 6.5.7 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="420" Height="220" Background="White" x:Name="Page"> <TextBlock Canvas.Left="50" Canvas.Top="50" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" /> <TextBlock Canvas.Left="150" Canvas.Top="50" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleX="45" /> </TextBlock.RenderTransform> </TextBlock> <TextBlock Canvas.Left="50" Canvas.Top="100" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleY="45" /> </TextBlock.RenderTransform> </TextBlock> <TextBlock Canvas.Left="150" Canvas.Top="100" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleX="20" AngleY="20" /> </TextBlock.RenderTransform> </TextBlock> </Canvas> |
Искажение текста | |
| Вид в браузере | ||
|
||
| № | Код | Вид в браузере |
| 6.5.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="0" Height="0"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform CenterX="0"
CenterY="10" AngleX="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
| № | Код | Вид в браузере |
| 6.5.9 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="0" Height="0"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10" Canvas.Top="10"
Width="100" Height="50"
Fill="yellow" Stroke="red"
StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform CenterX="10"
CenterY="0" AngleY="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в вертикальном направлении. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
| № | Код | Вид в браузере |
| 6.5.10 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Трансформированная фигура --> <Canvas Width="0" Height="0" Canvas.Left="0" Canvas.Top="0"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <SkewTransform CenterX="10" CenterY="10" AngleX="25" AngleY="25" /> </Canvas.RenderTransform> </Canvas> </Canvas> |
|
|
| Описание | ||
Искажение фигуры в обоих направлениях. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
Трансформация MatrixTransform представляет собой способ компактной записи серии преобразований. Графически эта команда не содержит собственных изменений объекта. Она лишь выражает применение одной или нескольких команд типа RotateTransform, SkewTransform, ScaleTransform и TranslateTransform. Математически, все преобразования могут быть выражены в виде матрицы третьего порядка следующим образом:
Команда будет выглядеть так:
(M11, M12, M21, M22, OffsetX, OffsetY)
Каждое из преобразований представляется своей матрицей и соответствующей командой MatrixTransform.
Команда TranslateTransform:
Matrix="1 0 0 1 dx dy"
Команда RotateTransform:
Matrix=" cos(a) sin(a) –sin(a) cos(a) 0 0"
Команда ScaleTransform:
Matrix=" sx 0 0 sy 0 0"
Команда SkewTransform (AngleX):
Matrix="1 0 tg(a) 1 0 0"
Команда SkewTransform (AngleY):
Matrix="1 tg(a) 0 1 0 0"
Практически, для перехода к новой форме записи нужно просто взять исходные параметры команды и аккуратно их подставить в нужные позиции. Для команд RotateTransform, SkewTransform (AngleX) и SkewTransform (AngleY) дополнительно следует вычислить тригонометрические функции углов. В табл. 6.6 приводятся примеры использования этой записи.
| № | Код | Вид в браузере |
|---|---|---|
| 6.6.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="1 0 0 1 100 75"/>
<!--<TranslateTransform X="100"
Y="75"/>-->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды TranslateTransform в форме MatrixTransform |
||
| № | Код | Вид в браузере |
| 6.6.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform x:Name="my
MatrixTransform">
<MatrixTransform.Matrix >
<Matrix M11="1"
M12="0" M21="0" M22="1"
OffsetX="100" OffsetY="75"/>
<!--<TranslateTransform X="100"
Y="75"/>-->
</MatrixTransform.Matrix>
</MatrixTransform>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Задание атрибута x:Name позволяет обращаться к преобразованию программным способом. Кроме того, здесь, в отличие от предыдущего примера используется запись в виде тегов |
||
| № | Код | Вид в браузере |
| 6.6.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="2 0 0 1 0 0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Заметно смещение фигуры по сравнению с результатом, получаемым применением команды ScaleTransform |
||
| № | Код | Вид в браузере |
| 6.6.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50" Height="25"
Fill="skyblue" Stroke="red"
StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="2 0 0 1 25 0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Для компенсации смещения указывается величина смещения, равная 25. Фактически, две последние цифры в значении атрибута Matrix – это смещение по горизонтали и вертикали |
||
| № | Код | Вид в браузере |
| 6.6.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform x:Name="
myMatrixTransform">
<MatrixTransform.Matrix >
<Matrix M11="2" M12="0"
M21="0" M22="1" OffsetX="25"
OffsetY="0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</MatrixTransform.Matrix>
</MatrixTransform>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Matrix превращается в тег, для которого указываются набор атрибутов. Здесь явно видно, что OffsetX и OffsetY определяют трансляцию (перенос) фигуры |
||
| № | Код | Вид в браузере |
| 6.6.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210" Height="210"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<MatrixTransform Matrix="0.7071
0.7071 -0.7071 0.7071 0 0"/>
<!--<RotateTransform
Angle="45"/>-->
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды RotateTransform в форме MatrixTransform |
||
| № | Код | Вид в браузере |
| 6.6.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10" Canvas.Top="10"
Width="50" Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<MatrixTransform Matrix="1 0 1 1 0 0"/>
<!--<SkewTransform AngleX=
"45" /> -->
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды SkewTransform в форме MatrixTransform. tg(45)=1 |
||
| № | Код | Вид в браузере |
| 6.6.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<MatrixTransform Matrix="1 1 0 1 0 0"/>
<!--<SkewTransform AngleY="45" />-->
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды SkewTransform в форме MatrixTransform. tg(45)=1 |
||
Мы разобрали запись в виде матрицы отдельных команд. Немного более сложно обстоят дела с записей нескольких команд, например, TranslateTransform и SkewTransform в виде одной матрицы. Результирующая матрица представляет собой произведение отдельных матриц. Рассмотрим для начала произведение матриц, содержащих по две строки и два столбца:
Обратите внимание на индексы – индекс 12, к примеру, означает, что элемент b12 находится в первой строке и втором столбце. Результирующая матрица получается сложением и умножением отдельных элементов по следующей схеме (рис. 6.10):
(рис 6.10) Умножение матриц второго порядка
Аналогичным образом осуществляется умножение матриц третьего порядка:
$$$$ \begin{vmatrix} a_{11}a_{12}a_{13\\ a_{21}a_{22}a_{23}\\ a_{31}a_{32}a_{33} \end{vmatrix}* \begin{vmatrix} b_{11}b_{12}b_{13}\\ b_{21}b_{22}b_{23}\\ b_{31}b_{32}b_{33} \end{vmatrix}=\\= \begin{vmatrix} a_{11}*b_{11}+a_{12}*b_{21}+a_{13}*b_{31}a_{11}*b_{12}+a_{12}*b_{22}+a_{13}*b_{32}a_{11}*b_{13}+a_{12}*b_{23}+a_{13}*b_{33}\\ a_{21}*b_{11}+a_{22}*b_{21}+a_{23}*b_{31}a_{21}*b_{12}+a_{22}*b_{22}+a_{23}*b_{32}a_{21}*b_{13}+a_{22}*b_{23}+a_{23}*b_{33}\\ a_{31}*b_{11}+a_{32}*b_{21}+a_{33}*b_{31}a_{31}*b_{12}+a_{32}*b_{22}+a_{33}*b_{32}a_{31}*b_{13}+a_{32}*b_{23}+a_{33}*b_{33} \end{vmatrix}$$ $$Для отдельного элемента результирующей матрицы, находящегося во второй строке первого столбца можно выделить схему (рис. 6.11):
(рис 6.11) Умножение матриц третьего порядка
Итак, для получения результирующей матрицы нескольких команд нужно записать отдельные матрицы, а затем их перемножить. В табл. 6.7 приведены примеры подобных матриц.
| № | Код | Вид в браузере |
|---|---|---|
| 6.7.1 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Трансформированная фигура --> <Canvas Width="200" Height="200" Canvas.Left="0" Canvas.Top="0"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <MatrixTransform Matrix="1 0 1 1 -10 0"/> <!--<SkewTransform AngleX="45" /> <TranslateTransform X="-10" Y="0"/> --> </Canvas.RenderTransform> </Canvas> </Canvas> |
|
|
| Описание | ||
Преобразование состоит из двух команд. Запишем их отдельные матрицы:
Вычисляем произведение матриц: $$$$ \begin{vmatrix} 100\\ 010\\ -1001 \end{vmatrix}* \begin{vmatrix} 100\\ 110\\ 001 \end{vmatrix}=\\= \begin{vmatrix} 1*1+0*1+0*01*0+0*1+0*01*0+0*0+0*1\\ 0*1+1*1+0*00*0+1*1+0*00*0+1*0+0*1\\ -10*1+0*1+1*0-10*0+0*1+1*0-10*0+0*0+1*1 \end{vmatrix}=\\= $$\begin{vmatrix} 100\\ 110\\ -1001 \end{vmatrix}$$ $$
Результирующая команда: |
||
Запись серии команд в виде матрицы позволяет сократить запись и, следовательно, уменьшить размер XAML – документа.
Вычисление матриц может показаться сложно задачей, существенно затрудняющей создание пользовательского интерфейса приложения. Однако для перемножения матриц в C# уже есть встроенные методы и классы. Типичный фрагмент кода для получения результирующей матрицы записывается достаточно лаконично:
private void multiplicationExample()
{
Matrix matrix1 = new Matrix(5, 10, 15, 20, 25, 30);
Matrix matrix2 = new Matrix(2, 4, 6, 8, 10, 12);
// matrixResult is equal to (70,100,150,220,240,352)
Matrix matrixResult = Matrix.Multiply(matrix1, matrix2);
// matrixResult2 is also
// equal to (70,100,150,220,240,352)
Matrix matrixResult2 = matrix1 * matrix2;
}
Готовая матрица может быть связана с графическим объектом на стадии выполнения кода.
Для вычисления матриц может применяться еще одно средство, позволяющее весьма наглядно понять логику работы. Пакет ) – мощное средство для решения широкого класса вычислительных задач, содержит удобные инструменты для работы с матрицами. После установки и запуска программы можно сразу приступать к вычислениям. В главном меню выбираем "Insert – Matrix" ( или нажимаем Ctrl+M) (рис. 6.12):
(рис 6.12) Вставка матрицы
В появившемся диалоговом окне выбираем матрицы размером 3х3 (рис.6.13 ):
(рис 6.13) Определение размера матрицы
В документе появляется шаблон, в который можно вводить числа (рис. 6.14):
(рис 6.14) Шаблон матрицы
После завершения ввода вводим знак равенства "=" и программа автоматически отображает результирующую матрицу (рис. 6.15):
(рис 6.15) Готовые матрицы
Программа поддерживает также вычисление тригонометрических функций, которые можно задавать непосредственно в текстовом виде.
Пакет Microsoft Expression Blend содержит визуальные средства для трансформации объектов (рис. 6.1):
(рис 6.1) Трансформация объектов в Microsoft Expression Blend
Группа инструментов "Transform" – отличный помощник при изучении трансформаций. В XAML – графике подерживаются следующие трансформации:
TranslateTransform (трансляция, перенос) – перемещение объекта к новым координатам X и Y.RotateTransform ( вращение) – поворот на заданный угол Angle.ScaleTransform ( масштабирование) – изменение геометрических размеров объекта при помощи кратных величин ScaleX и\или ScaleY.SkewTransform ( искажение) – смещение объекта вдоль горизонтальной и\или вертикальной оси, задаваемое с помощью углов AngleX и AngleY.MatrixTransform (M11, M12, M21, M22, OffsetX, OffsetY) – задание параметров трансформации в виде матрицы.Команды аддитивны, то есть при последовательном применении нескольких команд результат будет представлять собой сумму отдельных преобразований.
Команда TranslateTransform представляет собой перенос начала системы отсчета в новую точку с заданными координатами. Рассмотрим следующий фрагмент кода:
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Rectangle.RenderTransform>
</Rectangle>
Координаты обоих прямоугольников и их геометрические размеры совпадают. Следовательно, на рисунке второй прямоугольник должен был бы наложится на первый. Но для второго прямоугольника была применена команда TranslateTransform и теперь начало его собственной системы координат располагается в точке 100, 75 (рис. 6.2):
(рис 6.2) Применение команды TranslateTransform
Трансформация применяется к фигуре при помощи специального тега RenderTransform. В табл. 6.1 приводятся примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.1.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Перенос фигуры в точку с координатами 100, 75. Как обычно, координаты отсчитываются от верхнего левого угла прямоугольника. Однако специальный атрибут ) позволяет установить центральную точку, относительно которой будет осуществляться преобразование. Она определяется в кратных долях от геометрических размерах объекта. Понятно, что в случае команды трансляции эффект практически не будет заметен. | ||
| № | Код | Вид в браузере |
| 6.1.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="180"
Height="80" Canvas.Left="10"
Canvas.Top="10">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" />
<Canvas.RenderTransform>
<TranslateTransform X="100"
Y="75"/>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Применение команды TranslateTransform для элемента Canvas. Внутри группы расположен один элемент |
||
| № | Код | Вид в браузере |
| 6.1.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock
FontFamily="Arial"
FontSize="24"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate"></TextBlock>
<TextBlock
FontFamily="Arial"
FontSize="24"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate">
<TextBlock.RenderTransform>
<TranslateTransform X="30"
Y="30" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Трансформация текста | ||
| № | Код | Вид в браузере |
| 6.1.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock
FontFamily="Arial"
FontSize="40"
FontWeight="Bold"
Foreground="Gray"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate">
<TextBlock.RenderTransform>
<TranslateTransform X="2"
Y="2" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
FontFamily="Arial"
FontSize="40"
FontWeight="Bold"
Foreground="Green"
Canvas.Left="10"
Canvas.Top="30"
Text="Translate"></TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Трансформация текста – получение эффекта тени | ||
Команда RotateTransform поворачивает систему координат относительно точки отсчета на задаваемый угол (рис. 6.3):
(рис 6.3) Применение команды RotateTransform
Поскольку объекты расположены чаще всего не в начале исходной системы координат, то для поворота фигуры около своей оси приходиться применять сочетание команд RotateTransform и TranslateTransform. В таблице 6.2 приводятся примеры использования этих команд.
| № | Код | Вид в браузере |
|---|---|---|
| 6.2.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210"
Height="210" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow" S
troke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<RotateTransform Angle="45"/>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Поворот системы координат на 45 градусов. Фигура поворачивается и смещается | ||
| № | Код | Вид в браузере |
| 6.2.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="0"
Height="0" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<RotateTransform Angle="45"/>
<TranslateTransform X="33.5"
Y="-73"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Для получения поворота фигуры вокруг своей оси после поворота начало отсчета было перенесено при помощи отдельных команд (рис 6.4) Опорная точка для поворачиваемой фигуры в Microsoft Expression Blend | ||
| № | Код | Вид в браузере |
| 6.2.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<TextBlock Text="Поворот"
FontSize="16" Foreground="Blue"
Canvas.Left="50" Canvas.Top="10">
<TextBlock.RenderTransform>
<RotateTransform Angle="45" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
|
|
| Описание | ||
| Поворот текста | ||
| № | Код | Вид в браузере |
| 6.2.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210"
Height="210" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<RotateTransform Angle="45"
CenterX="107" CenterY="0" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Здесь мы не стали применять команду (рис 6.5) Конутры элемента Canvas при задании опорной точки с помощью атрибутов CenterX и CenterY
Атрибуты |
||
Команда ScaleTransform позволяет масштабировать объект с указанием кратности вдоль горизонтальной и вертикальной осей (рис. 6.6):
(рис 6.6) Применение команды ScaleTransform
При масштабировании фигуры следует помнить, что при увеличении размеров фигуры, скажем в два раза, происходит увеличение ее площади в четыре. Если в команде указывается один атрибут, то он принимается только для указанной оси. Например, можно определить только атрибут ScaleX:
ScaleTransform ScaleX="2"
Результатом станет увеличение фигуры в два раза только в горизонтальном направлении. В табл. 6.3 приведены примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.3.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
Opacity="0.3" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение фигуры в два раза по горизонтали и вертикали. Отсчет осуществляется относительно верхней левой точки. Задав полупрозрачность, замечаем, что площадь фигуры увеличилась ровно в четыре раза | ||
| № | Код | Вид в браузере |
| 6.3.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Применение команды ScaleTransform с масштабом, равным 1, не изменяет размеров прямоугольника (Для сопоставления прямоугольники смещены Canvas.Top ="25" и Canvas.Top ="50" |
||
| № | Код | Вид в браузере |
| 6.3.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="1" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали | ||
| № | Код | Вид в браузере |
| 6.3.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по вертикали | ||
| № | Код | Вид в браузере |
| 6.3.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" >
<Rectangle.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" />
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали и вертикали | ||
| № | Код | Вид в браузере |
| 6.3.6 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="150" Background="White" x:Name="Page"> <Rectangle Canvas.Left="25" Canvas.Top="25" Width="50" Height="25" Fill="skyblue" Stroke="red" StrokeThickness="2"/> <Rectangle Canvas.Left="25" Canvas.Top="50" Width="50" Height="25" Fill="palegreen" Stroke="red" StrokeThickness="2" > <Rectangle.RenderTransform> <ScaleTransform ScaleX="2" /> </Rectangle.RenderTransform> </Rectangle> </Canvas> |
|
|
| Описание | ||
| Увеличение прямоугольника в два раза по горизонтали без указания второго параметра | ||
| № | Код | Вид в браузере |
| 6.3.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="200"
Height="150" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2" />
<Canvas.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="1.5" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Применение команды scale для трансформации группы, заключенной в элементе Canvas | ||
| № | Код | Описание |
| 6.3.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="420" Height="220"
Background="White"
x:Name="Page">
<TextBlock
Canvas.Left="50"
Canvas.Top="50"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст"
/>
<TextBlock
Canvas.Left="150"
Canvas.Top="50"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="3"
ScaleY="1" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
Canvas.Left="50"
Canvas.Top="100"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="1"
ScaleY="3" />
</TextBlock.RenderTransform>
</TextBlock>
<TextBlock
Canvas.Left="150"
Canvas.Top="100"
FontFamily="Arial"
FontSize="30"
Foreground="Red"
Text="Текст" >
<TextBlock.RenderTransform>
<ScaleTransform ScaleX="
3" ScaleY="3" />
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
|
Масштабирование текста | |
| Вид в браузере | ||
|
||
| № | Код | Вид в браузере |
| 6.3.9 | ||
<Canvas
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Canvas Width="200"
Height="150" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
Opacity="0.5" />
<Canvas.RenderTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" CenterX="25"
CenterY="13" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Для смещения трансформированной фигуры мы применяли задание значений Canvas.Left и Canvas.Top. Такой же эффект получается при использовании атрибутов CenterX и CenterY |
||
Отражение объектов – одна из наиболее часто встречающихся задач при работе с любой графикой. Сочетания команд ScaleTransform и TranslateTransform позволяет легко получать нужный результат (рис. 6.7):
(рис 6.7) Отражение объекта при помощи команд ScaleTransform и TranslateTransform
Исходная фигура находится в правой нижней части рисунка. При подстановке координат в команды их можно варьировать в некоторых пределах для получения определенного эффекта, например "перекрытия". Исходное изображение можно заменить отражением, если указывать смещение на длину и высоту фигуры (рис. 6.8):
(рис 6.8) Замещение исходного изображения отражением
В табл. 6.4приводится различные варианты отражения объекта.
| № | Код | Вид в браузере |
|---|---|---|
| 6.4.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Исходная фигура (Нижняя правая)-->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Исходная фигура. Применение команд ScaleTransform и TranslateTransform с указанными параметрами не изменяет масштаба и расположения |
||
| № | Код | Вид в браузере |
| 6.4.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Нижняя левая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево со смещением на ширину | ||
| № | Код | Вид в браузере |
| 6.4.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Верхняя правая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-110"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры снизу вверх со смещением на высоту | ||
| № | Код | Вид в браузере |
| 6.4.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Верхняя левая фигура -->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55"
Width="100" Height="50"
Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="-110"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево и снизу вверх со смещением на ширину и высоту | ||
| № | Код | Вид в браузере |
| 6.4.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="110"
Background="White"
x:Name="Page">
<!--Исходная фигура (Нижняя правая)-->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Нижняя левая фигура -->
<Canvas Width="210" Height="110"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Верхняя правая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-110"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Верхняя левая фигура -->
<Canvas Width="210"
Height="110" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-210"
Y="-110"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Исходная фигура и три отражения | ||
| № | Код | Вид в браузере |
| 6.4.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="0"/>
<ScaleTransform ScaleX="-1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево с замещением исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.4.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Снизу вверх-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="-160"/>
<ScaleTransform ScaleX="1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры снизу вверх с замещением исходной фигуры. | ||
| № | Код | Вид в браузере |
| 6.4.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Снизу вверх и справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" >
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50" Height="25"
Fill="green" Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="-160"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| Отражение фигуры справа налево и снизу вверх с замещением исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.4.9 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="220" Height="120"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Canvas Width="220" Height="120"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105" Canvas.Top="55"
Width="100" Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105" Canvas.Top="55"
Width="50" Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="0"
Y="0"/>
<ScaleTransform ScaleX="1"
ScaleY="1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Снизу вверх и справа налево-->
<Canvas Width="220"
Height="120" Canvas.Left="0"
Canvas.Top="0" Opacity="0.6">
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="55" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<TranslateTransform X="-310"
Y="-160"/>
<ScaleTransform ScaleX="-1"
ScaleY="-1" />
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
<!--Вспомогательная рамка вокруг рисунка-->
<Rectangle Canvas.Left="100"
Canvas.Top="50" Width="110"
Height="60" Fill="Transparent"
Stroke="blue" StrokeThickness="2"/>
</Canvas>
|
|
|
| Описание | ||
| При расположении фигуры бывает довольно трудно подобрать нужные координаты. Задачу можно упростить, если оставить исходный объект, а позиционирование осуществлять с полупрозрачной фигурой | ||
Команда SkewTransform предназначена для искажения формы фигуры в направлении горизонтальной ( AngleX ) и вертикальной осей ( AngleY ) (рис. 6.9):
(рис 6.9) Команды SkewTransform с атрибутами AngleX и AngleY
Применение пары аргументов AngleX и AngleY приводит к одновременному искажению фигуры вдоль обеих осей. При использовании команды SkewTransform с атрибутом AngleX абсциссы фигуры остаются прежними, а ординаты автоматически вычисляются по формуле Y*tg(n) где n – значение угла в градусах, принимаемое конструктором. Аналогично, применение команды SkewTransform с атрибутом AngleY оставляет прежними ординаты, изменяя абсциссы по формуле X*tg(n). В табл. 6.5приводятся примеры использования этой команды.
| № | Код | Вид в браузере |
|---|---|---|
| 6.5.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform AngleX="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении. Заметно смещение верхней левой точки объекта относительно исходной фигуры. | ||
| № | Код | Вид в браузере |
| 6.5.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="45" />
<TranslateTransform X="-10"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении с компенсацией смещения при помощи команды TranslateTransform |
||
| № | Код | Вид в браузере |
| 6.5.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="235" />
<TranslateTransform X="-10"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении при угле 235 градусов (180+45). Заметно смещение верхней левой точки объекта относительно исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.5.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleX="235" />
<TranslateTransform X="-14"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении при угле 235 градусов (180+45) с компенсацией смещения при помощи команды TranslateTransform |
||
| № | Код | Вид в браузере |
| 6.5.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleY="45" />
<TranslateTransform X="0"
Y="0"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в вертикальном направлении. Заметно смещение верхней левой точки объекта относительно исходной фигуры | ||
| № | Код | Вид в браузере |
| 6.5.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200"
Height="200" Canvas.Left="0"
Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<SkewTransform AngleY="45" />
<TranslateTransform X="0"
Y="-10"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
| Искажение фигуры в горизонтальном направлении. Компенсация смещения | ||
| № | Код | Описание |
| 6.5.7 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="420" Height="220" Background="White" x:Name="Page"> <TextBlock Canvas.Left="50" Canvas.Top="50" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" /> <TextBlock Canvas.Left="150" Canvas.Top="50" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleX="45" /> </TextBlock.RenderTransform> </TextBlock> <TextBlock Canvas.Left="50" Canvas.Top="100" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleY="45" /> </TextBlock.RenderTransform> </TextBlock> <TextBlock Canvas.Left="150" Canvas.Top="100" FontFamily="Arial" FontSize="30" Foreground="Red" Text="Текст" > <TextBlock.RenderTransform> <SkewTransform AngleX="20" AngleY="20" /> </TextBlock.RenderTransform> </TextBlock> </Canvas> |
Искажение текста | |
| Вид в браузере | ||
|
||
| № | Код | Вид в браузере |
| 6.5.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="0" Height="0"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform CenterX="0"
CenterY="10" AngleX="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в горизонтальном направлении. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
| № | Код | Вид в браузере |
| 6.5.9 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="0" Height="0"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10" Canvas.Top="10"
Width="100" Height="50"
Fill="yellow" Stroke="red"
StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<SkewTransform CenterX="10"
CenterY="0" AngleY="45" />
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Искажение фигуры в вертикальном направлении. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
| № | Код | Вид в браузере |
| 6.5.10 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Трансформированная фигура --> <Canvas Width="0" Height="0" Canvas.Left="0" Canvas.Top="0"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <SkewTransform CenterX="10" CenterY="10" AngleX="25" AngleY="25" /> </Canvas.RenderTransform> </Canvas> </Canvas> |
|
|
| Описание | ||
Искажение фигуры в обоих направлениях. Компенсация смещения с помощью атрибутов CenterX и CenterY |
||
Трансформация MatrixTransform представляет собой способ компактной записи серии преобразований. Графически эта команда не содержит собственных изменений объекта. Она лишь выражает применение одной или нескольких команд типа RotateTransform, SkewTransform, ScaleTransform и TranslateTransform. Математически, все преобразования могут быть выражены в виде матрицы третьего порядка следующим образом:
Команда будет выглядеть так:
(M11, M12, M21, M22, OffsetX, OffsetY)
Каждое из преобразований представляется своей матрицей и соответствующей командой MatrixTransform.
Команда TranslateTransform:
Matrix="1 0 0 1 dx dy"
Команда RotateTransform:
Matrix=" cos(a) sin(a) –sin(a) cos(a) 0 0"
Команда ScaleTransform:
Matrix=" sx 0 0 sy 0 0"
Команда SkewTransform (AngleX):
Matrix="1 0 tg(a) 1 0 0"
Команда SkewTransform (AngleY):
Matrix="1 tg(a) 0 1 0 0"
Практически, для перехода к новой форме записи нужно просто взять исходные параметры команды и аккуратно их подставить в нужные позиции. Для команд RotateTransform, SkewTransform (AngleX) и SkewTransform (AngleY) дополнительно следует вычислить тригонометрические функции углов. В табл. 6.6 приводятся примеры использования этой записи.
| № | Код | Вид в браузере |
|---|---|---|
| 6.6.1 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="1 0 0 1 100 75"/>
<!--<TranslateTransform X="100"
Y="75"/>-->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды TranslateTransform в форме MatrixTransform |
||
| № | Код | Вид в браузере |
| 6.6.2 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="150"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform x:Name="my
MatrixTransform">
<MatrixTransform.Matrix >
<Matrix M11="1"
M12="0" M21="0" M22="1"
OffsetX="100" OffsetY="75"/>
<!--<TranslateTransform X="100"
Y="75"/>-->
</MatrixTransform.Matrix>
</MatrixTransform>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Задание атрибута x:Name позволяет обращаться к преобразованию программным способом. Кроме того, здесь, в отличие от предыдущего примера используется запись в виде тегов |
||
| № | Код | Вид в браузере |
| 6.6.3 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="2 0 0 1 0 0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Заметно смещение фигуры по сравнению с результатом, получаемым применением команды ScaleTransform |
||
| № | Код | Вид в браузере |
| 6.6.4 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50" Height="25"
Fill="skyblue" Stroke="red"
StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform Matrix="2 0 0 1 25 0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Для компенсации смещения указывается величина смещения, равная 25. Фактически, две последние цифры в значении атрибута Matrix – это смещение по горизонтали и вертикали |
||
| № | Код | Вид в браузере |
| 6.6.5 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="100"
Background="White"
x:Name="Page">
<Rectangle Canvas.Left="25"
Canvas.Top="25" Width="50"
Height="25" Fill="skyblue"
Stroke="red" StrokeThickness="2"/>
<Rectangle Canvas.Left="25"
Canvas.Top="50" Width="50"
Height="25" Fill="palegreen"
Stroke="red" StrokeThickness="2"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<MatrixTransform x:Name="
myMatrixTransform">
<MatrixTransform.Matrix >
<Matrix M11="2" M12="0"
M21="0" M22="1" OffsetX="25"
OffsetY="0"/>
<!--<ScaleTransform ScaleX="2"
ScaleY="1" /> -->
</MatrixTransform.Matrix>
</MatrixTransform>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
|
|
|
| Описание | ||
Запись команды ScaleTransform в форме MatrixTransform. Matrix превращается в тег, для которого указываются набор атрибутов. Здесь явно видно, что OffsetX и OffsetY определяют трансляцию (перенос) фигуры |
||
| № | Код | Вид в браузере |
| 6.6.6 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="210" Height="210"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Повернутая фигура-->
<Canvas Width="210" Height="210"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="105"
Canvas.Top="4" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<MatrixTransform Matrix="0.7071
0.7071 -0.7071 0.7071 0 0"/>
<!--<RotateTransform
Angle="45"/>-->
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды RotateTransform в форме MatrixTransform |
||
| № | Код | Вид в браузере |
| 6.6.7 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10" Canvas.Top="10"
Width="50" Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<MatrixTransform Matrix="1 0 1 1 0 0"/>
<!--<SkewTransform AngleX=
"45" /> -->
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды SkewTransform в форме MatrixTransform. tg(45)=1 |
||
| № | Код | Вид в браузере |
| 6.6.8 | ||
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="200" Height="200"
Background="White"
x:Name="Page">
<!--Исходная фигура-->
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<!--Трансформированная фигура -->
<Canvas Width="200" Height="200"
Canvas.Left="0" Canvas.Top="0">
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="100"
Height="50" Fill="yellow"
Stroke="red" StrokeThickness="4"/>
<Rectangle Canvas.Left="10"
Canvas.Top="10" Width="50"
Height="25" Fill="green"
Stroke="red" StrokeThickness="4" />
<Canvas.RenderTransform>
<TransformGroup>
<MatrixTransform Matrix="1 1 0 1 0 0"/>
<!--<SkewTransform AngleY="45" />-->
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
|
|
|
| Описание | ||
Запись команды SkewTransform в форме MatrixTransform. tg(45)=1 |
||
Мы разобрали запись в виде матрицы отдельных команд. Немного более сложно обстоят дела с записей нескольких команд, например, TranslateTransform и SkewTransform в виде одной матрицы. Результирующая матрица представляет собой произведение отдельных матриц. Рассмотрим для начала произведение матриц, содержащих по две строки и два столбца:
Обратите внимание на индексы – индекс 12, к примеру, означает, что элемент b12 находится в первой строке и втором столбце. Результирующая матрица получается сложением и умножением отдельных элементов по следующей схеме (рис. 6.10):
(рис 6.10) Умножение матриц второго порядка
Аналогичным образом осуществляется умножение матриц третьего порядка:
$$$$ \begin{vmatrix} a_{11}a_{12}a_{13\\ a_{21}a_{22}a_{23}\\ a_{31}a_{32}a_{33} \end{vmatrix}* \begin{vmatrix} b_{11}b_{12}b_{13}\\ b_{21}b_{22}b_{23}\\ b_{31}b_{32}b_{33} \end{vmatrix}=\\= \begin{vmatrix} a_{11}*b_{11}+a_{12}*b_{21}+a_{13}*b_{31}a_{11}*b_{12}+a_{12}*b_{22}+a_{13}*b_{32}a_{11}*b_{13}+a_{12}*b_{23}+a_{13}*b_{33}\\ a_{21}*b_{11}+a_{22}*b_{21}+a_{23}*b_{31}a_{21}*b_{12}+a_{22}*b_{22}+a_{23}*b_{32}a_{21}*b_{13}+a_{22}*b_{23}+a_{23}*b_{33}\\ a_{31}*b_{11}+a_{32}*b_{21}+a_{33}*b_{31}a_{31}*b_{12}+a_{32}*b_{22}+a_{33}*b_{32}a_{31}*b_{13}+a_{32}*b_{23}+a_{33}*b_{33} \end{vmatrix}$$ $$Для отдельного элемента результирующей матрицы, находящегося во второй строке первого столбца можно выделить схему (рис. 6.11):
(рис 6.11) Умножение матриц третьего порядка
Итак, для получения результирующей матрицы нескольких команд нужно записать отдельные матрицы, а затем их перемножить. В табл. 6.7 приведены примеры подобных матриц.
| № | Код | Вид в браузере |
|---|---|---|
| 6.7.1 | ||
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="200" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Трансформированная фигура --> <Canvas Width="200" Height="200" Canvas.Left="0" Canvas.Top="0"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <MatrixTransform Matrix="1 0 1 1 -10 0"/> <!--<SkewTransform AngleX="45" /> <TranslateTransform X="-10" Y="0"/> --> </Canvas.RenderTransform> </Canvas> </Canvas> |
|
|
| Описание | ||
Преобразование состоит из двух команд. Запишем их отдельные матрицы:
Вычисляем произведение матриц: $$$$ \begin{vmatrix} 100\\ 010\\ -1001 \end{vmatrix}* \begin{vmatrix} 100\\ 110\\ 001 \end{vmatrix}=\\= \begin{vmatrix} 1*1+0*1+0*01*0+0*1+0*01*0+0*0+0*1\\ 0*1+1*1+0*00*0+1*1+0*00*0+1*0+0*1\\ -10*1+0*1+1*0-10*0+0*1+1*0-10*0+0*0+1*1 \end{vmatrix}=\\= $$\begin{vmatrix} 100\\ 110\\ -1001 \end{vmatrix}$$ $$
Результирующая команда: |
||
Запись серии команд в виде матрицы позволяет сократить запись и, следовательно, уменьшить размер XAML – документа.
Вычисление матриц может показаться сложно задачей, существенно затрудняющей создание пользовательского интерфейса приложения. Однако для перемножения матриц в C# уже есть встроенные методы и классы. Типичный фрагмент кода для получения результирующей матрицы записывается достаточно лаконично:
private void multiplicationExample()
{
Matrix matrix1 = new Matrix(5, 10, 15, 20, 25, 30);
Matrix matrix2 = new Matrix(2, 4, 6, 8, 10, 12);
// matrixResult is equal to (70,100,150,220,240,352)
Matrix matrixResult = Matrix.Multiply(matrix1, matrix2);
// matrixResult2 is also
// equal to (70,100,150,220,240,352)
Matrix matrixResult2 = matrix1 * matrix2;
}
Готовая матрица может быть связана с графическим объектом на стадии выполнения кода.
Для вычисления матриц может применяться еще одно средство, позволяющее весьма наглядно понять логику работы. Пакет ) – мощное средство для решения широкого класса вычислительных задач, содержит удобные инструменты для работы с матрицами. После установки и запуска программы можно сразу приступать к вычислениям. В главном меню выбираем "Insert – Matrix" ( или нажимаем Ctrl+M) (рис. 6.12):
(рис 6.12) Вставка матрицы
В появившемся диалоговом окне выбираем матрицы размером 3х3 (рис.6.13 ):
(рис 6.13) Определение размера матрицы
В документе появляется шаблон, в который можно вводить числа (рис. 6.14):
(рис 6.14) Шаблон матрицы
После завершения ввода вводим знак равенства "=" и программа автоматически отображает результирующую матрицу (рис. 6.15):
(рис 6.15) Готовые матрицы
Программа поддерживает также вычисление тригонометрических функций, которые можно задавать непосредственно в текстовом виде.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.