Н. А. Тюкачев - C#.программирование 2D и 3D векторной графики
Название: | C#.программирование 2D и 3D векторной графики | |
Автор: | Н. А. Тюкачев | |
Жанр: | Учебники и самоучители по компьютеру, C, C++, C# | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | - | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "C#.программирование 2D и 3D векторной графики"
Читаем онлайн "C#.программирование 2D и 3D векторной графики". [Страница - 13]
Bitmap(theImg,
new Size(theImg.Width/2,theImg.Height/2));
Brush tBrush =
new TextureBrush(smallImg,
new Rectangle (0,0, smallImg.Width,
41
smallImg.Height));
Font tFont = new Font ("Times New Roman", 32,
FontStyle.Bold | FontStyle.Italic);
g.DrawString("Hello, from Beginning Visual",
tFont, tBrush, ClientRectangle);
tBrush.Dispose();
tFont.Dispose();
}
При запуске проекта на выполнение на экране должно появиться
изображение, показанное на рисунке 2.15.
Рис. 2.15. Прорисовка текста с использованием изображения
Метод DrawString() в качестве аргументов принимает строку,
шрифт, текстурную кисть и ограничивающий прямоугольник.
2.4.5. РАСТРОВОЕ РИСОВАНИЕ ЛИНИЙ
Существует два режима рисования линий: без сглаживания и со
сглаживанием. В рисовании без сглаживания все пиксели имеют один и тот
же цвет и линия рисуется ступенчато. При рисовании со сглаживанием
некоторые пиксели будут закрашиваться частично, позволяя избавиться от
ступенчатого представления наклонных линий. Однако для более
качественного рисования требуется больше времени для рисования.
На рисунке 2.16 представлена линия, нарисованная без использования
сглаживания, и та же линия, нарисованная с использованием сглаживания.
Рис. 2.16. Линия без сглаживания и со сглаживанием
42
Свойство перечислимого типа SmoothingMode класса Graphics
возвращает или задает качество визуализации графического объекта и может
принимать следующие значения:
– Invalid – недопустимый режим;
– Default – нет сглаживания;
– HighSpeed – высокая скорость: нет сглаживания;
– HighQuality – рисование со сглаживанием;
– None – нет сглаживания;
– AntiAlias – рисование со сглаживанием.
Ниже представлен пример, в котором рисуется эллипс без сглаживания,
со сглаживанием HighQuality и со сглаживанием AntiAlias.
Листинг 2.14. Рисование эллипса с различными сглаживаниями
private void Draw()
{
g = CreateGraphics();
g.Clear(Color.White);
Pen myPen = new Pen(Color.Black, 0.5F);
g.PageUnit = GraphicsUnit.Millimeter;
g.DrawEllipse(myPen, 10, 10, 30, 30);
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawEllipse(myPen, 10 + 35, 10, 30, 30);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.DrawEllipse(myPen, 10 + 70, 10, 30, 30);
}
Результат работы программы представлен на рисунке 2.17.
Рис. 2.17. Рисование эллипса со сглаживанием
Отличия между сглаживанием HighQuality и сглаживанием
AntiAlias в глаза не бросаются. Однако два последних эллипса
существенно отличаются от первого.
43
2.4.6. АЛГОРИТМЫ РИСОВАНИЯ ЛИНИЙ
К алгоритмам рисования линий предъявляются высокие требования:
должны работать быстро;
не должны потреблять большие объёмы оперативной памяти;
не использовать медленную вещественную арифметику;
для каждого пиксела производить как можно меньше вычислений;
линия должна быть связным объектом, то есть его пикселы должны
располагаться рядом друг с другом.
Рассмотрим наиболее известные алгоритмы растеризации отрезка:
рисование DDA-линии, алгоритм Брезенхема и алгоритм Ву.
2.4.6.1. Алгоритм DDA
Самым простым и очевидным способом создания алгоритма рисования
отрезка от точки (x0;y0) до точки (x1;y1) является использование
параметризированного уравнения прямой линии
x(t) = x0 + t *Δx;
y(t) = y0 + t *Δy.
(2.1)
В этом уравнении (x(t); y(t)) является точкой отрезка, а значение t
пробегает интервал от 0 до L. Значения L,x,y определяются по формулам
L = max(|x0 .. x1|; |y0 .. y1|);
x = x1..x0;
y = y1..y0.
(2.2)
Все числа являются вещественными, и для работы с ними используется
вещественная арифметика. При отрисовке каждого пиксела значения x(t) и
y(t) округляются и дают его целочисленные координаты. Именно поэтому
алгоритм сокращённо называется DDA от английского выражения Digital
Differential Analyzer (цифровой дифференциальный анализатор).
–
–
–
–
–
Листинг 2.15. Алгоритм DDA
private void DDA(int x1, int y1, int x2, int y2)
{
float L=Math.Max(Math.Abs(x2-x1),Math.Abs(y2-y1));
float dx=(x2-x1)/L;
float dy = (y2 - y1) / L;
float x = x1;
float y = y1;
for (int i=0; i --">
new Size(theImg.Width/2,theImg.Height/2));
Brush tBrush =
new TextureBrush(smallImg,
new Rectangle (0,0, smallImg.Width,
41
smallImg.Height));
Font tFont = new Font ("Times New Roman", 32,
FontStyle.Bold | FontStyle.Italic);
g.DrawString("Hello, from Beginning Visual",
tFont, tBrush, ClientRectangle);
tBrush.Dispose();
tFont.Dispose();
}
При запуске проекта на выполнение на экране должно появиться
изображение, показанное на рисунке 2.15.
Рис. 2.15. Прорисовка текста с использованием изображения
Метод DrawString() в качестве аргументов принимает строку,
шрифт, текстурную кисть и ограничивающий прямоугольник.
2.4.5. РАСТРОВОЕ РИСОВАНИЕ ЛИНИЙ
Существует два режима рисования линий: без сглаживания и со
сглаживанием. В рисовании без сглаживания все пиксели имеют один и тот
же цвет и линия рисуется ступенчато. При рисовании со сглаживанием
некоторые пиксели будут закрашиваться частично, позволяя избавиться от
ступенчатого представления наклонных линий. Однако для более
качественного рисования требуется больше времени для рисования.
На рисунке 2.16 представлена линия, нарисованная без использования
сглаживания, и та же линия, нарисованная с использованием сглаживания.
Рис. 2.16. Линия без сглаживания и со сглаживанием
42
Свойство перечислимого типа SmoothingMode класса Graphics
возвращает или задает качество визуализации графического объекта и может
принимать следующие значения:
– Invalid – недопустимый режим;
– Default – нет сглаживания;
– HighSpeed – высокая скорость: нет сглаживания;
– HighQuality – рисование со сглаживанием;
– None – нет сглаживания;
– AntiAlias – рисование со сглаживанием.
Ниже представлен пример, в котором рисуется эллипс без сглаживания,
со сглаживанием HighQuality и со сглаживанием AntiAlias.
Листинг 2.14. Рисование эллипса с различными сглаживаниями
private void Draw()
{
g = CreateGraphics();
g.Clear(Color.White);
Pen myPen = new Pen(Color.Black, 0.5F);
g.PageUnit = GraphicsUnit.Millimeter;
g.DrawEllipse(myPen, 10, 10, 30, 30);
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawEllipse(myPen, 10 + 35, 10, 30, 30);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.DrawEllipse(myPen, 10 + 70, 10, 30, 30);
}
Результат работы программы представлен на рисунке 2.17.
Рис. 2.17. Рисование эллипса со сглаживанием
Отличия между сглаживанием HighQuality и сглаживанием
AntiAlias в глаза не бросаются. Однако два последних эллипса
существенно отличаются от первого.
43
2.4.6. АЛГОРИТМЫ РИСОВАНИЯ ЛИНИЙ
К алгоритмам рисования линий предъявляются высокие требования:
должны работать быстро;
не должны потреблять большие объёмы оперативной памяти;
не использовать медленную вещественную арифметику;
для каждого пиксела производить как можно меньше вычислений;
линия должна быть связным объектом, то есть его пикселы должны
располагаться рядом друг с другом.
Рассмотрим наиболее известные алгоритмы растеризации отрезка:
рисование DDA-линии, алгоритм Брезенхема и алгоритм Ву.
2.4.6.1. Алгоритм DDA
Самым простым и очевидным способом создания алгоритма рисования
отрезка от точки (x0;y0) до точки (x1;y1) является использование
параметризированного уравнения прямой линии
x(t) = x0 + t *Δx;
y(t) = y0 + t *Δy.
(2.1)
В этом уравнении (x(t); y(t)) является точкой отрезка, а значение t
пробегает интервал от 0 до L. Значения L,x,y определяются по формулам
L = max(|x0 .. x1|; |y0 .. y1|);
x = x1..x0;
y = y1..y0.
(2.2)
Все числа являются вещественными, и для работы с ними используется
вещественная арифметика. При отрисовке каждого пиксела значения x(t) и
y(t) округляются и дают его целочисленные координаты. Именно поэтому
алгоритм сокращённо называется DDA от английского выражения Digital
Differential Analyzer (цифровой дифференциальный анализатор).
–
–
–
–
–
Листинг 2.15. Алгоритм DDA
private void DDA(int x1, int y1, int x2, int y2)
{
float L=Math.Max(Math.Abs(x2-x1),Math.Abs(y2-y1));
float dx=(x2-x1)/L;
float dy = (y2 - y1) / L;
float x = x1;
float y = y1;
for (int i=0; i --">