Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Эффект Twirl или "Закручивание"


Автор: asmworm 28.2.2006, 18:01
Всем привет smile

Столкнулся с такой проблемой: надо сделать преобразование изображения с эффектом Twirl(в фотошопе, или Whirl в GIMP)
Скиньте плиз алгоритм такого преобразования. Я в нэте нашёл только исходники....

И разжуйте плз как после преобразования делать наложение изображения smile

Автор: SoWa 28.2.2006, 20:02
Каждый пиксель изображения очевидно поворачиваешь относительно центра картинки. Делишь картинку на линии толщиной в одну точку. И каждая точка более удаленная от центра вращается на больший градус.

Автор: asmworm 28.2.2006, 21:53
Цитата(SoWa @ 28.2.2006, 20:02)
Каждый пиксель изображения очевидно поворачиваешь относительно центра картинки. Делишь картинку на линии толщиной в одну точку. И каждая точка более удаленная от центра вращается на больший градус.

Наоборот на меньший градус. Но тут много нюансов, и хотелось бы услышать более конкретные выкладки, тобишь конкретный алгоритм smile

Автор: NewDima 9.3.2006, 10:44
Выбираешь центр Twirl(хватаешь [x, y])
Потом радиус-вектором рошагиваеш по каждому пикселу, ватаешь его цвет, в зависимости от того, как далеко он от [x, y], поворачиваешь на угол. Здесь чем больше расстояние от [x, y], тем меньшее перемещение по окружности этого пиксила с центром в [x, y].
Слушай, алгоритм простой, здесь писанина.
На чем пишешь?
Добавлено @ 10:51
Забыл напомнить, чтобы предыдущий рисунок загонял в буфер, и с него считывал, а заносил например на экран, или в другой буфер... smile удачи!
Добавлено @ 10:57
Если быть конкретнее, то можно прошагивать по cos и sin но здесь может быть накладка, из-за погрешности могут получиться пропущенные пикселы. Тогда лучше прошагивать все точки, и смотреть, удовлетворяют ли они уравнению окружности от TWIRL. Затем смотришь расстояние от [x, y] и в соответственно установленном тобой масштабе сдвигаешь пиксел по окружности, я типа такого делал, но Исхв не осталось. smile

Автор: asmworm 10.3.2006, 19:59
Цитата(NewDima @ 9.3.2006, 10:44)
Выбираешь центр Twirl(хватаешь [x, y])
Потом радиус-вектором рошагиваеш по каждому пикселу, ватаешь его цвет, в зависимости от того, как далеко он от [x, y], поворачиваешь на угол. Здесь чем больше расстояние от [x, y], тем меньшее перемещение по окружности этого пиксила с центром в [x, y].
Слушай, алгоритм простой, здесь писанина.
На чем пишешь?
Добавлено @ 10:51
Забыл напомнить, чтобы предыдущий рисунок загонял в буфер, и с него считывал, а заносил например на экран, или в другой буфер... smile удачи!
Добавлено @ 10:57
Если быть конкретнее, то можно прошагивать по cos и sin но здесь может быть накладка, из-за погрешности могут получиться пропущенные пикселы. Тогда лучше прошагивать все точки, и смотреть, удовлетворяют ли они уравнению окружности от TWIRL. Затем смотришь расстояние от [x, y] и в соответственно установленном тобой масштабе сдвигаешь пиксел по окружности, я типа такого делал, но Исхв не осталось. smile

А как быть с наложением пиксела в финальный буфер? Я так подозреваю что там должно быть какое-то усреднение, а то если без него то в итоге эффект получится зернистый.Просто посмотрел исходники GIMP smile? ,там идёт усреднение. Только по какому буферу усреднять? Брать пикселы из исходного или финального?
Просто ,как бы, если в финальный, то по идее если он залит черным цветом тогда интенсивность цвета пиксела, допустим на 1 шаге(тоесть 1 пиксела) резко упадёт. Если смешивать с исходным то тоже гамазня какаето получится.Или финальный буфер должен быть прозрачным?

П.С. пишу на С++ только вроде писанины стокоже smile , поэтому можно и в псевдокоде, я пойму smile

Автор: Kostt 10.3.2006, 20:24
Понятное дело, надо усреднять по нескольким соседним пикселям. См. теорию компьютерную графики ( билинейная, трилинейная интерполяция и т.п.)

Автор: asmworm 10.3.2006, 23:11
Цитата(Kostt @ 10.3.2006, 20:24)
Понятное дело, надо усреднять по нескольким соседним пикселям. См. теорию компьютерную графики ( билинейная, трилинейная интерполяция и т.п.)

Вопрос собсно состоял так: по какому буферу надо усреднять, и каким должен быть финальный буфер если усреднять по нему

Автор: NewDima 11.3.2006, 10:22
Финальный буфер делай прозрачным. Получается так, бирешь с исходника, кладешь в другой буфер преобразованное. Причем, если пиксель, который берешь, не входит в окружность твирла, то его кладешь без изменений.
smile Удачи

Автор: asmworm 11.3.2006, 11:59
Цитата(NewDima @ 11.3.2006, 10:22)
Финальный буфер делай прозрачным. Получается так, бирешь с исходника, кладешь в другой буфер преобразованное. Причем, если пиксель, который берешь, не входит в окружность твирла, то его кладешь без изменений.
smile Удачи

Ну тогда алгоритм я понял так:
Выбираем центр x,y
Выбираем радиус преобразования R
Вибираем угол преобразования A
Преобразование состоит в следующем: есть ф-ция f(_r) которая возвращает угол в зависимости от текущего радиуса который принадлежит промежутку [0;R].
Проводим преобразование по всему входному буферу при этом в финальном буфере делая усреднение по каждой преобразованной точке...

f(_r) - я так понимаю линейная ф-ция, ну мне так показалось после того как я заглянул в фотошоп, и f(_R)=0 , f(0+)"A. И радиус там выбирается таким образом: он делает преобразование не по окружности а по элипсу так что большая и малая полуось это половина соотвествующей стороны прямоугольника изображения.

Я всё правильно понял?

Автор: NewDima 11.3.2006, 13:27
Все то все, только вот если по твоей логике судить, что преобразования проходят по эллипсу, то значит, что если рименить к изображению фильтр, то его наибольшее из измерений может измениться. На практике я этого не наблюдал.
Цитата

так что большая и малая полуось это половина соотвествующей стороны прямоугольника изображения

область обрабатываемого изображения Всегда получается квадратом, а это значит, что малая и большая полуоси - равны, а значит это окружность.

Цитата

ну мне так показалось после того как я заглянул в фотошоп

Если ты хочешь как можно точнее приблизить филтр к фотошопному, то нужно не заглядывать, а посиди порассматривай.
Я минут 30 сейчас сидел эксперементировал.
Код (сырой, но исполняющий) написал на паскале в течение 20 минут.
Пиши smile

Автор: asmworm 11.3.2006, 19:45
Цитата(NewDima @ 11.3.2006, 13:27)
Все то все, только вот если по твоей логике судить, что преобразования проходят по эллипсу, то значит, что если рименить к изображению фильтр, то его наибольшее из измерений может измениться. На практике я этого не наблюдал.
Цитата

так что большая и малая полуось это половина соотвествующей стороны прямоугольника изображения

область обрабатываемого изображения Всегда получается квадратом, а это значит, что малая и большая полуоси - равны, а значит это окружность.

Интерестно как это так он(фотошоп) применяет фильтр по окружности в прямоугольном изображении smile , кто не верит может сам заглянуть - там получается эллипс.
А то что в алгоритме не эллипс я то догадался smile
Ладно, вобщем я понял, спасибо

Автор: NewDima 13.3.2006, 01:30
Ну понял, молодец, только не цетирую фразы целиком

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)