close

Вход

Забыли?

вход по аккаунту

?

23.Основные алгоритмы растровой графики Методические указания

код для вставкиСкачать
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Министерство образования и науки Российской Федерации
Ярославский государственный университет им. П.Г. Демидова
Кафедра информационных и сетевых технологий
ОСНОВНЫЕ АЛГОРИТМЫ
РАСТРОВОЙ ГРАФИКИ
Ярославль 2004
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
ББК В 185я73
О 75
УДК 002:372.8
Составитель: Н.В. Легков
Основные алгоритмы растровой графики: Метод. указания
/ Сост. Н.В. Легков; Яросл. гос. ун-т. Ярославль, 2004. 19 с.
Приводятся описания алгоритмов машинной графики. Рассмотрены алгоритмы закраски областей. Приведены алгоритмы Брезенхема и ЦДА для изображения отрезков. Рассмотрен алгоритм Брезенхема генерации окружности.
Пособие предназначено для студентов, обучающихся по специальности 351500 Математическое обеспечение и администрирование
информационных систем (дисц. “Компьютерная графика”, блок
ОПД), очной формы обучения.
Рецензент – кафедра информационных и сетевых технологий
ЯрГУ.
 Ярославский государственный университет, 2004
 Н.В. Легков, 2004
2
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Введение
В пособии будут описаны простейшие алгоритмы растровой графики, такие как генерация отрезка прямой, окружности или эллипса,
алгоритма закраски многоугольника или, в более общем случае, области плоскости.
Практически любой современный язык программирования имеет
стандартные процедуры, которые решают эти задачи (не говоря о
том, что для Windows набор таких алгоритмов является просто «системными» функциями). В связи с этим возникает вопрос для чего вообще необходимо изучать эти алгоритмы? Но в любом деле следует
начинать с чего-то, и если Вы собираетесь в дальнейшем решать задачи связанные с графикой, то знать, как реализуются простейшие из
алгоритмов, просто необходимо.
Мы будем изучать алгоритмы в общем виде, поэтому определимся с некоторыми условиями нашей работы. Будем считать, что устройством, на которое происходит вывод графики, является массив
Screen: array [0.. ScW-1,0..ScH-1] of TColor. Здесь TColor означает,
что элементы массива задают цвет соответствующей точки устройства. Для задания цвета мы будем использовать функцию
RGB(bR,bG,bB:byte), параметры которой задают соотношения красного, зеленого и синего цвета, например, такая запись:
Screen[12,15]:=RGB(255,255,255) будет означать, что мы "закрашиваем" точку с координатами (12,15) белым цветом. Будем считать, что,
если нам необходимо, мы можем не только присваивать значение
элементу массива, но и считывать цвет точки с произвольными координатами. В случае некоторого "реального" устройства будем считать, что точке с координатами (0,0) соответствует левый верхний
угол; при этом увеличение первой координаты означает движение
точки по горизонтали, а второй - по вертикали.
Прежде чем перейти непосредственно к алгоритмам генерации
растровых изображений, определим еще несколько понятий, которые
в дальнейшем будут нам полезны.
Назовем точки 4-соседями (или "непосредственными" соседями),
если у них отличается только одна из координат, и притом только на
1. Назовем точки 8-соседями (или "косвенными" соседями), если у
них отличается горизонтальная или вертикальная координата, но не
более чем на 1. Нетрудно заметить, что всякий непосредственный со3
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
сед является также и косвенным соседом. Всякая точка имеет 4 непосредственных и 8 косвенных соседей.
Итак, вводная часть закончена, и мы можем перейти к рассмотрению алгоритмов. Начнем мы, естественно, с главного, без чего нельзя
обойтись при работе с графикой, а именно - с построения отрезка, заданного своими концами.
1. Алгоритмы генерации растрового
представления отрезка
Для начала выскажем общие соображение относительно построения отрезка на экране.
Допустим, нам даны координаты начала (x1,y1) и конца (x2,y2) отрезка, тогда уравнение прямой, содержащей отрезок, может быть, записано в виде y=y1+k(x-x1), где k=(y2-y1)/(x2-x1), а x пробегает значения от x1 до x2 (мы пока исключаем из рассмотрения случай вертикального отрезка). Поскольку растровое изображение отрезка
содержит только точки с целочисленными координатами, то x будет
пробегать только целые значения из отрезка (x1,x2). И в случае |k| < 1
все прекрасно: изменяем значение x, по уравнению прямой высчитываем значение y, "закрашиваем" точку с координатами (x,y), переходим к началу цикла. Но не трудно, заметить, что в случае, когда
|k| > 1, наше представление отрезка будет иметь пробелы, так как изменение x на единицу приведет к изменению y более чем на единицу.
Поэтому в случае |k| > 1 переменные x и y надо поменять ролями.
Итак, мы практически получили искомый алгоритм, но вот только x и y могут (а в общем случае и будут) принимать вещественные
значения, что для нас совершенно недопустимо. Поэтому нам надо
ввести некоторое соглашение о том, каким образом мы будем "округлять" вещественные значения к целым. В связи с вопросом округления вернемся к определению 4- и 8-связности.
4
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Ниже представлены два алгоритма Брезенхема получения 4- и 8связного представления отрезка, заданного координатами концов.
Разницу между двумя этими представлениями можно увидеть на рисунке:
И тот, и другой алгоритмы используют только целочисленную
арифметику, что, естественно, улучшает скорость работы. Саму
структуру алгоритмов можно понять из блок-схем, которые приведены в приложениях 1 и 2. Различие в работе понятно и связано с разницей между 4- и 8-связным представлением: в случае 4-связности на
каждом шаге мы изменяем на единицу только одну из координат текущей точки, а в случае 8-связности мы можем менять сразу и вертикальную и горизонтальную координаты текущей точки, но снова не
более чем на единицу.
2. Алгоритм закраски
многоугольников
Под многоугольником далее будем понимать фигуру, ограниченную на плоскости простой (непересекающейся) замкнутой ломаной.
Сама ломаная задается координатами вершин Ai(xi,yi), i=1..n, при
этом соседние точки в этом списке являются вершинами ломаной.
Задача "закраски" многоугольника заключается в инициализации
всех его внутренних точек.
Наиболее простой, но и наиболее медленный алгоритм, решающий эту задачу, состоит в том, чтобы проверить все точки плоскости
(под плоскостью здесь, естественно, понимается устройство, на которое осуществляется вывод, в нашем случае это массив Screen) на
принадлежность многоугольнику. Несколько ускорить этот алгоритм
можно, если вместо проверки всех точек плоскости проверять только
точки минимального квадрата, заключающего многоугольник, найти
который не составляет труда. Ясно, что и при таком усовершенствовании скорость работы алгоритма оставляет желать лучшего.
5
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Еще один вариант решения задачи - это алгоритм сканирования
строк. Последовательно проходим все горизонтальные линии плоскости и находим отрезки на прямой, внутренние для многоугольника.
Для данного алгоритма достаточно искать только точки пересечения
сканирующей линии с ребрами многоугольника. Для оптимизации алгоритма можно упорядочить ребра в порядке возрастания наибольшей
из ординат концов. При перемещении сканирующей прямой сверху
вниз проверке на пересечение подвергаются лишь те ребра, у которых
значение максимальной ординаты больше ординаты сканирующей
прямой. Такой алгоритм пригоден для заполнения произвольных многоугольников. Но если многоугольник выпуклый, то алгоритм можно
упростить и существенно повысить его эффективность. Для этого заметим, что границу выпуклого многоугольника можно разбить на две
ломаные: "левую" и "правую" и, возможно, два ребра: "верхнее" и
"нижнее", так что каждая из боковых ломаных имеет ровно одно пересечение с каждой сканирующей прямой. Далее, используя алгоритм
Брезенхема и одновременно генерируя растровое представление для
ребер левой и правой части ломаных границ, получаем левый и правый пиксели границы многоугольника на каждой сканирующей горизонтальной прямой. Последовательно заполняя интервалы между этими пикселями для каждого значения ординаты от верхней строки развертки до нижней, получим растровое представление многоугольника.
Один частный случай этого алгоритма получил широкое распространение в связи с задачами трехмерной графики: это закраска треугольника. В этом случае можно существенно упростить алгоритм.
3. Алгоритм закраски произвольной
области с затравкой
Рассмотрим еще один класс алгоритмов "закраски", а именно алгоритмы заполнения области с затравкой. В этих алгоритмах предполагается, что граница области задана на растровой плоскости и указана одна из внутренних точек области, которая называется затравочной. Требуется заполнить определенным цветом связную компоненту
области, содержащую затравочную точку. Под связностью будем понимать 4- или 8-связности, определенные выше (какая связность конкретно используется, зависит от формулировки задачи).
6
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Данному классу алгоритмов можно сопоставить физическую интерпретацию, а именно представить, что в затравочной точке помещен источник, заливающий всю область определенным цветом. Поэтому часто такие алгоритмы называют алгоритмами заливки. В связи
с той физической интерпретацией, которую мы имеем, можно получить очевидный алгоритм, решающий задачу заливки области. Допустим, нам надо "закрасить" цветом IColor область, граница которой
имеет цвет BColor, и нам задана точка с координатами (x0,y0) в качестве затравочной.
1. Поместим затравочную точку на стек.
2. Извлекаем координаты точки с вершины стека в переменные
(x,y).
3. Если Screen[x,y]=IColor, то Screen[x,y]=IСolor.
4. Для всех соседних точек (xg,yg) повторить пункт 5.
5. Если Screen[xg,yg]<>BColor и Screen[xg,yg]<>IColor, то поместить точку (xg,yg) на стек.
6. Если стек не пуст, то переходим к пункту 3.
Соседние точки пункта 4 алгоритма определяются в зависимости
от того, какое условие связности определенно в условии задачи.
Приведенный алгоритм весьма неэффективен, так как предполагает неоднократную обработку одних и тех же точек и неконтролируемый рост размера стека. Поэтому усовершенствуем его, используя
идею, примененную нами в алгоритме построчного сканирования.
Заметим, что на каждой строке множество точек, подлежащих закраске, состоит из интервалов, принадлежащих внутренности области. Эти интервалы отделены друг от друга интервалами из точек,
принадлежащих границе или внешности области. Кроме того, если
набор точек образует связный интервал, принадлежащий внутренней
части области, то точки над и под этим интервалом либо являются
граничными, либо принадлежат внутренней части области. Последние могут служить затравочными для строк, лежащих выше и ниже
рассматриваемой строки. Суммируя все это, можно предложить следующий алгоритм.
1. Поместим затравочную точку на стек.
2. Извлекаем координаты точки с вершины стека в переменные
(x,y).
7
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
3. Заполняем максимально возможный интервал, в котором находится точка, вправо и влево, вплоть до достижения граничных точек.
4. Запоминаем крайнюю левую xl и крайнюю правую xr абсциссы
заполненного интервала.
5. В соседних строках над и под интервалом (xl,xr) находим не заполненные к настоящему моменту внутренние точки области, которые объединены в интервалы, а правый конец каждого такого интервала помещаем на стек.
6. Если стек не пуст, то переходим к пункту 3.
Алгоритм правильно заполняет любую область, даже такую
сложную, как на рисунке 1.
Рис. 1
Более подробно структуру алгоритма можно рассмотреть при помощи блок-схемы, (см. приложение 3).
4. Алгоритм Брезенхема
построения окружности
Из геометрии мы знаем, что окружность с центром в точке (xc,yc)
и радиусом r, задается параметрически с помощью системы уравнений:
x = xc + r cosα

где α ∈ [0;2π).
x = xc + r cosα
Отсюда несложно получить алгоритм генерации окружности:
1. Полагаем А=0.
2. Если А больше либо равно 2π, то окружность отрисована.
3. Вычислим x=Trunc(xc+r*cos(A)), y=Trunc(yc+r*sin(A)).
4. Screen[x,y]=Color.
5. Увеличим A на d (A:=A+d) и перейдем к шагу 2.
8
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
В данном алгоритме d подбираем в зависимости от радиуса окружности и разрешающей способности устройства вывода. При малых
значениях d возможно неоднократная активация одних и тех же точек,
при больших - возможны "пробелы" в сгенерированной окружности.
Но основная причина, по которой использование данного алгоритма
нецелесообразно, не сложность в выборе параметра d, а очень низкая
скорость работы, связанная с использованием вещественных чисел, и
тем более вычислением тригонометрических функций.
Но не будем спешить отказываться от этого алгоритма. Его простота поможет нам получить некоторые усовершенствования, которые
можно будет использовать в дальнейшем.
Для начала постараемся уменьшить количество вычислений, воспользуемся свойством симметрии окружности относительно диаметра,
будем рассчитывать только координаты точек верхней полуокружности, а нижнюю половину получим, используя свойство симметрии.
Новый алгоритм будет иметь вид:
1. Полагаем А=0.
2. Если А больше либо равно π, то окружность отрисована.
3. Вычислим x=Trunc(r*cos(A)), y=Trunc(r*sin(A)).
4. Screen[xc+x,yc+y]=Color.
5. Screen[xc+x,yc-y]=Color.
6. Увеличим A на d (A:=A+d) и перейдем к шагу 2.
Чуть побыстрее, но не настолько, чтобы успокоиться. Выделим
две простые идеи, используемые в этом алгоритме, которые будут
нам полезны в дальнейшем. Первая заключается в том, что на шаге 3
мы вычисляем координаты (x,y) точки на окружности радиуса r с центром в начале координат, а на шаге 4 просто осуществляем сдвиг.
Второе, благодаря симметрии, мы имеем: если точка (x,y) лежит на
окружности с центром в точке (0,0), то и точка (x,-y), также лежит на
этой окружности. Последнее утверждение можно развить, а именно:
если точка (x,y) лежит на окружности с центром в точке (0,0), то и
точки (x,-y); (-x,-y); (-x,y) ;(y,x), (y,-x); (-y,-x); (-y,x) также лежат на
этой окружности. Для проверки можно использовать следующее
уравнение, задающее окружность:
x2+y2=r2.
Итак, вся подготовительная работа выполнена. Допустим, у нас
есть функция (назовем ее NextPoint(x,y,r)), которая выдает нам точки,
лежащие на окружности с центром в нуле и радиуса r, при этом пусть
9
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
это будут точки из заштрихованного сектора (см. рис. 2). Тогда наш
алгоритм можно будет записать в виде:
1. y:=r; x:=0;
2. Screen[x+xc,y+yc]:=Color;
3. Screen[x+xc,-y+yc]:=Color;
4. Screen[-x+xc,y+yc]:=Color;
5. Screen[-x+xc,-y+yc]:=Color;
6. Screen[y+xc,x+yc]:=Color;
7. Screen[y+xc,-x+yc]:=Color;
8. Screen[-y+xc,x+yc]:=Color;
Рис. 2
9. Screen[-y+xc,-x+yc]:=Color;
10. NextPoint(x,y,r);
11. Если получили новую точку, то на шаг 2, иначе окружность
нарисована.
Осталось придумать, как работает функция NextPoint. Нетрудно
заметить, что координата x в заштрихованном секторе увеличивается
на единицу на каждом шаге (для проверки можно, например, подсчитать производную функции y=f(x),
задающей кусок окружности - она
будет больше 1). Так же ясно, что
координата y либо уменьшается на
единицу, либо остается без изменений. Итак, нам осталось научиться выбирать, куда переходить
из точки (xi, yi): либо в точку (xi+1,
yi), либо в точку (xi+1, yi-1). Для
того чтобы осуществить выбор,
рассмотрим две невязки:
di1=(xi+1)2+yi2-r2,
Рис. 3.
i
2
2 2
d 2=(xi+1) +(yi-1) -r .
А также будем следить за их суммой:
di=di1+di2.
Рассмотрим несколько вариантов расположения "вещественной"
окружности относительно "целых" точек (см. рис. 3).
Интуитивно понятно, что в случаях 1 и 2 надо "зажигать" точку 1,
а в случаях 4 и 5 - точку 2, случай 3 требует более тщательного рассмотрения. Попробуем формализовать все пять случаев при помощи
введенных параметров di; di1; di2:
10
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
di:
Случай 1. di1 <0, di2 <0 и, следовательно, di <0.
Случай 2. di1=0, di2<0 и, следовательно, di<0.
Случай 3. di1>0, di2<0 и, следовательно, имеем два варианта для
Случай 3.1. |di1|<|di2| и, следовательно, di<0.
Случай 3.2. |di1|>|di2| и, следовательно, di>0.
Случай 4. di1>0, di2=0 и, следовательно, di>0.
Случай 5. di1>0, di2>0 и, следовательно, di>0.
Подводя итог, имеем: в случае если di<0, надо активировать точку (xi+1,yi), а в случае если di > 0, надо активировать точку (xi+1,yi-1).
Осталось получить выражение для di:
di=di1+di2=(xi+1)2+yi2-r2+(xi+1)2+(yi-1)2-r2=2xi2+2yi2+4xi-2yi+3-2r2.
Теперь получим выражение di+1 через di, избавившись от неприятной операции возведения в квадрат. Пусть вначале yi+1=yi, тогда
di+1=2xi+12+2yi+12+4xi+1-2yi+1+3-2r2=di+4xi+6.
Теперь пусть yi+1=yi-1, тогда
di+1=2xi+12+2yi+12+4xi+1-2yi+1+3-2r2=di+4(xi-yi)+10.
Осталось получить значение d1 в начальной точке (x1=0,y1=r):
d1=3-2r.
Теперь можно записать полученный алгоритм:
1. y:=r; x:=0; d:=3-2r;
2. Если x > y, то выходим;
3. Screen[x+xc,y+yc]:=Color;
4. Screen[x+xc,-y+yc]:=Color;
5. Screen[-x+xc,y+yc]:=Color;
6. Screen[-x+xc,-y+yc]:=Color;
7. Screen[y+xc,x+yc]:=Color;
8. Screen[y+xc,-x+yc]:=Color;
9. Screen[-y+xc,x+yc]:=Color;
10. Screen[-y+xc,-x+yc]:=Color;
11. Если d < 0, то d:=d+4*x+6, переходим на Шаг 13;
12. d:=d+4(x-y)+10; y:=y-1;
13. x:=x+1;
14. Переходим на Шаг 2.
Сравниваем с нашим первым алгоритмом - практически ничего
похожего, первый был понятен, но работал медленно, во втором схо11
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
ду угадать, что он рисует окружность, невозможно, но зато скорость
работы намного выше.
Более подробно структуру алгоритма можно рассмотреть при помощи блок-схемы, см. приложение 4.
Литература
1. Аммерал Л. Интерактивная трехмерная машинная графика. М.: Сол
Систем, 1992. 317 c.
2. Аммерал Л. Машинная графика на персональных компьютерах.
М.:Сол Систем, 1992. 232 c.
3. Аммерал Л. Принципы программирования в машинной графике.
М.: Сол Систем, 1992. 224 c.
4. Аммерал Л. Программирование графики на Турбо Си. М.: Сол Систем, 1992. 221 c.
5. Гилой В. Интерактивная машинная графика: Структуры данных, алгоритмы, языки. М.: Мир, 1981. 384 c.
6. Иванов В.П., Батраков А.С. Трехмерная компьютерная графика
/ Под ред. Г.М. Полищука. М.: Радио и связь, 1995. 224 c.
7. Компьютеры: Справочное руководство: В 3 т. Т. 3. М.: Мир, 1986.
403 c.
8. Ньюмен У., Спрулл Р. Основы интерактивной машинной графики.
М.: Мир, 1976. 573 c.
9. Прокофьев Б.П. и др. Графические средства Turbo C и Turbo C++
/ Б.П. Прокофьев, Н.Н. Сухарев, Ю.Е. Храмов. М.: Финансы и статистика,
1992. 160 c.
10. Роджерс Д. Алгоритмические основы машинной графики. М.:
Мир, 1989. 503 c.
11. Романов В.Ю. Популярные форматы файлов для хранения графических изображений на IBM PC. М.: Унитех, 1992. 156 c.
12. Уилтон Р. Видеосистемы персональных компьютеров IBM PC и
PS/2: Руководство по программированию. М.: Радио и связь, 1994. 384 c.
13. Уинер Р. Язык Турбо Си. М.: Мир, 1991. 384 c.
14. Фоли Дж., Дэм А. Основы интерактивной машинной графики: В 2
кн. М.: Мир, 1985.
15. Шикин Е.В., Боресков А.В. Компьютерная графика. Динамика,
реалистические изображения. М.: ДИАЛОГ-МИФИ, 1995. 288 c.
12
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Приложение 1
Алгоритм Брезенхема генерации 4-связной развертки отрезка, заданного координатами концов.
procedure Line_4(x1,x2,y1,y2:integer;Color:TColor);
Отрезок рисуется цветом Color. В качестве выходного устройства
используется массив Screen:array[0..ScW-1,0..ScH-1] of TColor.
13
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Приложение 2
Алгоритм
Брезенхема генерации 8связной развертки отрезка, заданного координатами концов.
procedure
Line_8(x1,x2,y1,y2:int
eger;Color:TColor);
Отрезок рисуется
цветом Color. В качестве выходного устройства используется
массив
Screen:array
[0..ScW-1,0..ScH-1]
of TColor.
14
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Приложение 3
Алгоритм
procedure FillArea(x0,y0:integer;BC,IC:TColor);
Процедура заливает область с границей цвета BC. Цвет заливки IC.
Затравочная точка имеет координаты (x0,y0).
15
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
16
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Приложение 4
procedure Circle(xс,yс,r:integer;Color:TColor);
Алгоритм Брезенхема растровой развёртки окружности с центром в
точке (xc,yc) и радиусом r. Окружность рисуется цветом Color.
В качестве выходного устройства используется массив
Screen:array[0..ScW-1,0..ScH-1] of TColor.
17
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Содержание
Введение ....................................................................................................................................... 3
1. Алгоритмы генерации растрового представления отрезка ............ 4
2. Алгоритм закраски многоугольников............................................................. 5
3. Алгоритм закраски произвольной области с затравкой ................... 6
4. Алгоритм Брезенхема построения окружности........................................ 8
Литература ............................................................................................................................... 12
Приложение 1 ..................................................................................... 13
Приложение 2 ..................................................................................... 14
Приложение 3 ..................................................................................... 15
Приложение 4 ..................................................................................... 17
18
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
Учебное издание
Основные алгоритмы
растровой графики
Составитель Легков Николай Васильевич
Редактор, корректор А.А. Антонова
Компьютерная верстка И.Н. Ивановой
Подписано в печать 29.11.2004 г. Формат 60х84/16.
Бумага тип. Усл. печ. л. 1,16. Уч.-изд. л. 1,11.
Тираж 50 экз. Заказ .
Оригинал-макет подготовлен
в редакционно-издательском отделе ЯрГУ.
Отпечатано на ризографе.
Ярославский государственный университет.
150000 Ярославль, ул. Советская, 14.
19
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
20
Copyright ОАО «ЦКБ «БИБКОМ» & ООО «Aгентство Kнига-Cервис»
ОСНОВНЫЕ АЛГОРИТМЫ
РАСТРОВОЙ ГРАФИКИ
21
Документ
Категория
Без категории
Просмотров
1
Размер файла
276 Кб
Теги
указания, растровое, алгоритм, основные, методические, график
1/--страниц
Пожаловаться на содержимое документа