Russian Qt Forum
Ноябрь 23, 2024, 14:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пустить волну по рисунку  (Прочитано 6450 раз)
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?
это значит что волна может начинаться только с угла? зачем тогда на рисунке так не показано?

Буду рад любым соображениям на данную тему  Улыбающийся
« Последнее редактирование: Август 10, 2011, 15:26 от blood_shadow » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Август 10, 2011, 15:31 »

Написано же, что волна плоская и её волновой вектор направлен под углом alpha.
Розовая область - это типа рассеиватель волны. Если бы этой области не было бы, то наблюдалось бы свободное распространение плоской волны (если смотреть с верху мы бы видели перпендикулярные к направлению волнового вектора прямые одинаковой фазы).
Но поскольку есть рассеиватель он будет гасить падающую волну. Алгоритм взаимодействия волны с рассеивателем там вроде написан..
Как то так..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
blood_shadow
Гость
« Ответ #2 : Август 10, 2011, 15:48 »

Написано же, что волна плоская и её волновой вектор направлен под углом alpha.
Розовая область - это типа рассеиватель волны. Если бы этой области не было бы, то наблюдалось бы свободное распространение плоской волны (если смотреть с верху мы бы видели перпендикулярные к направлению волнового вектора прямые одинаковой фазы).
Но поскольку есть рассеиватель он будет гасить падающую волну. Алгоритм взаимодействия волны с рассеивателем там вроде написан..
Как то так..
извиняюсь за свою не сообразительность, но как-то впервые сталкиваюсь с таким...
хочу уточнить - то есть волна будет существовать только в этой "розовой" области?
2. насчет "every pass of wave has to start from random corner pixel" это значит что волна может начинаться
только с 1 из 4 углов?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Август 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) и опять сохраняете или показываете
и так далее.
Получается анимация - расспространения плоской волны.

Если есть рассеиватель, применяете к амплитуде тот алгоритм, что приведён в задании. Должно получиться размытие в области рассеивателя. Причём чем больше длина волны, тем меньше этот эффект должен быть. 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 10, 2011, 16:57 »

Волна одна, идет последовательно по всей картинке во времени, начиная от одного из углов картинки. Направление (куда бежит волна) задается углом альфа.  Розовым нарисовано потому что за границами n(x) = 0 (пиксели остаются неизменными). В принципе это может быть и "много.волн" - если n(x) "волнистый"

Задача "персик" - если хотите могу накидать псевдокод. Логично мерять strecth не в пикселях (с которыми потом непонятно что делать) а относительно расстояния до дна аквариума - тогда честный refraction эффект



Записан
blood_shadow
Гость
« Ответ #5 : Август 10, 2011, 17:20 »

Задача "персик" - если хотите могу накидать псевдокод.
да было бы не плохо  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 10, 2011, 18:24 »

Код
C++ (Qt)
QImage * mImage;  // картынка
QPointF mPos;         // координаты угла с которого началось
qreal mCurTime;     // текущее время  
qreal mSpeed;         // скорость (пикселей/сек)
QPointF mWaveDir;     // направление волна    
qreal mDistortAmount;  // множитель искажений
 
// установка параметров волны
void Wave::Setup( bool left, bool top, qreal angle )    // угол альфа в радианах от 0 до PI / 2
{
mPos.setX(left ? 0.0 : mImage->width);
mPos.setY(top ? 0.0, mImage->height());
if (left)
 angle = top ? (-angle) : angle;
else
 angle = PI * (top ? 1.0 : 0.5);
mDir = QPointF(cos(angle), sin(angle));
}
 
void Wave::CalcPixelDistort( int & x, int & y )
{
 QPointF vec = QPoint(x, y) - mPos;  // текущее направление
 float theX = vec * mDir;                  // длина проекции на направление волны
 theX -= mCurTime * mSpeed;           // получили то "x" от которого брать n(x)
 qreal height = CalcHeight(theX);       // высота волны n(x)
 
// имитируем refraction
 qreal heigh2 = CalcHeight(theX + 1);  
 qreal shift = (height2 - height) * mDistortAmount;
 
 x += int(mDir.x() * shift);
 y += int(mDir.y() * shift);
 
 x = qMin(x, mImage->width() - 1);
 y = qMin(y, mImage->height() - 1);
 x = qMax(x, 0);
 y = qMax(y, 0);
}
 
Можно честно посчитать преломление воды, но это уже если есть интерес, время, желание. С имитатором должно быть неплохо

Edit: по-хорошему анти-алиас надо делать, для этого x, y float чтобы потом вместо одного пикселя подсунуть сумму на выходе
« Последнее редактирование: Август 10, 2011, 18:31 от Igors » Записан
blood_shadow
Гость
« Ответ #7 : Август 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?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Август 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 - постоянен. Задаёте его произвольно. k выражается через длину волны (k=2π/λ). Я бы лучше задавал не сам k, а длину волны λ.
Тогда
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).
 

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 14, 2011, 15:24 »

Волна будет существовать всюду. Розовая область - это рассеиватель.
Вот вид свободной волны (2D):
A(x,y, t) = A0*cos(k_x * x + k_y * y - omega * t)
Д'Аламбера шьешь, начальник?  Улыбающийся
(я не физик, просто делал такую процедуралку). Конечно это правильно, но дело в том что - при всем желании - никаких указаний на это в задании нет. Как раз наоборот - нарисован тупенький колокольчик, сказано n(x) - но не n(x. t) - а это значит  волна существует не везде от старта (как правильно) а лишь в розовой области. А если так, то надо рисовать колокольчик и не пререкаться с заказчиком. Это делается так

Код
C++ (Qt)
qreal CalcHeight( float x )
{
 x /= mBandWidth * 0.5;   // mBandWidth = ширина розовой области в пикселях
 if (fabs(x) > 1) return 0.0f;
 
 static qreal theK = ln(0.01);
 return (exp(x * x * theK) - 0.01) / 0.99;
}
 

Красите каждый пиксель в соответствии с величиной A(x,y,t).
Красить не спрашивали - нужно вместо одного пикселя посунуть другой

да с физикой проблемы... но немного разобрался, немного непонятно следующее:
Там работы на день (включая multi-threaded вариант), так что есть смысл подсуетиться
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Август 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).

Ну и соответственно меняем время - получаем анимацию.
 
Или розовая область - это и есть волна, которая движется..
Да, наверное второе правильнее..
« Последнее редактирование: Август 14, 2011, 20:15 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Август 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 поэтому вместо одной точки на дне мы должны видеть другую. Это несложно просчитать точно, но не грех и подделать.

Модный прононс "расспространяется" ни к чему, здесь простая приставка "рас"  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Август 14, 2011, 20:46 »

Ааа)) Понятно) Розовая область - это и есть волна)
А я то думал, что это (розовая область) искажение, которое на своём пути встречает волна..

Прошу прощения)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 14, 2011, 20:59 »

Ааа)) Понятно) Розовая область - это и есть волна)
А я то думал, что это (розовая область) искажение, которое на своём пути встречает волна..
Переоценка интеллекта заказчика = типичная ошибка интеллигента  Улыбающийся
Конечно "розовая область" это бред, волновое уравнение реализуется совсем просто, но по-своему он прав - он хочет увидеть крепкую "технику реализации", заставлять человека копаться в физике 18 века (правильно?) - нет смысла. Впрочем пока - ни того ни другого  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.379 секунд. Запросов: 23.