Алгоритмы растровой графики. Представление отрезка в растровой форме.
P 1, P 2, …, P n, где P i и P i+1 - соседние 8 – связные точки (|x i+1 - x i | 1 и |y i+1 - y i | 1 4 – связные точки (|x i+1 - x i | + |y i+1 - y i | 1
Простейший алгоритм построения отрезка Уравнение прямой y = kx + b, где k = (y 2 - y 1 ) /(x 2 - x 1 ) (x 1, y 1 ) (x 2, y 2 ) void Line1 (int x1, int y1, int x2, int y2) { double k, b; int x; k = (y2-y1)/((x2-x1); b = y1 – kx1; for (x=x1; x x2; x++) putpixel (x, round(k*x+b), color); }
x i+1 – x i = 1 k = y / x = y. x i+1 = x i + 1 y i+1 = y i + y = y i + k Простейший пошаговый алгоритм Если k > 1: y i+1 = y i + 1 => x i + 1 = x i + x = x i + 1/k void Line2 (int x1, int y1, int x2, int y2) { float y,m; int x, dx, dy; if (x1 != x2) { dy = y2 - y1; dx = x2 - x1; k = dy/dx; for (x = x1, y = y1; x x2; x++, y+=k) putpixel (x, round(y), color); } else f or (x = x1, y = y1; y y2; y++) putpixel (x, round(y), color); }
Алгоритм Брезенхема. Если (s – t) > 0 T i Если (s – t) < 0 S i s = (dy/dx) * (r + 1) - q t = q (dy/dx) * (r + 1) s – t = 2(dy/dx) * (r + 1) - 2q – 1 dx * (s - t) = 2(r*dy - q*dx) + 2dy – dx d i = 2(x i-1 *dy - y i-1 *dx) + 2dy – dx d i+1 = 2(x i *dy- y i *dx) + 2dy – dx d i+1 – d i = 2dy(x i – x i-1 ) - 2dx( y i – y i-1 )
Алгоритм Брезенхема. d i = 2(x i-1 *dy - y i-1 *dx) + 2dy – dx d i+1 – d i = 2dy(x i – x i-1 ) - 2dx( y i – y i-1 ) d i+1 = d i + 2dy - 2dx( y i – y i-1 ) Если d i < 0 d i+1 = d i + 2dy Если d i > 0 d i+1 = d i + 2dy - 2dx d 1 = 2dy - dx
Алгоритм Брезенхема (пример реализации на языке СИ). Если d i < 0 d i+1 = d i + 2dy Если d i > 0 d i+1 = d i + 2dy - 2dx d 1 = 2dy - dx void Line3 (int x1, int y1, int x2, int y2) { int x, y, dx, dy, sx, sy, d, d1, d2, i; dx = abs(x2 - x1); dy = abs(y2 - y1); sx = x2 >= x1?1:-1; sy = y2 >= y1?1:-1; if (dy dx) { d = (dy
Алгоритм Брезенхема (пример реализации на языке СИ). Если d i < 0 d i+1 = d i + 2dx Если d i > 0 d i+1 = d i + 2dx - 2dy d 1 = 2dx - dy else // (dy > dx) { d = (dx
Функции, осуществляющие построение и вывод на экран отрезка. Функция line() проводит отрезок от точки (X 1,Y 1 ) до точки (X 2,Y 2 ). #include void far line(int x1,int y1,int x2,int y2 ); Функция line()
Функции, осуществляющие построение и вывод на экран отрезка. Функция linerel( ) проводит отрезок от текущей позиции до точки, заданной смещением dx и dy от текущей позиции. #include void far linerel ( int dx, int dy ); Функция linerel( )
Функции, осуществляющие построение и вывод на экран отрезка. Функция lineto( ) проводит отрезок от текущей позиции до точки, заданной координатами X и Y. #include void far lineto ( int x, int y); Функция lineto( )
Функции вывода основных графических примитивов. Функция arc( ) выводит дугу окружности. #include void far arc(int x,int y,int stangle, int endangle,int radius); Функция arc( )
Функции вывода основных графических примитивов. Функция circle() выводит окружность #include void far circle ( int x, int y, int radius) Функция circle()
Функции вывода основных графических примитивов. Функция ellipse() выводит эллипс (или эллиптическую дугу). #include void far ellipse (int x,int y,int stangle, int endangle,int xradius,int yradius ); Функция ellipse()
Предопределённые стили линии. linestyle=3 linestyle=1 linestyle=0 linestyle=2 Функция setlinestyle(). Функция setlinestyle() выполняет выбор(задание) стиля линии #include void setlinestile ( int linestyle, unsigned upattern, int thickness);
Предопределённые режимы вывода. определяет, каким образом будут выводиться на экран пикселы, образующие графические примитивы: а) переопределяя (заменяя) пикселы на экране текущим цветом (mode=0); б) как результат выполнения операции XOR кода текущего цвета и кода цвета пиксела на экране, через которые линия проходит (mode=1). Таким образом, данная функция устанавливает соответствующим образом разряды 3 и 4 регистра сдвига данных/выбора функции либо в 00b, либо в 11b. Функция setwritemode(). Функция setwritemode() задаёт атрибут режима вывода графических примитивов #include void setwritemode(int mode);