Название: Пустить волну по рисунку Отправлено: blood_shadow от Август 10, 2011, 14:37 В общем устраиваюсь на работу дали испытательное задание (см. во вложении).
смысл задания - пустить волну со случайным углом со случайной точки Возникло пару вопросов по самой постановке задачи: 1. не могу понять пускать волну надо по всей горизонтали или только по розовой области которая обозначена на рисунку? подпись 'moving wave' - distortion effect zone (distortion is stretch) как-то немного вводит в заблуждение 2. если волна будет начинаться как показано на рисунке с точки А, второй конец волны будет в точке b или все-таки в точке С? (если в точке b - получается она будет висеть как-бы в воздухе) 3. надпись - "Optical distortion function should be defined as an input data. " - это вообще как? предоставить пользователю на выбор несколько ф-ций для моделирования волны? 4. и еще меня смущает 4 пункт задания- "every pass of wave has to start from random corner pixel", что это за corner pixel? это значит что волна может начинаться только с угла? зачем тогда на рисунке так не показано? Буду рад любым соображениям на данную тему :) Название: Re: Пустить волну по рисунку Отправлено: m_ax от Август 10, 2011, 15:31 Написано же, что волна плоская и её волновой вектор направлен под углом alpha.
Розовая область - это типа рассеиватель волны. Если бы этой области не было бы, то наблюдалось бы свободное распространение плоской волны (если смотреть с верху мы бы видели перпендикулярные к направлению волнового вектора прямые одинаковой фазы). Но поскольку есть рассеиватель он будет гасить падающую волну. Алгоритм взаимодействия волны с рассеивателем там вроде написан.. Как то так.. Название: Re: Пустить волну по рисунку Отправлено: blood_shadow от Август 10, 2011, 15:48 Написано же, что волна плоская и её волновой вектор направлен под углом alpha. извиняюсь за свою не сообразительность, но как-то впервые сталкиваюсь с таким...Розовая область - это типа рассеиватель волны. Если бы этой области не было бы, то наблюдалось бы свободное распространение плоской волны (если смотреть с верху мы бы видели перпендикулярные к направлению волнового вектора прямые одинаковой фазы). Но поскольку есть рассеиватель он будет гасить падающую волну. Алгоритм взаимодействия волны с рассеивателем там вроде написан.. Как то так.. хочу уточнить - то есть волна будет существовать только в этой "розовой" области? 2. насчет "every pass of wave has to start from random corner pixel" это значит что волна может начинаться только с 1 из 4 углов? Название: Re: Пустить волну по рисунку Отправлено: m_ax от Август 10, 2011, 16:17 Написано же, что волна плоская и её волновой вектор направлен под углом alpha. извиняюсь за свою не сообразительность, но как-то впервые сталкиваюсь с таким...Розовая область - это типа рассеиватель волны. Если бы этой области не было бы, то наблюдалось бы свободное распространение плоской волны (если смотреть с верху мы бы видели перпендикулярные к направлению волнового вектора прямые одинаковой фазы). Но поскольку есть рассеиватель он будет гасить падающую волну. Алгоритм взаимодействия волны с рассеивателем там вроде написан.. Как то так.. хочу уточнить - то есть волна будет существовать только в этой "розовой" области? 2. насчет "every pass of wave has to start from random corner pixel" это значит что волна может начинаться только с 1 из 4 углов? Вот вид свободной волны (2D): A(x,y, t) = A0*cos(k_x * x + k_y * y - omega * t) Волновой вектор k и omega связаны между собой (как именно, вы найдёте думаю). Амплитуда A(x,y,t) - принимает значения от -A0 до A0. Например A0 - соответствует красному цвету, а -A0 - синиму. Тогда для промежуточного значения A - находите свой цвет. Вот если бы рассеивателя не было бы (что советую вам вначале реализовать) Всё происходит так: 1) Задаёте k, угол alpha и соответственно получаете k_x, k_y. 2) При t = 0 Вы имеете функцию A(x, y, 0) 3) Красите весь ваш image в соответствии с A(x, y, 0) и сохраняете картинку или показываете. 4) Увеличиваете время t = 0 + dt 5) Красите весь ваш image в соответствии с A(x, y, dt) и опять сохраняете или показываете и так далее. Получается анимация - расспространения плоской волны. Если есть рассеиватель, применяете к амплитуде тот алгоритм, что приведён в задании. Должно получиться размытие в области рассеивателя. Причём чем больше длина волны, тем меньше этот эффект должен быть. Название: Re: Пустить волну по рисунку Отправлено: Igors от Август 10, 2011, 16:57 Волна одна, идет последовательно по всей картинке во времени, начиная от одного из углов картинки. Направление (куда бежит волна) задается углом альфа. Розовым нарисовано потому что за границами n(x) = 0 (пиксели остаются неизменными). В принципе это может быть и "много.волн" - если n(x) "волнистый"
Задача "персик" - если хотите могу накидать псевдокод. Логично мерять strecth не в пикселях (с которыми потом непонятно что делать) а относительно расстояния до дна аквариума - тогда честный refraction эффект Название: Re: Пустить волну по рисунку Отправлено: blood_shadow от Август 10, 2011, 17:20 Задача "персик" - если хотите могу накидать псевдокод. да было бы не плохо :)Название: Re: Пустить волну по рисунку Отправлено: Igors от Август 10, 2011, 18:24 Код Можно честно посчитать преломление воды, но это уже если есть интерес, время, желание. С имитатором должно быть неплохо Edit: по-хорошему анти-алиас надо делать, для этого x, y float чтобы потом вместо одного пикселя подсунуть сумму на выходе Название: Re: Пустить волну по рисунку Отправлено: blood_shadow от Август 14, 2011, 13:59 Волна будет существовать всюду. Розовая область - это рассеиватель. да с физикой проблемы... но немного разобрался, немного непонятно следующее:Вот вид свободной волны (2D): A(x,y, t) = A0*cos(k_x * x + k_y * y - omega * t) Волновой вектор k и omega связаны между собой (как именно, вы найдёте думаю). Вот если бы рассеивателя не было бы (что советую вам вначале реализовать) Всё происходит так: 1) Задаёте k, угол alpha и соответственно получаете k_x, k_y. 2) При t = 0 Вы имеете функцию A(x, y, 0) 1. как задавать вектор k? произвольное значение его абсолютной величины? он будет постоянен? 2. как будут изменятся координаты x и y? Название: Re: Пустить волну по рисунку Отправлено: m_ax от Август 14, 2011, 14:18 Волна будет существовать всюду. Розовая область - это рассеиватель. да с физикой проблемы... но немного разобрался, немного непонятно следующее:Вот вид свободной волны (2D): A(x,y, t) = A0*cos(k_x * x + k_y * y - omega * t) Волновой вектор k и omega связаны между собой (как именно, вы найдёте думаю). Вот если бы рассеивателя не было бы (что советую вам вначале реализовать) Всё происходит так: 1) Задаёте k, угол alpha и соответственно получаете k_x, k_y. 2) При t = 0 Вы имеете функцию A(x, y, 0) 1. как задавать вектор k? произвольное значение его абсолютной величины? он будет постоянен? 2. как будут изменятся координаты x и y? Тогда k_x = k * cos(alpha), k_y = k * sin(alpha). Далее задаёте omega. У вас получается функция A(x,y,t). И у вас есть image, каждый пиксель которого характеризуется двумя координатами (row, column) и цветом. Находите соответствие между (x,y) и (row, column) row = a11*x + a12 col = a21*y + a22 Красите каждый пиксель в соответствии с величиной A(x,y,t). Название: Re: Пустить волну по рисунку Отправлено: Igors от Август 14, 2011, 15:24 Волна будет существовать всюду. Розовая область - это рассеиватель. Д'Аламбера шьешь, начальник? :)Вот вид свободной волны (2D): A(x,y, t) = A0*cos(k_x * x + k_y * y - omega * t) (я не физик, просто делал такую процедуралку). Конечно это правильно, но дело в том что - при всем желании - никаких указаний на это в задании нет. Как раз наоборот - нарисован тупенький колокольчик, сказано n(x) - но не n(x. t) - а это значит волна существует не везде от старта (как правильно) а лишь в розовой области. А если так, то надо рисовать колокольчик и не пререкаться с заказчиком. Это делается так Код
Красите каждый пиксель в соответствии с величиной A(x,y,t). Красить не спрашивали - нужно вместо одного пикселя посунуть другойда с физикой проблемы... но немного разобрался, немного непонятно следующее: Там работы на день (включая multi-threaded вариант), так что есть смысл подсуетиться Название: Re: Пустить волну по рисунку Отправлено: m_ax от Август 14, 2011, 20:07 Цитировать Д'Аламбера шьешь, начальник? Улыбающийся Мы пока говорим о свободном расспространении плоской воны. Без учёта области оптического искажения.(я не физик, просто делал такую процедуралку). Конечно это правильно, но дело в том что - при всем желании - никаких указаний на это в задании нет. Как раз наоборот - нарисован тупенький колокольчик, сказано n(x) - но не n(x. t) - а это значит волна существует не везде от старта (как правильно) а лишь в розовой области. А если так, то надо рисовать колокольчик и не пререкаться с заказчиком. Это делается так Как я понял задачу: Плоская волна расспространяется под углом alpha. Это свободное расспространение описывается аммплитудой A(x,y,t). В розовой области, из-за оптических искажений n(x,y) - величина искажений, аммплитуда A(x,y,t) уже будет равной: n(x,y)A(x,y,t). Ну и соответственно меняем время - получаем анимацию. Или розовая область - это и есть волна, которая движется.. Да, наверное второе правильнее.. Название: Re: Пустить волну по рисунку Отправлено: Igors от Август 14, 2011, 20:31 Мы пока говорим о свободном расспространении плоской воны. Без учёта области оптического искажения. А может не надо "наводить тень на плетень"? :) Заказчик вполне ясно показал где волна (розовая область). Согласен, это физически некорректно, но надо делать что хочет заказчик, а не умничать. Как я понял задачу: Плоская волна расспространяется под углом alpha. Это свободное расспространение описывается аммплитудой A(x,y,t). В розовой области, из-за оптических искажений n(x,y) - величина искажений, аммплитуда A(x,y,t) уже будет равной: n(x,y)A(x,y,t). Ну и соответственно меняем время - получаем анимацию. Также не надо пускать пыль в глаза вумными словами "оптические искажения" - эффект возможен только один - волна изменяет нормаль к поверхности воды, материал преломляет k = 1.33 поэтому вместо одной точки на дне мы должны видеть другую. Это несложно просчитать точно, но не грех и подделать. Модный прононс "расспространяется" ни к чему, здесь простая приставка "рас" :) Название: Re: Пустить волну по рисунку Отправлено: m_ax от Август 14, 2011, 20:46 Ааа)) Понятно) Розовая область - это и есть волна)
А я то думал, что это (розовая область) искажение, которое на своём пути встречает волна.. Прошу прощения) Название: Re: Пустить волну по рисунку Отправлено: Igors от Август 14, 2011, 20:59 Ааа)) Понятно) Розовая область - это и есть волна) Переоценка интеллекта заказчика = типичная ошибка интеллигента :)А я то думал, что это (розовая область) искажение, которое на своём пути встречает волна.. Конечно "розовая область" это бред, волновое уравнение реализуется совсем просто, но по-своему он прав - он хочет увидеть крепкую "технику реализации", заставлять человека копаться в физике 18 века (правильно?) - нет смысла. Впрочем пока - ни того ни другого :) |