русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Аффинные преобразования графических изображений


Дата добавления: 2013-12-23; просмотров: 4381; Нарушение авторских прав


Очистка объекта Graphics

Создание фигурных изображений

Фигурные изображения создаются с помощью технологии вырезания и создания масок. Маской называется любой замкнутый контур, ограничивающий область, на которой можно рисовать. Если создать маску в объекте Graphics, то, какое бы изображение не было создано, на экране останется только та его часть, которая ограничена этой маской. Маска создаётся с помощью метода SelClip объекта Graphics. Этот метод имеет два аргумента: обязательный – форма маски и необязательный – определяющий, как новая вырезаемая область будет объединена с предыдущей. Форма маски может быть в виде прямоугольника – Rectangle и в виде любого произвольного контура – GraphicPath. Второй аргумент – CombineMode может принимать пять вариантов значений из предлагаемого системой списка. Этот аргумент используется редко.

Пример. Отобразить на форме круглое изображение, созданное из заданного графического файла, в круге, вписанном в прямоугольник с координатами левого верхнего угла (50,50) и размерами 150 х 150 пикселей. Поскольку методы вырезания круга отсутствуют, то такой круг необходимо создать на основе объекта Path:

Visual Basic .Net:

Dim img As Image

img = Image.FromFile("C\pic1.jpg")

Dim g As Graphics

g = Me.CreateGraphics

Dim r1 AsNew Rectangle(50, 50, 150, 150)

Dim p1 AsNew GraphicsPath

p1.AddEllipse(r1)

g.SetClip(p1)

g.DrawImage(img, 50, 50, 150, 150)

Visual C#:

Image img;

img = Image.FromFile("C:\\ pic1.jpg");

Graphics g;

g = this.CreateGraphics();

Rectangle r1 = new Rectangle(50, 50, 150, 150);

GraphicsPath p1 = new GraphicsPath();

p1.AddEllipse(r1);

g.SetClip(p1);

g.DrawImage(img, 50, 50, 150, 150);

 

Содержимое объекта Graphics можно удалить с помощью метода Clear. При этом задаётся цвет, которым закрашивается объект, например:



Visual Basic .Net:

Dim g As Graphics

g = Me.CreateGraphics

g.Clear(Me.BackColor)

Visual C#:

Graphics g;

g = this.CreateGraphics();

g.Clear(this.BackColor);

 

Данный пример очищает объект Graphics, связанный с формой и закрашивает его фоновым цветом формы.

 

Аффинные преобразования - это преобразования (плоскости или пространства), при которых прямые переходят в прямые, и сохраняется их параллельность (в частности, преобразования подобия), например:

       
   

 


В компьютерной графике используются три типа преобразования графики – масштабирование, перенос и поворот. Эти преобразования осуществляются с использованием объекта Matrix, входящим в пространство имён System.Drawing.Drawing2D и определяющим параметры преобразования. Само преобразование осуществляется над графическим объектом Path, в который предварительно необходимо поместить нужные фигуры – прямоугольники, эллипсы, линии и изображения.

Поворот вокруг заданной точки осуществляется с использованием метода RotateAt объекта Matrix. Аргументами данного метода являются угол поворота, выраженный в градусах и координаты точки, вокруг которой осуществляется поворот. При этом сам код рисования остается неизменным.

Пример.Нарисовать на форме прямоугольник размером 100 х 100 пикселей с координатами верхнего левого угла (10,10) коричневым пером толщиной в 3 пикселя а затем повернуть его на 15 градусов. Код, рисующий прямоугольник в форме при загрузке необходимо записать в обработчик события Form_Paint:

Visual Basic .Net:

Dim path As New GraphicsPath

Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)

Dim g As Graphics

g = Me.CreateGraphics

path.AddRectangle(rect)

g.DrawPath(New Pen(Color.Brown, 3), path)

Visual C#:

GraphicsPath path = new GraphicsPath();

Rectangle rect = new Rectangle(10, 10, 100, 100);

Graphics g;

g = this.CreateGraphics();

path.AddRectangle(rect);

g.DrawPath(new Pen(Color.Brown, 3), path);

 

Код, обеспечивающий поворот, необходимо написать, например, в обработчике события Click кнопки с надпистью «Поворот» (координаты центра прямоугольника находятся в точке (60,60).

Visual Basic .Net:

Dim path As New GraphicsPath

Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)

Dim g As Graphics

g = Me.CreateGraphics

path.AddRectangle(rect)

Dim matr1 AsNew Matrix

matr1.RotateAt(15, New Point(60, 60))

path.Transform(matr1)

g.DrawPath(New Pen(Color.Brown, 3), path)

Visual C#:

GraphicsPath path = new GraphicsPath();

Rectangle rect = new Rectangle(10, 10, 100, 100);

Graphics g;

g = this.CreateGraphics();

path.AddRectangle(rect);

Matrix matr1 = new Matrix();

matr1.RotateAt(15, new Point(60, 60));

path.Transform(matr1);

g.DrawPath(new Pen(Color.Brown, 3), path);

 

При этом на форме будет отражены и начальное и повёрнутое изображение. Чтобы начальное изображение исчезало, объект Graphics необходимо очищать. С помощью данного метода и с использованием таймера можно, например, обеспечить динамическое вращение рисунка.

Перенос осуществляется с использованием методаTranslate. Аргументами данного метода являются координаты новой точки, в которую необходимо перенести левый верхний угол объекта Path.

Пример.Переместить прямоугольник разметром 100 х 100 пикселей, с левым верхним углом с координатами (10,10) в точку с координатами (20,20).

Visual Basic .Net:

Dim path As New GraphicsPath

Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)

Dim g As Graphics

g = Me.CreateGraphics

path.AddRectangle(rect)

Dim matr1 AsNew Matrix

matr1.Translate(20, 20)

path.Transform(matr1)

g.DrawPath(New Pen(Color.Brown, 3), path)

Visual C#:

GraphicsPath path = new GraphicsPath();

Rectangle rect = new Rectangle(10, 10, 100, 100);

Graphics g;

g = this.CreateGraphics();

path.AddRectangle(rect);

Matrix matr1 = new Matrix();

matr1.Translate(20, 20);

path.Transform(matr1);

g.DrawPath(new Pen(Color.Brown, 3), path);

 

Метод Translate может быть также использован для преобразования прямоугольников в параллелограммы. Для этого в качестве аргументов объекта Matrix передаются объект, определяющий прямоугольник и массив из трёх точек, определяющих левый верхний, правый верхний и левый нижний углы параллелограмма, например:

Visual Basic .Net:

Dim path As New GraphicsPath

Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)

Dim g As Graphics

g = Me.CreateGraphics

path.AddRectangle(rect)

Dim point() As Point = {New Point(110, 10), New Point(210, 10), New Point(170, 110)}

Dim matr1 AsNew Matrix(rect, point)

path.Transform(matr1)

g.DrawPath(New Pen(Color.Brown, 3), path)

Visual C#:

GraphicsPath path = new GraphicsPath();

Rectangle rect = new Rectangle(10, 10, 100, 100);

Graphics g;

g = this.CreateGraphics();

path.AddRectangle(rect);

Point[] point = { new Point(110, 10), new Point(210, 10), new Point(170, 110) };

Matrix matr1 = new Matrix(rect, point);

path.Transform(matr1);

g.DrawPath(new Pen(Color.Brown, 3), path);

 

Сжатие или расширение рисунка осуществляется с помощью метода Scale объекта Matrix. Аргументами данного метода являются коэффициенты сжатия по горизонтали и вертикали. Значения меньше 1 приводят к сжатию, больше 1 – к расширению.

Пример.Сжать прямоугольник размером 100 х 100 пикселей с координатами левого верхнего угла (10,10) в два раза по горизонтали и вертикали. Для этого необходимо применить коэффициенты сжатия, равные 0.5:

Visual Basic .Net:

Dim path As New GraphicsPath

Dim rect As Rectangle = New Rectangle(10, 10, 100, 100)

Dim g As Graphics

g = Me.CreateGraphics

path.AddRectangle(rect)

Dim matr1 AsNew Matrix

matr1.Scale(0.5, 0.5)

path.Transform(matr1)

g.DrawPath(New Pen(Color.Brown, 3), path)

Visual C#:

GraphicsPath path = new GraphicsPath();

Rectangle rect = new Rectangle(10, 10, 100, 100);

Graphics g;

g = this.CreateGraphics();

path.AddRectangle(rect);

Matrix matr1 = new Matrix();

matr1.Scale(0.5f, 0.5f);

path.Transform(matr1);

g.DrawPath(new Pen(Color.Brown, 3), path);

 

Все методы преобразования объекта Matrix могут использоваться комбинированно. В этом случае у них можно задать дополнительный аргумент – элементы списка MatrixOrder. Значение Prepend производит указанное преобразование до начала других преобразований, значение Append – после. Это позволяет производить преобразования не одновременно, а в определённой последовательности.

Объект Graphics имеет собственные методы для аффинных преобразований: ScaleTransform для сжатия, TranslateTransform для перемещения и RotateTransform для поворота. Синтаксис этих методов аналогичен синтаксису соответствующих методов объекта Matrix, за исключением метода для поворота, где задаётся только угол поворота, т.к. поворот осуществляется только относительно левого верхнего угла объекта Graphics (например, если пользователь рисует на форме, то поворот осуществляется относительно левого верхнего угла формы). Преимуществом данных методов является то, что с их помощью преобразовываются все нарисованные пользователем фигуры, в том числе и изображения.

 



<== предыдущая лекция | следующая лекция ==>
Комбинация графических изображений | Градиент на основе объекта GraphicsPath


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.