|
ZX News
#03
28 февраля 1997 |
|
Вращение картинок - алгоритм поворота изображения относительно заданного центра.

(C)1997 Bob Klubov
Долой горизонтальность!
В этой статье пойдет речь о двух прог-
раммах, имеющихся в приложении, которые
предназначены для поворота изображения
относительно заданного центра на опреде-
ленный угол. Заняться этой проблемой ме-
ня побудило то, что большинство всяких
надписей (названия фирм, игр, мегадем и
прочих логотипов) расположены строго го-
ризонтально или вертикально, что уже на-
било оскомину. Конечноже такое простран-
ственное положение объясняется простотой
рисования, но ведь нужно совершенство-
вать дизайн своих программ. Нельзя от-
брасывать и тот факт, что при раскраши-
вании "повернутых" изображений начинает-
ся война не на жизнь, а на смерть с ат-
рибутами. Ну тут ничем помочь не могу,-
выкручивайтесь сами как хотите! Еще нуж-
но остановиться на вот каком нюансе: при
повороте изображения на угол не кратный
90 градусам наблюдается незначительное
искажение изображения. Причину этих ис-
кажений можно понять, если посмотреть
рис.1 и почитать дальше.
Например, мы поворачиваем
пиксель 1 относительно пи-
кселя 0 на 45 градусов пo
часовой стрелке в пиксель
2. Так как пиксель, эле-
ментарный элемент изобра-
жения, имеет форму квадра-
та, причем две его стороны строго гори-
зонтальны, а две строго вертикальны,
то пиксели 0 и 1 попадают строго в свои
"лунки", но у пикселя 2 все стороны нак-
лонены на 45 градусов и поэтому здесь
возникает спорный вопрос: в какую из че-
тырех "лунок" его следует поместить. В
идеальном случае пиксель 2 нужно было бы
каким-то образом оставить таким, какой
он есть (квадрат, повернутый на 45 гра-
дусов).
Итак, в приложении к жур-
налу имеется две программы:
Rotat0.0 и Rotat1.0. Первая
из них работает быстрее, но
не очень качественно, вто-
рая работает медленнее
(очень медленно), но с бо-
лее высоким качеством. Ре-
зультаты работы обеих прог-
рамм представлены на рис.2
(рис.2а поворачивался на 45
градусов при помощи Ro-
tat0.0 - рис.2б; при помощи
Rotat1.0 - рис.2в).
А теперь я попытаюсь рассказать об ал-
горитмах программ и почему их, собствен-
но говоря, две. Обе программы внешне ра-
ботают одинаково:
1. спрашивают: показать ли каталог?
2. ввод имени и загрузка картинки под
адрес 16384 и длиною 6144;
3. при помощи клавиш Q, A, O, P и M
указывается центр вращения;
4. ввод угла поворота (против часовой
стрелки);
5. ввод имени для отгрузки "повернуто-
го" изображения;
6. поворот изображения;
7. отгрузка полученной картинки.
Алгоритмы же несколько отличаются.
Причем отличается только само вращение.
В Rotat0.0 вращение происходит следующим
образом:
1. считываются в память координаты всех
засвеченных точек (nx,ny);
2. очистка экрана;
3. каждая точка поворачивается на за-
данный угол вокруг центра и печата-
ется по новой координате (rx,ry).
Но изображение при таком алгоритме по-
лучается неважное. Объяснение этому я
найти не могу, поэтому пришлось исполь-
зовать другой алгоритм, который работает
как-бы наоборот. В Rotat1.0 вращение
происходит следующим образом:
1. берем координату левой нижней точки
(nx,ny);
2. поворачиваем на угол, обратный за-
данному, получая новые координаты
(rx,ry);
3. смотрим, засвечен ли пиксель по ко-
ординате (rx,ry). Если засвечен, то
ставим точку по координате (nx,ny);
4. Переход к следующей точке и переход
на пункт 1, пока не переберем все
точки экрана, а их 256*176 штук.
При использовании этого алгоритма изо-
бражение получается получше. Более про-
должительное время работы второго алго-
ритма связано с тем, что в нем перебира-
ются все пиксели экрана, а не только за-
свеченные, как в Rotat0.0.
Еще следует отметить,
что обе программы на
97% написаны в Бейси-
ке и в следствие это-
го сильно тормозят. Я
не дружу с калькуля-
тором Спектрума, поэ-
тому написал все в
Бейсике.
В последнее время циркулируют слухи о
том, что многие команды пишут графичес-
кие редакторы. Так попробуйте реализо-
вать функцию поворота изображения в сво-
их творениях, это очень нужно.
Да, чуть не забыл: во время поворота
изображения программой Rotat0.0, новое
строится сразу; во время поворота прог-
раммой Rotat1.0, новое строится в памяти
и лишь в конце перебрасывается на экран.
Время работы первой программы зависит от
количества засвеченных пикселей, а время
работы второй - всегда примерно одинако-
во: чуть больше часа (кто вас научил так
ругаться?!).
На этом время нашего эфира подошло к
концу. До новых встреч
____________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 3 ноября