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

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

Страниц: 1 [2] 3 4 ... 24   Вниз
  Печать  
Автор Тема: Геометрия (задачки)  (Прочитано 226648 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Май 29, 2014, 10:39 »

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

Немного теории. Строго говоря, нормаль и (частные) производные - не одно и то же. Но они однозначно переводятся друг в друга. На плоскости: нормаль определяет касательную, а производная = тангенс угла ее наклона. В 3D: все то же самое, но касательная не прямая, а плоскость, и нормаль задается 3 значениями. Работать с нормалями куда легче, их легко визуализировать, легко объяснить что это такое (перпендикуляр к поверхности в точке)

Считаем что каждый пиксель имеет высоту по Z в зависимости от его яркости. Зададим макс высоту горы theAmplitude, тогда высота в точке (x, y)
Код
C++ (Qt)
float height( int x, int y ) {  return brightness(x, y, theImage) * theAmplitude;  }

Возьмем 3 точки лежащие в плоскости касания (псевдокод)
Код
C++ (Qt)
p0 = { x, y, height(x, y) };  // сама точка
p1 = { x + 1, y, height(x + 1, y) };  // сосед справа
p2 = { x, y + 1, height(x, y + 1) };  // сосед сверху
 
Вычисляем нормаль к этому треугольнику
Код
C++ (Qt)
N = cross(p1 - p0, p2 - p0).normalize();
Где cross - все то же векторное произведение.

Но как получить из нормалей выдавленный рисунок? Да очень просто, взять скалярное произведение нормали с заданным вектором и перевести это число в цвет. Напр множим на ось Z (0, 0, 1) т.е. результат = z нормали. Это соответствует "выдавливанию" на нас. Задаем вектор (0, 0, -1) - инвертируем эффект, теперь "вдавлено". Вектор (0.707, 0, -0.707) - ага, давим вниз и вправо. И.т.д.

А можно представить по-другому: мы построили горы и теперь освещаем их выбирая позицию солнца - те или иные склоны будут освещены/затемнены.

Тут правда есть один нюанс реализации. Производные (а значит и нормали) неустойчивы ("звенят"), т.е. погрешность при их численном вычислении значительна. Именно поэтому Собель осредняет 8 значений, чтобы загладить ВЧ звон. Поэтому в данной реализации надо написать ф-цию brightness грамотно - взять не просто "яркость в точке", а среднюю яркость на площадке 3x3 или даже больше.

Ну и для полноты картины: есть очень непростые вариации этой задачи.
Это все, уже устал писать  Улыбающийся
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #16 : Май 29, 2014, 11:19 »

Ну в этой статье примерно таким же способом я и вычисляю нормаль.
Нормали хорошо иметь для расстановки источника света в любой точке. Я же привел пример с фиксированным источником света, то есть упростил шаги по вычислению нормали. А размышлял примерно так же как вы и описываете, но с каждой итерацией упрощения, мой алгоритм превращался в то что я описал в предыдущем сообщении Веселый
Ведь в данном случае нормаль можно и вовсе не вычислять - можно найти скалярное произведение между полученным вектором на плоскости и повернутым на 90° вектором направления источника света.

Пример:
Возьмем две точки лежащие на плоскости касания:
Код:
p0 = { x, y, height(x, y) };  // сама точка
p1 = { x + 1, y, height(x + 1, y) };  // сосед справа
И находим скалярное произведение с заданным вектором, например, повернутая на 90° ось Z (1, 0, 0)
Можно упростить еще сильнее и убрать скалярное произведение, заменив его на ту же самую разность между двумя точками. И в общем то получить алгоритм который я описал в предыдущем сообщении.

Правда такой способ применим только для какой то одной оси (вроде как перемещение солнца по небу) - для снятия этого ограничения как раз и нужна нормаль, зато можно получить ту самую картинку справа без лишних вычислений.
Так что согласен, вычисление нормали дает более гибкое управление эффектом.

Давайте еще задачки Веселый
« Последнее редактирование: Май 29, 2014, 11:23 от Torvald » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Май 30, 2014, 10:53 »

Пример:
Возьмем две точки лежащие на плоскости касания:
Код:
p0 = { x, y, height(x, y) };  // сама точка
p1 = { x + 1, y, height(x + 1, y) };  // сосед справа
И находим скалярное произведение с заданным вектором, например, повернутая на 90° ось Z (1, 0, 0)
Так это частный случай, когда заданный вектор совпадает с (p1 - p0). Напр возьмем Z вместо X, тогда dot(p1 - p0, z) ни о чем еще еще не говорит т.к результат зависит и от (p2 - p0).

Ну в этой статье примерно таким же способом я и вычисляю нормаль.
Не понял. Если у Вас cellular, то почему Вы не берете нормаль прямо из него Непонимающий Известно в какую ячейку попала точка, находите пересечение луча со сферой минус центр ячейки - вот и нормаль. Ну конечно подгладить стык хермитничком.

Ну и конечно, я не могу отказать себе в удовольствии обсудить Вашу статью http://habrahabr.ru/post/182346/ Улыбающийся Насколько я помню, расцвет этой темы пришелся на середину 90-х, была довольно известная книга Musgrave(а). Очень привлекательно что процедуральная текстура не требует UV и не повторяется. Однако, довольно быстро выяснилась ее "механистичность".

Примечание: текст ниже всего лишь мое личное мнение, и это совсем не претензия к Вам лично - на мой взгляд это общая проблема АБСОЛЮТНО ЛЮБОЙ фрактальной текстуры

Вот напр рисунок из Вашей статьи (аттач).  Формально ни один из камней не повторяется, но все они "похожи" (напр как яблоки с одного дерева). В жизни бывает и такое (мостовая) но редко. Гораздо чаще между камнями есть какие-то зазоры/трещины, есть группы/колонии камней, напр  где-то пошла мелочь, а где-то один крупный и.т.п. Вот этого разнообразия фрактальные "нойсы" не дают.

Давайте еще задачки
Я подумаю (все-таки они должны быть простыми)
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #18 : Май 30, 2014, 11:33 »

Не понял. Если у Вас cellular, то почему Вы не берете нормаль прямо из него Непонимающий Известно в какую ячейку попала точка, находите пересечение луча со сферой минус центр ячейки - вот и нормаль.
Да, можно. Но этот процедурный генератор планировался как некий набор фильтров, которые можно применять в произвольном порядке. К примеру добавили новый фильтр "волны", применили к нему фильтр яркость/контрастность, потом применили фильтр "карта нормалей". Другими словами это сделано для универсальности, каждый последующий фильтр может не знать детали и параметры применения предыдущего фильтра.

Вот напр рисунок из Вашей статьи (аттач).  Формально ни один из камней не повторяется, но все они "похожи" (напр как яблоки с одного дерева). В жизни бывает и такое (мостовая) но редко. Гораздо чаще между камнями есть какие-то зазоры/трещины, есть группы/колонии камней, напр  где-то пошла мелочь, а где-то один крупный и.т.п. Вот этого разнообразия фрактальные "нойсы" не дают.

Ага, есть такое. Можно решить расстановкой декалей, или накладыванием какого-нибудь паттерана (возможно так же процедурно сгенерированного) большего размера.
« Последнее редактирование: Май 30, 2014, 11:36 от Torvald » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июнь 07, 2014, 10:54 »

Вот система координат QPainter (аттач). Ну ясно X идет слева направо, Y сверху вниз. А как направлен Z - "на нас" или "от нас" Непонимающий И почему  Непонимающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #20 : Июнь 07, 2014, 11:13 »

Вот система координат QPainter (аттач). Ну ясно X идет слева направо, Y сверху вниз. А как направлен Z - "на нас" или "от нас" Непонимающий И почему  Непонимающий

"The QLine class provides a two-dimensional vector using integer precision."
Он двухмерный, какой еще Z Улыбающийся
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Июнь 08, 2014, 11:29 »

"The QLine class provides a two-dimensional vector using integer precision."
Он двухмерный, какой еще Z Улыбающийся
QLine на рисунке лишь для пояснения где X и Y. Др классы (напр QVector3D) могут иметь Z и, возможно, мы захотим его использовать.

[off]Когда молодой программист цитирует ассыстент - это так печально  Плачущий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Август 13, 2014, 16:18 »

5) Где-то на просторах мирового океана на глубине 10 метров находится лампочка которая светит. Можно ли ПОЛНОСТЬЮ перекрыть ее свет для наблюдателя над поверхностью воды? Напр наложив непрозрачный круг. Если да - какой радиус этого круга?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #23 : Август 13, 2014, 18:47 »

5) Где-то на просторах мирового океана на глубине 10 метров находится лампочка которая светит. Можно ли ПОЛНОСТЬЮ перекрыть ее свет для наблюдателя над поверхностью воды? Напр наложив непрозрачный круг. Если да - какой радиус этого круга?

Можно, если пренебречь отражением от дна и от поверхности воды (на угол больше предельного) и последующим многократными отражениями от дна/поверхности..

Тогда радиус есть:
Код
C++ (Qt)
double h = 10.0;
double n_12 = 1.0 / 1.33 // относительный показатель преломления воздуха по отношению к воде.. (к дистиллированной при 20 C)
 
double r = h * n_12/sqrt(1.0 - n_12*n_12);
 


r = 11.4 м.
Записан

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

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

Сообщений: 11445


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

Можно, если пренебречь отражением от дна и от поверхности воды (на угол больше предельного) и последующим многократными отражениями от дна/поверхности..
Ну вариант что луч доберется до океанского дна, там отразится и таки выйдет наружу предлагаю считать нереальным Улыбающийся А вот что там с отражением от поверхности и кто такой "предельный угол" - что-то у Вас звучит совсем невнятно (в духе std, так, наколбасил). А от научного работника ожидаются более убедительные объяснения
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #25 : Август 14, 2014, 09:55 »

Цитировать
А вот что там с отражением от поверхности и кто такой "предельный угол" - что-то у Вас звучит совсем невнятно (в духе std, так, наколбасил)
Предельный (не знаю как его там называют правильно) - это такой угол к нормали к поверхности двух сред, при котором преломлённый луч в менее плотной среде (воздух в данном случае) составляет 90 градусов. Т.е. лучь из воды не выйдет, а будет скользить по поверхности воды. При больших углах будет полное внутреннее отражение от поверхности воды.. 
Ну а как связаны между собой угол падения и  преломления, думаю писать здесь не нужно? Улыбающийся
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Август 14, 2014, 11:36 »

Предельный (не знаю как его там называют правильно) - это такой угол к нормали к поверхности двух сред, при котором преломлённый луч в менее плотной среде (воздух в данном случае) составляет 90 градусов. Т.е. лучь из воды не выйдет, а будет скользить по поверхности воды. При больших углах будет полное внутреннее отражение от поверхности воды.. 
Ну а как связаны между собой угол падения и  преломления, думаю писать здесь не нужно? Улыбающийся
Конечно нужно, это же для широкого круга читающих. Для начала надо пояснить о каких углах идет речь, и что они меряются относительно нормали (малюнок в аттаче). Ну а дальше излагайте

Да, и кстати - есть гораздо более простая причина почему в реальной жизни/среде полное перекрытие недостижимо.
Записан
Bepec
Гость
« Ответ #27 : Август 14, 2014, 11:46 »

Вот не пойму я этих идеальных задач Улыбающийся
Ведь если посмотреть, то нужно наоборот соблюсти некие параметры, иначе свет не будет заметен наблюдателю.
Прозрачность воды, мощность лампы, чувствительность наблюдателя, количество света на поверхности (световой фон как бы), примеси в воде и прочее Улыбающийся

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

Сообщений: 2095



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

Цитировать
Да, и кстати - есть гораздо более простая причина почему в реальной жизни/среде полное перекрытие недостижимо.
Конечно, граница раздела то не идеально плоская..
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Август 14, 2014, 14:18 »

Ведь если посмотреть, то нужно наоборот соблюсти некие параметры, иначе свет не будет заметен наблюдателю.
Прозрачность воды, мощность лампы, чувствительность наблюдателя, количество света на поверхности (световой фон как бы), примеси в воде и прочее Улыбающийся
Много всего - вот только все "мимо цели"  Улыбающийся

Конечно, граница раздела то не идеально плоская..
Вот оно, мастерство научных работников запутать самое простое! А нельзя было сказать проще, напр

достаточно небольшой ряби на поверхности воды - и все, свет просочится. Ведь расчет предполагает "идеальную" нормаль по оси Y

Ладно, вот теория https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%A1%D0%BD%D0%B5%D0%BB%D0%BB%D0%B8%D1%83%D1%81%D0%B0
Записан
Страниц: 1 [2] 3 4 ... 24   Вверх
  Печать  
 
Перейти в:  


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