Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Эффект Twirl или "Закручивание" |
Автор: asmworm 28.2.2006, 18:01 |
Всем привет ![]() Столкнулся с такой проблемой: надо сделать преобразование изображения с эффектом Twirl(в фотошопе, или Whirl в GIMP) Скиньте плиз алгоритм такого преобразования. Я в нэте нашёл только исходники.... И разжуйте плз как после преобразования делать наложение изображения ![]() |
Автор: SoWa 28.2.2006, 20:02 |
Каждый пиксель изображения очевидно поворачиваешь относительно центра картинки. Делишь картинку на линии толщиной в одну точку. И каждая точка более удаленная от центра вращается на больший градус. |
Автор: asmworm 28.2.2006, 21:53 | ||
Наоборот на меньший градус. Но тут много нюансов, и хотелось бы услышать более конкретные выкладки, тобишь конкретный алгоритм ![]() |
Автор: NewDima 9.3.2006, 10:44 |
Выбираешь центр Twirl(хватаешь [x, y]) Потом радиус-вектором рошагиваеш по каждому пикселу, ватаешь его цвет, в зависимости от того, как далеко он от [x, y], поворачиваешь на угол. Здесь чем больше расстояние от [x, y], тем меньшее перемещение по окружности этого пиксила с центром в [x, y]. Слушай, алгоритм простой, здесь писанина. На чем пишешь? Добавлено @ 10:51 Забыл напомнить, чтобы предыдущий рисунок загонял в буфер, и с него считывал, а заносил например на экран, или в другой буфер... ![]() Добавлено @ 10:57 Если быть конкретнее, то можно прошагивать по cos и sin но здесь может быть накладка, из-за погрешности могут получиться пропущенные пикселы. Тогда лучше прошагивать все точки, и смотреть, удовлетворяют ли они уравнению окружности от TWIRL. Затем смотришь расстояние от [x, y] и в соответственно установленном тобой масштабе сдвигаешь пиксел по окружности, я типа такого делал, но Исхв не осталось. ![]() |
Автор: asmworm 10.3.2006, 19:59 | ||
А как быть с наложением пиксела в финальный буфер? Я так подозреваю что там должно быть какое-то усреднение, а то если без него то в итоге эффект получится зернистый.Просто посмотрел исходники GIMP ![]() Просто ,как бы, если в финальный, то по идее если он залит черным цветом тогда интенсивность цвета пиксела, допустим на 1 шаге(тоесть 1 пиксела) резко упадёт. Если смешивать с исходным то тоже гамазня какаето получится.Или финальный буфер должен быть прозрачным? П.С. пишу на С++ только вроде писанины стокоже ![]() ![]() |
Автор: Kostt 10.3.2006, 20:24 |
Понятное дело, надо усреднять по нескольким соседним пикселям. См. теорию компьютерную графики ( билинейная, трилинейная интерполяция и т.п.) |
Автор: asmworm 10.3.2006, 23:11 | ||
Вопрос собсно состоял так: по какому буферу надо усреднять, и каким должен быть финальный буфер если усреднять по нему |
Автор: NewDima 11.3.2006, 10:22 |
Финальный буфер делай прозрачным. Получается так, бирешь с исходника, кладешь в другой буфер преобразованное. Причем, если пиксель, который берешь, не входит в окружность твирла, то его кладешь без изменений.![]() |
Автор: asmworm 11.3.2006, 11:59 | ||
Ну тогда алгоритм я понял так: Выбираем центр x,y Выбираем радиус преобразования R Вибираем угол преобразования A Преобразование состоит в следующем: есть ф-ция f(_r) которая возвращает угол в зависимости от текущего радиуса который принадлежит промежутку [0;R]. Проводим преобразование по всему входному буферу при этом в финальном буфере делая усреднение по каждой преобразованной точке... f(_r) - я так понимаю линейная ф-ция, ну мне так показалось после того как я заглянул в фотошоп, и f(_R)=0 , f(0+)"A. И радиус там выбирается таким образом: он делает преобразование не по окружности а по элипсу так что большая и малая полуось это половина соотвествующей стороны прямоугольника изображения. Я всё правильно понял? |
Автор: NewDima 11.3.2006, 13:27 | ||||
Все то все, только вот если по твоей логике судить, что преобразования проходят по эллипсу, то значит, что если рименить к изображению фильтр, то его наибольшее из измерений может измениться. На практике я этого не наблюдал.
область обрабатываемого изображения Всегда получается квадратом, а это значит, что малая и большая полуоси - равны, а значит это окружность.
Если ты хочешь как можно точнее приблизить филтр к фотошопному, то нужно не заглядывать, а посиди порассматривай. Я минут 30 сейчас сидел эксперементировал. Код (сырой, но исполняющий) написал на паскале в течение 20 минут. Пиши ![]() |
Автор: asmworm 11.3.2006, 19:45 | ||||
Интерестно как это так он(фотошоп) применяет фильтр по окружности в прямоугольном изображении ![]() А то что в алгоритме не эллипс я то догадался ![]() Ладно, вобщем я понял, спасибо |
Автор: NewDima 13.3.2006, 01:30 |
Ну понял, молодец, только не цетирую фразы целиком |