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, новое строится в памяти и лишь в конце перебрасывается на экран. Время работы первой программы зависит от количества засвеченных пикселей, а время работы второй - всегда примерно одинако- во: чуть больше часа (кто вас научил так ругаться?!). На этом время нашего эфира подошло к концу. До новых встреч ____________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 10 октября