C#.программирование 2D и 3D векторной графики [Н. А. Тюкачев] (pdf) читать постранично, страница - 12
Книга в формате pdf! Изображения и текст могут не отображаться!
[Настройки текста] [Cбросить фильтры]
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
Последние комментарии
1 день 20 часов назад
1 день 20 часов назад
1 день 21 часов назад
1 день 21 часов назад
1 день 23 часов назад
1 день 23 часов назад