Преобразования и системы координат
Предположим, что нужно использовать систему координат, начало которой расположено внутри клиентской области, а не в ее верхнем левом углу. Зададим, например, в качестве начала координат точку, удаленную на 100 точек от левого края и на 50 точек от верхнего края клиентской области. Такая система координат показана на приведенном ниже рисунке.
------------
When you make the call myGraphics.DrawLine(myPen, 0, 0, 160, 80)
, you get the line shown in the following illustration.
The coordinates of the endpoints of your line in the three coordinate spaces are as follows:
World | (0, 0) to (160, 80) |
Page | (100, 50) to (260, 130) |
Device | (100, 50) to (260, 130) |
Note that the page coordinate space has its origin at the upper-left corner of the client area; this will always be the case. Also note that because the unit of measure is the pixel, the device coordinates are the same as the page coordinates. If you set the unit of measure to something other than pixels (for example, inches), then the device coordinates will be different from the page coordinates.
The world transformation, which maps world coordinates to page coordinates, is held in the Transform property of the Graphics class. In the preceding example, the world transformation is a translation 100 units in the x direction and 50 units in the y direction. The following example sets the world transformation of a Graphics object and then uses that Graphics object to draw the line shown in the preceding figure:
myGraphics.TranslateTransform(100, 50); myGraphics.DrawLine(myPen, 0, 0, 160, 80); |
При вызове метода myGraphics.DrawLine(myPen, 0, 0, 160, 80) на экран выводится линия, изображенная на приведенном ниже рисунке.
---------
Ниже приведены координаты конечных точек линии в трех системах координат.
Объемные координаты | от (0, 0) до (160, 80) |
Страничные координаты | от (100, 50) до (260, 130) |
Координаты устройства | от (100, 50) до (260, 130) |
Обратите внимание, что начало отсчета страничного пространства координат расположено в верхнем левом углу клиентской области, такое положение является стандартным для этого пространства координат. Также обратите внимание, что, так как единицей измерения является точка, координаты устройства совпадают со страничными координатами. Если задать единицу измерения, отличную от точки, например сантиметр, тогда координаты устройства будут отличаться от страничных координат.
За объемное преобразование, которое служит для перевода объемных координат в страничные, отвечает свойство Transform класса Graphics. В предыдущем примере объемное преобразование заключалось в смещении на 100 единиц вдоль оси X и на 50 единиц вдоль оси Y. В приведенном ниже примере демонстрируется задание объемного преобразования для объекта Graphics и использование этого объекта Graphics для рисования линии, изображенной на предыдущем рисунке.
-------------------
The page transformation maps page coordinates to device coordinates. The Graphics class provides the PageUnit and PageScale properties for manipulating the page transformation. The Graphics class also provides two read-only properties, DpiX and DpiY, for examining the horizontal and vertical dots per inch of the display device.
You can use the PageUnit property of the Graphics class to specify a unit of measure other than the pixel.
Note: |
You cannot set the PageUnit property to World, as this is not a physical unit and will cause an exception. |
The following example draws a line from (0, 0) to (2, 1), where the point (2, 1) is 2 inches to the right and 1 inch down from the point (0, 0):
myGraphics.PageUnit = GraphicsUnit.Inch; myGraphics.DrawLine(myPen, 0, 0, 2, 1); |
Note: |
If you don't specify a pen width when you construct your pen, the preceding example will draw a line that is one inch wide. You can specify the pen width in the second argument to the Pen constructor: |
Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX); |
If we assume that the display device has 96 dots per inch in the horizontal direction and 96 dots per inch in the vertical direction, the endpoints of the line in the preceding example have the following coordinates in the three coordinate spaces:
World | (0, 0) to (2, 1) |
Page | (0, 0) to (2, 1) |
Device | (0, 0, to (192, 96) |
Note that because the origin of the world coordinate space is at the upper-left corner of the client area, the page coordinates are the same as the world coordinates.
You can combine the world and page transformations to achieve a variety of effects. For example, suppose you want to use inches as the unit of measure and you want the origin of your coordinate system to be 2 inches from the left edge of the client area and 1/2 inch from the top of the client area. The following example sets the world and page transformations of a Graphics object and then draws a line from (0, 0) to (2, 1):
Преобразование, переводящее страничные координаты в координаты устройства, называется страничным преобразованием. За страничное преобразование отвечают свойства PageUnit и PageScale класса Graphics. Класс Graphics также содержит два доступных только для чтения свойства DpiX и DpiY, позволяющих узнать количество точек на дюйм в используемом устройстве отображения.
Свойство PageUnit класса Graphics можно использовать для задания единицы измерения, отличной от точки.
Примечание. |
Свойству PageUnit нельзя присвоить значение World, поскольку эта единица измерения не является физической. В этом случае возникнет исключение. |
В приведенном ниже примере демонстрируется рисование линии из точки с координатами (0, 0) в точку с координатами (2, 1), где точка с координатами (2, 1) расположена на 2 дюйма правее и на 1 дюйм ниже точки с координатами (0, 0).
--------
Примечание. |
Если специально не задать толщину пера, в предыдущем примере будет выведена линия толщиной в один дюйм. Толщину пера можно указать в качестве второго аргумента конструктора Pen. |
------
Если предположить, что устройство отображения содержит 96 точек на дюйм по горизонтали и 96 точек на дюйм по вертикали, координаты конечных точек прямой, нарисованной в предыдущем примере, в каждом из трех пространств координат будет совпадать с приведенными ниже значениями.
Объемные координаты | от (0, 0) до (2, 1) |
Страничные координаты | от (0, 0) до (2, 1) |
Координаты устройства | от (0, 0) до (192, 96) |
Обратите внимание, что, так как начало отсчета объемных координат расположено в верхнем левом углу клиентской области, страничные координаты совпадают с объемными.
Сочетание объемного и страничного преобразования позволяет получать различные эффекты. Например, предположим, что нужно использовать дюймы в качестве единицы измерения, а начало координат должно быть расположено в 2 дюймах от левого края клиентской области и в 1/2 дюйма от верхней границы клиентской области. В приведенном ниже примере демонстрируется задание объемного и страничного преобразования для объекта Graphics и последующее рисование линии из точки с координатами (0, 0) в точку с координатами (2, 1).
myGraphics.TranslateTransform(2, 0.5f); myGraphics.PageUnit = GraphicsUnit.Inch; myGraphics.DrawLine(myPen, 0, 0, 2, 1); |
The following illustration shows the line and coordinate system.
If we assume that the display device has 96 dots per inch in the horizontal direction and 96 dots per inch in the vertical direction, the endpoints of the line in the preceding example have the following coordinates in the three coordinate spaces:
World | (0, 0) to (2, 1) |
Page | (2, 0.5) to (4, 1.5) |
Device | (192, 48) to (384, 144) |
-----
На приведенном ниже рисунке изображена полученная линия и система координат.
---------------------
Если предположить, что устройство отображения содержит 96 точек на дюйм по горизонтали и 96 точек на дюйм по вертикали, координаты конечных точек прямой, нарисованной в предыдущем примере, в каждом из трех пространств координат будет совпадать с приведенными ниже значениями.
Объемные координаты | от (0, 0) до (2, 1) |
Страничные координаты | от (2; 0,5) до (4; 1,5) |
Координаты устройства | от (192, 48) до (384, 144) |
Matrix Representation of Transformations
An m×n matrix is a set of numbers arranged in m rows and n columns. The following illustration shows several matrices.
You can add two matrices of the same size by adding individual elements. The following illustration shows two examples of matrix addition.
An m×n matrix can be multiplied by an n×p matrix, and the result is an m×p matrix. The number of columns in the first matrix must be the same as the number of rows in the second matrix. For example, a 4×2 matrix can be multiplied by a 2×3 matrix to produce a 4×3 matrix.
- Объекты Graphics и Drawing в Windows Forms
- Обзор графических возможностей
- Интерфейс управляемых классов
- Три категории графических служб
- Двухмерная векторная графика
- Рисунки
- Типографская разметка
- Структура интерфейса Graphics
- Важные классы
- Прямые и кривые линии и фигуры
- Общие сведения о векторной графике
- Методы рисования с помощью графических объектов
- Рисование линии
- Создание объекта Pen
- Штриховые линии и завершения отрезков
- Рисование прямоугольника
- Рисование эллипса
- Рисование дуги
- Рисование многоугольника
- Физические и математические сплайны
- Рисование сплайнов Безье
- Применение контуров
- Сплошные кисти
- Штриховые кисти
- Текстурные кисти
- Градиентные кисти
- Управляемый интерфейс для кривых
- Использование областей
- Задание области обрезки
- Сглаживание прямых и кривых линий
- Неровности
- Сглаживание
- Работа с растровыми и векторными изображениями с использованием классов Image, Bitmap и Metafile
- Типы точечных рисунков
- Форматы графических файлов
- Форматы метафайлов
- Типы файлов и клонирование
- Варианты DrawImage
- Системы координат и преобразования
- Типы систем координат
- Преобразования и системы координат
- Матричное представление преобразований
- Составные преобразования
- Глобальные и локальные преобразования
- Глобальные преобразования
- Локальные преобразования
- Использование управляемых графических классов Приступая к программированию графики
- Создание объектов Graphics для рисования
- Создание объекта Graphics
- PaintEventArgs в обработчике события Paint
- Получение ссылки на объект Graphics из объекта PaintEventArgs в событии Paint
- Рисование фигур и изображений и управление ими
- Создание фигурной формы Windows Forms
- Компиляция кода
- Копирование пикселов для уменьшения эффекта дрожания изображения в Windows Forms
- Компиляция кода
- Рисование линий и фигур с помощью пера
- Рисование линий с помощью пера
- Компиляция кода
- Рисование прямоугольников с помощью пера
- Компиляция кода
- Задание толщины и выравнивания пера
- Изменение толщины пера
- Изменение выравнивания пера
- Создание вложенного пера
- Рисование линий с наконечниками
- Компиляция кода
- Соединение линий
- Компиляция кода
- Рисование пользовательских пунктирных линий
- Компиляция кода
- Рисование линии с текстурным заполнением
- Компиляция кода
- Использование кисти для заливки фигур
- Заливка фигуры сплошным цветом
- Компиляция кода
- Штриховая заливка фигуры
- Компиляция кода
- Заливка фигуры текстурой, созданной на основе изображения
- Компиляция кода
- Мозаичное заполнение фигуры заданным изображением
- Мозаичное заполнение изображением
- Горизонтальное зеркальное преобразование изображения при мозаичном заполнении
- Вертикальное зеркальное преобразование изображения при мозаичном заполнении
- Мозаичное заполнение с зеркальным отображением изображения по горизонтали и вертикали
- Заливка фигур с помощью градиентной кисти
- Создание линейного градиента
- Использование горизонтальных линейных градиентов
- Настройка линейных градиентов
- Создание диагональных линейных градиентов
- Создание градиента вдоль контура
- Заливка эллипса с использованием градиента контура
- Указание точек на границе
- Настройка градиента контура
- Настройка с интерполяцией
- Задание центральной точки
- Применение гамма-коррекции к градиенту
- Компиляция кода
- Загрузка и отображение метафайлов
- Компиляция кода
- Обрезка и масштабирование изображений
- Компиляция кода
- Поворот, отражение и наклон изображений
- Компиляция кода
- Использование режима интерполяции для управления качеством изображений при масштабировании
- Компиляция кода
- Создание эскизов изображений
- Компиляция кода
- Повышение производительности за счет отключения автоматического масштабирования
- Компиляция кода
- Чтение метаданных изображения
- Значение
- Пример Описание
- Компиляция кода
- Создание растрового изображения во время выполнения
- Компиляция кода
- Извлечение связанного с файлом значка в Windows Forms
- Компиляция кода
- Альфа-смешение цвета для линий и заливок
- Рисование непрозрачных и полупрозрачных линий
- Компиляция кода
- Рисование непрозрачными и полупрозрачными кистями
- Компиляция кода
- Использование режима комбинирования для управления альфа-смешением
- Компиляция кода
- Использование матрицы цветов для задания значений прозрачности в изображениях
- Компиляция кода
- Шрифты и текст
- Разработка шрифтов и их семейств
- Компиляция кода
- Рисование текста в указанной позиции
- Рисование строки текста с использованием gdi
- Компиляция кода
- Многострочный вывод текста в прямоугольнике
- Рисование текста с переносом по словам в прямоугольнике с помощью gdi
- Компиляция кода
- Рисование текста с использованием gdi
- Компиляция кода
- Выравнивание рисуемого текста
- Рисование центрированного текста с использованием gdi (DrawText)
- Компиляция кода
- Вывод текста по вертикали
- Компиляция кода
- Установка позиций табуляции для выводимого текста
- Компиляция кода
- Перебор установленных шрифтов
- Компиляция кода
- Получение метрик шрифтов
- Компиляция кода
- Сглаживание текста
- Компиляция кода
- Построение и рисование кривых
- Рисование фундаментальных сплайнов
- Рисование фундаментального сплайна в форме колокола
- Рисование замкнутого фундаментального сплайна
- Изменение изгиба фундаментального сплайна
- Компиляция кода
- Рисование отдельного сплайна Безье
- Компиляция кода
- Рисование последовательности сплайнов Безье
- Компиляция кода
- Построение и рисование контуров
- Создание изображений из прямых и кривых линий и геометрических фигур
- Компиляция кода
- Заливка открытых фигур
- Компиляция кода
- Спрямление участков кривой
- Спрямление контура
- Использование объемного преобразования
- Различные типы преобразований
- Значение порядка преобразований
- Примеры составных преобразований
- Использование графических контейнеров
- Управление состоянием объекта Graphics
- Состояние объекта Graphics
- Параметры качества
- Преобразования
- Область обрезки
- Использование вложенных графических контейнеров
- Преобразования во вложенных контейнерах
- Обрезка во вложенных контейнерах
- Параметры качества во вложенных контейнерах
- Различные уровни вложенных контейнеров
- Использование областей
- Проверка нахождения указателя мыши в заданной области
- Компиляция кода
- Обрезка изображения по границам области обрезки
- Компиляция кода
- Получение списка установленных кодировщиков
- Компиляция кода
- Получение списка установленных декодеров
- Компиляция кода
- Компиляция кода