Russian Qt Forum

Разное => Говорилка => Тема начата: Igors от Май 23, 2014, 09:04



Название: Геометрия (задачки)
Отправлено: Igors от Май 23, 2014, 09:04
Добрый день

Задачки простые, но встречаются в 2/3D графике часто. Тема по образцу "задачки" - пополняйте. Для начала

1) Есть 4-угольник на плоскости (напр QPointF[4]). Определить является ли он выпуклым

2) Есть 4-угольник на плоскости. Как лучше разбить его на 2 треугольника?


Название: Re: Геометрия (задачки)
Отправлено: panAlexey от Май 23, 2014, 10:39
2) Есть 4-угольник на плоскости. Как лучше разбить его на 2 треугольника?
А что значит "лучше"?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Май 23, 2014, 10:40
1) Задать произвольное направление обхода контура (1->2->3->4).
2) В каждой точке посчитать знак векторного произведения "смыкающихся векторов".
3) Если в какой либо точке знак будет отличен от других - то треугольник вогнутый.

По второй задаче:
1) Определить вогнутый ли треугольник. Если нет, то не понятен критерий "лучшести"..
2) Если вогнутый, найти ту точку (где знак другой, см. задачу 1) и резать от этой точки до противоположной (т.е. той, где смыкаются другие два вектора)..


 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 23, 2014, 15:13
1) Задать произвольное направление обхода контура (1->2->3->4).
2) В каждой точке посчитать знак векторного произведения "смыкающихся векторов".
3) Если в какой либо точке знак будет отличен от других - то треугольник вогнутый.
По существу - правильно, формально нет. Возможны 2 знака плюс и 2 минус

А что значит "лучше"?
1)Если нет, то не понятен критерий "лучшести"..
Вот этот критерий и надо сформулировать, т.е. в этом и вопрос


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 23, 2014, 15:19
Вот еще - совсем простенько, но в "художественном" изложении (m_ax, здесь просьба воздержаться)

3) "Ехала машина темным лесом". Путь задан в виде последовательности точек, напр QVector <QPointF>. Для любой точки  (но не первой и не последней) определить

- машина едет вперед или дает задний ход
- положение руля: (влево, вправо, по центру)


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 26, 2014, 08:48
Сначала нужно условиться, каким образом машина меняет ход вперед/назад. Пусть это будет участок ломаной, который образует острый угол
Для определения направления в точке p (из n точек):
1. Запоминаем текущее направление (машина стартует передним или заднем ходом)
2. проходимся по точкам от 1 до p
2.2 если угол между векторами (i-1), i, и i, (i+1) острый - значит инвертируем текущее направление
3. когда доходим до точки p - имеем текущее направление в данной точке

Сложность такого алгоритма O(p), где p находится в диапазоне [1, n)
По моему уменьшить сложность нельзя, так как текущее состояние машины зависит от предыдущего. Однако можно узнать за время O(1) сменила ли машина направление в данной точки

Для определения положения руля:
1. Вычисляем синус угла между векторами (i-1), i и (i-1), (i+1)
1.1 если синус равен нулю - положение руля прямое
1.2 если синус меньше нуля - руль повернут вправо, если едем вперед и влево, если едем назад
1.3 если синус больше нуля - влево, если вперед и вправо, если назад
2. но если это переломный момент, то есть в данной точке машина меняет направление (назад/вперед), то пункты 1.2 и 1.3 "инвертируются"

Вроде так  :D


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 26, 2014, 09:22
Сначала нужно условиться, каким образом машина меняет ход вперед/назад. Пусть это будет участок ломаной, который образует острый угол
Да, или др словами - шаг достаточно мал, иначе смена направления неотличима от (резкого) поворота

2.2 если угол между векторами (i-1), i, и i, (i+1) острый -

1. Вычисляем синус угла между векторами (i-1), i и (i-1), (i+1)
А как эти углы посчитать? И нужны ли сами углы (можно ли обойтись знаком) ?


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 26, 2014, 10:18
А как эти углы посчитать? И нужны ли сами углы (можно ли обойтись знаком) ?
Ну да, как и во втором случае, достаточно обойтись косинусом. Если знак положительный - сменили направление.

a = p[j]-p[j-1]
b = p[j+1]-p[j-1]
cos(a, b) = (a.x*b.x+a.y*b.y) / (sqrt(a.x*a.x+a.y*a.y)+sqrt(b.x*b.x+b.y*b.y))

если знаменатель равен нулю, значит точки совпадают

--------------------------------
Кстати положение третьей точки можно узнать через уравнение прямой по двум точкам:
(p.x-p1.x)/(p2.x-p1.x) = (p.y-p1.y)/(p2.y-p1.y)

Для определения направления движения машины (назад/вперед) можно составить уравнение прямой перпендикулярной к отрезку (p[j], p[j-1]) и проходящую через точку p[j] и узнать положение точки p[j+1] относительно этой прямой.

Для определения положения руля можно узнать положение точки p[j+1] относительно прямой построенной по точкам p[j], p[j-1]

Вроде как в этом случае вычислений меньше

PS не знаю как экранировать тэгирование
Код:
[i]
поэтому вместо i использую j  :(


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 26, 2014, 15:30
Ну да, как и во втором случае, достаточно обойтись косинусом. Если знак положительный - сменили направление.

a = p[j]-p[j-1]
b = p[j+1]-p[j-1]
cos(a, b) = (a.x*b.x+a.y*b.y) / (sqrt(a.x*a.x+a.y*a.y)+sqrt(b.x*b.x+b.y*b.y))

если знаменатель равен нулю, значит точки совпадают
Так зачем же Вы делите на длины если они положительны и знака не меняют? Просто
Код
C++ (Qt)
qreal dot = a.x*b.x+a.y*b.y;
 
Это скалярное произведение 2 векторов, равно косинусу угла между векторами умноженному на их длины.

Кстати положение третьей точки можно узнать через уравнение прямой по двум точкам:
(p.x-p1.x)/(p2.x-p1.x) = (p.y-p1.y)/(p2.y-p1.y)
...
Для определения положения руля можно узнать положение точки p[j+1] относительно прямой построенной по точкам p[j], p[j-1]

Вроде как в этом случае вычислений меньше
Ну найти точку из этого уравнения не удастся, т.к неизвестных 2 (x и у), а ур-е одно. Можно рассуждать так: пусть есть прямая заданная точками p1 и p2. Она разбивает плоскость на 2 полу-плоскости. Подставив тестируемую точку p в ур-е прямой получаем число (знаковое расстояние). Если оно > 0, точка p "слева", если < 0 то справа. Расписав ур-е "крестиком"
Код
C++ (Qt)
qreal cross = (p.x-p1.x) * (p2.y-p1.y) - (p2.x-p1.x) * (p.y-p1.y);
 
Получаем формулу векторного произведения


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 26, 2014, 15:54
Так зачем же Вы делите на длины если они положительны и знака не меняют?
Действительно. Не догадался.

Ну найти точку из этого уравнения не удастся, т.к неизвестных 2 (x и у), а ур-е одно. Можно рассуждать так: пусть есть прямая заданная точками p1 и p2. Она разбивает плоскость на 2 полу-плоскости. Подставив тестируемую точку p в ур-е прямой получаем число (знаковое расстояние). Если оно > 0, точка p "слева", если < 0 то справа. Расписав ур-е "крестиком"
Код
C++ (Qt)
qreal cross = (p.x-p1.x) * (p2.y-p1.y) - (p2.x-p1.x) * (p.y-p1.y);
 
Получаем формулу векторного произведения

Как это два неизвестных? И не нужно искать точку, подставив в него данные (а они все известны) - получаем число, по знаку которого можно судить в какую сторону повернут руль.
Вот же:
(p.x-p1.x)/(p2.x-p1.x) = (p.y-p1.y)/(p2.y-p1.y)
где p - точка p[j+1]
p1 и p2 - прямая образованная двумя точками p[j-1] и p[j]

подставляем, решаем:
value = (p.x-p1.x)/(p2.x-p1.x) - (p.y-p1.y)/(p2.y-p1.y)

Деление в самом деле можно заменить умножением, опять же не догадался:
value = (p.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p.y-p1.y)

получилась ваша формула. Хотя согласен, можно было сразу ее использовать  :-\

----------------------------------------
Над следующей задачкой обещаю подумать получше  ;)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 27, 2014, 06:15
#4  Дана картинка (слева). Получить популярный эффект выдавливания (справа), который называется всяко (emboss, bump и.т.п. - не суть). Придумывать опции эффекта разрешается


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 27, 2014, 11:42
#4  Дана картинка (слева). Получить популярный эффект выдавливания (справа), который называется всяко (emboss, bump и.т.п. - не суть). Придумывать опции эффекта разрешается

Воспользоваться оператором Собеля и нормализировать полученные значения.

Для этого сперва нужно привести картинку к черно-белому виду. Это можно сделать чисто математически - найти среднее арифметическое по всем каналам для каждого пикселя:
result[j] = (r[j]+g[j]+b[j]) / 3
а можно с учетом человеческого зрения, когда каждый канал воспринимается глазом по разному, например:
result[j] = r[j]*0.2126 + g[j]*0.7152 + b[j]*0.0722

После этого можно применять оператор Собеля. Судя по правой картинке из вашего примера, градиент был применен по горизонтали:
-1 0 1
-2 0 2
-1 0 1
После применения оператора Собеля имеем изображение в более широком диапазоне, чем исходное изображение, в том числе и отрицательную яркость пикселей.
На этом этапе можно изменить силу эффекта или контрастность:
v *= contrast, где v - пиксель после применения оператора Собеля, contrast - значение от 0 до 1
Яркость:
v += bright, где bright в диапазоне от -127 до 127
И собственно нормализация, приведение к диапазону от 0 до 255:
v += 127
v = clamp(v, 0, 255);

Можно попробовать модернизировать оператор - добавить возможность задания вектора градиента.
Вот набросал небольшую демку:

Хотя все равно больше похоже на фотошопное "теснение", чам на картинку вправа у вас :D


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 28, 2014, 06:30
Воспользоваться оператором Собеля и нормализировать полученные значения.
Хммм... часто после того как человек нашел решение в инете (или изучил в школе?) с ним становится трудно что-то обсуждать :) Ведь он уже "знает правильный ответ".  В действительности найденное - далеко не всегда лучшее. Да, Собель возможен, но он довольно хлопотлив в реализации и возможности ограничены. Есть др решение, которое гораздо проще и богаче.

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

а можно с учетом человеческого зрения, когда каждый канал воспринимается глазом по разному, например:
result[j] = r[j]*0.2126 + g[j]*0.7152 + b[j]*0.0722
Укажите первоисточник откуда взяты коэффициенты. Насколько я помню blue ~ 0.11 green ~ 0.59


Название: Re: Геометрия (задачки)
Отправлено: Old от Май 28, 2014, 08:00
Хммм... часто после того как человек нашел решение в инете (или изучил в школе?) с ним становится трудно что-то обсуждать :) Ведь он уже "знает правильный ответ".
Судя по тому, как вы сейчас общаетесь, вы нашли в интернете другой "правильный ответ". Умничка.


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 28, 2014, 10:05
Укажите первоисточник откуда взяты коэффициенты. Насколько я помню blue ~ 0.11 green ~ 0.59
Это зависит от цветовой модели. Вот источник (http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%82%D0%B5%D0%BD%D0%BA%D0%B8_%D1%81%D0%B5%D1%80%D0%BE%D0%B3%D0%BE)

А с различными операторами я действительно познакомился несколько лет назад, когда понадобилось сделать карту нормалей по изображению.

Ну, не хотите готовыми операторами, можно воспользоваться нечто подобным, что я описал в этой (http://habrahabr.ru/post/183534/) статье.
В данном случае взять черно-белую картинку и представить что она - это карта высот. Далее можно взять источник света, находящийся, например слева в бесконечности (вектор) и "осветить" эту "местность" используя карту высот.
То есть для каждого пикселя смотрим на разность высот/интенсивностей в двух соседних точках лежащих на одинаковом расстоянии на луче света, проходящим через рассматриваемый пиксель. На основе этой разности можно вычислять интенсивность пикселя в результирующей картинке. Расстояние между этими точками влияет на силу эффекта. Сами точки не обязательно будут совпадать с пикселями, для них можно интерполировать значения, особенно это будет проявляться на векторах не кратных 90°
К сожалению сейчас на работе нет времени подробнее описать или набросать демку, но если хотите вечером распишу подробнее.

Или если уж совсем просто: разность между левым и правым пикселем от текущего - и есть результирующий bump. Правда в данном случае будут отрицательные и малые значения, поэтому нормализация все же необходима. Но это решение хоть и быстрое, но не универсально) Зато очень хорошо распараллеливается и переносится на SIMD архитектуру.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 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 или даже больше.

Ну и для полноты картины: есть очень непростые вариации этой задачи.
Это все, уже устал писать  :)


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 29, 2014, 11:19
Ну в этой (http://habrahabr.ru/post/182346/) статье примерно таким же способом я и вычисляю нормаль.
Нормали хорошо иметь для расстановки источника света в любой точке. Я же привел пример с фиксированным источником света, то есть упростил шаги по вычислению нормали. А размышлял примерно так же как вы и описываете, но с каждой итерацией упрощения, мой алгоритм превращался в то что я описал в предыдущем сообщении :D
Ведь в данном случае нормаль можно и вовсе не вычислять - можно найти скалярное произведение между полученным вектором на плоскости и повернутым на 90° вектором направления источника света.

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

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

Давайте еще задачки :D


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 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/ (http://habrahabr.ru/post/182346/) :) Насколько я помню, расцвет этой темы пришелся на середину 90-х, была довольно известная книга Musgrave(а). Очень привлекательно что процедуральная текстура не требует UV и не повторяется. Однако, довольно быстро выяснилась ее "механистичность".

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

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

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


Название: Re: Геометрия (задачки)
Отправлено: Torvald от Май 30, 2014, 11:33
Не понял. Если у Вас cellular, то почему Вы не берете нормаль прямо из него ??? Известно в какую ячейку попала точка, находите пересечение луча со сферой минус центр ячейки - вот и нормаль.
Да, можно. Но этот процедурный генератор планировался как некий набор фильтров, которые можно применять в произвольном порядке. К примеру добавили новый фильтр "волны", применили к нему фильтр яркость/контрастность, потом применили фильтр "карта нормалей". Другими словами это сделано для универсальности, каждый последующий фильтр может не знать детали и параметры применения предыдущего фильтра.

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

Ага, есть такое. Можно решить расстановкой декалей, или накладыванием какого-нибудь паттерана (возможно так же процедурно сгенерированного) большего размера.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 07, 2014, 10:54
Вот система координат QPainter (аттач). Ну ясно X идет слева направо, Y сверху вниз. А как направлен Z - "на нас" или "от нас" ??? И почему  ???


Название: Re: Геометрия (задачки)
Отправлено: gil9red от Июнь 07, 2014, 11:13
Вот система координат QPainter (аттач). Ну ясно X идет слева направо, Y сверху вниз. А как направлен Z - "на нас" или "от нас" ??? И почему  ???

"The QLine  (http://qt-project.org/doc/qt-4.8/qline.html)class provides a two-dimensional vector using integer precision."
Он двухмерный, какой еще Z :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 08, 2014, 11:29
"The QLine  (http://qt-project.org/doc/qt-4.8/qline.html)class provides a two-dimensional vector using integer precision."
Он двухмерный, какой еще Z :)
QLine на рисунке лишь для пояснения где X и Y. Др классы (напр QVector3D) могут иметь Z и, возможно, мы захотим его использовать.

[off]Когда молодой программист цитирует ассыстент - это так печально  :'(


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


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Август 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 м.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 13, 2014, 20:06
Можно, если пренебречь отражением от дна и от поверхности воды (на угол больше предельного) и последующим многократными отражениями от дна/поверхности..
Ну вариант что луч доберется до океанского дна, там отразится и таки выйдет наружу предлагаю считать нереальным :) А вот что там с отражением от поверхности и кто такой "предельный угол" - что-то у Вас звучит совсем невнятно (в духе std, так, наколбасил). А от научного работника ожидаются более убедительные объяснения


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Август 14, 2014, 09:55
Цитировать
А вот что там с отражением от поверхности и кто такой "предельный угол" - что-то у Вас звучит совсем невнятно (в духе std, так, наколбасил)
Предельный (не знаю как его там называют правильно) - это такой угол к нормали к поверхности двух сред, при котором преломлённый луч в менее плотной среде (воздух в данном случае) составляет 90 градусов. Т.е. лучь из воды не выйдет, а будет скользить по поверхности воды. При больших углах будет полное внутреннее отражение от поверхности воды.. 
Ну а как связаны между собой угол падения и  преломления, думаю писать здесь не нужно? :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 14, 2014, 11:36
Предельный (не знаю как его там называют правильно) - это такой угол к нормали к поверхности двух сред, при котором преломлённый луч в менее плотной среде (воздух в данном случае) составляет 90 градусов. Т.е. лучь из воды не выйдет, а будет скользить по поверхности воды. При больших углах будет полное внутреннее отражение от поверхности воды.. 
Ну а как связаны между собой угол падения и  преломления, думаю писать здесь не нужно? :)
Конечно нужно, это же для широкого круга читающих. Для начала надо пояснить о каких углах идет речь, и что они меряются относительно нормали (малюнок в аттаче). Ну а дальше излагайте

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


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Август 14, 2014, 11:46
Вот не пойму я этих идеальных задач :)
Ведь если посмотреть, то нужно наоборот соблюсти некие параметры, иначе свет не будет заметен наблюдателю.
Прозрачность воды, мощность лампы, чувствительность наблюдателя, количество света на поверхности (световой фон как бы), примеси в воде и прочее :)

PS каждый из этих факторов сведёт задачу к "свет итак никогда не будет зафиксирован наблюдателем" :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Август 14, 2014, 12:39
Цитировать
Да, и кстати - есть гораздо более простая причина почему в реальной жизни/среде полное перекрытие недостижимо.
Конечно, граница раздела то не идеально плоская..


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 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 (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)


Название: Re: Геометрия (задачки)
Отправлено: alex312 от Август 14, 2014, 15:05
Ведь если посмотреть, то нужно наоборот соблюсти некие параметры, иначе свет не будет заметен наблюдателю.
Прозрачность воды, мощность лампы, чувствительность наблюдателя, количество света на поверхности (световой фон как бы), примеси в воде и прочее :)
Много всего - вот только все "мимо цели"  :)
Так уж и все ? Т.е вы утверждаете что от вас лампочку в воде не спрятать сколь угодно большим препятствием ?


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Август 14, 2014, 15:15
круг диаметром равным (2км + 1 км* площадь излучающей поверхности лампы). Изготовить из поглощающего свет материала. Гарантированно и с запасом закроет любую лампу.

10 тонн взвести из поглощающих свет частиц куда нить в радиусе 100 метров - и ни один лучик света не проникнет за эту завесу.

Слепой наблюдатель - мощность лампы не имеет значения.

Запуск осветительной ракеты с мощностью 10* мощность лампы. Наличие света в воде будет скрыто общим световым фоном и отражением от воды.

Вылить 200 тонн нефтепродуктов - масляная плёнка скроет всё и убьёт дофига живности.

А если убрать предложение Igor's насчёт непрозрачного круга, то поможет большая шоколадка! Съедаем шоколадку, фольгой оборачиваем лампочку. Профит.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 14, 2014, 15:34
Так уж и все ? Т.е вы утверждаете что от вас лампочку в воде не спрятать сколь угодно большим препятствием ?
"Сколь угодно большое" не есть инженерный/программистский ход мысли  :)

6) Что изменится если водяная пена (вместо воды)? Размер пузырьков известен, напр от 5 до 10 см


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Август 14, 2014, 15:42
Непрозрачному кругу будет безразлично :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 12, 2014, 11:28
7) Написать анимацию которая из прямоугольника делает сферу. Способов много, можно напр гнуть (как ту же трубу в "алгоритмах"  :))


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Сентябрь 12, 2014, 11:51
Гениальное задание :D
Как вариант отдаляться, и показать пользователю, что плоскость оказалась лишь пикселем на поверхности сферы.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 12, 2014, 13:46
Гениальное задание :D
Как вариант отдаляться, и показать пользователю, что плоскость оказалась лишь пикселем на поверхности сферы.
??? Для особо одаренных показываю как выглядит такая анимация (аттач)


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Сентябрь 12, 2014, 13:54
Для не замечающих очевидного, вы привели картинку в точности соответствующую моему описанию :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 12, 2014, 14:02
Для не замечающих очевидного, вы привели картинку в точности соответствующую моему описанию :)
Согласен. Я, не прочитав условия задачи, увидел в аттаче, как сфера была сначала сильно приближена, а потом камера от неё постепенно отдалялась.

У меня ещё задача. На работу с камерой.
Имеется прямоугольник, на него наводим указатель в произвольное место и нажимаем "+". Прямоугольник при этом увеличивается на 10% и при этом указатель показывает на то же место, на которое указывал до увеличения.
В CAD системах такое увеличение работает.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 12, 2014, 14:10
Для не замечающих очевидного, вы привели картинку в точности соответствующую моему описанию :)
А куда же делись макушки сферы на средних картинках? :)
Ладно, вопрос для Вас: а на картинке выше есть тени?


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 12, 2014, 14:12
А куда же делись макушки сферы на средних картинках? :)
Был использован трафарет =)


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Сентябрь 12, 2014, 14:14
to __Heaven__
Тут скорее идёт центровка относительно указателя.
Хотя в принципе если координаты не выходят за границы видимой области, центровка и не нужна :)

Вот только это уже простой рассчёт должен делать. Не представляю как ещё описать ответ :)

to Igors:
нет условий, вполне вероятно, что вверху и снизу имеются поля, не относящиеся к видимой области :) Как в кино сверху и снизу обрезают. Так же это подчёркивается тем, что для всех 3 кадров они равны :D

А по теням ответ неоднозначный.  Отсутствует видимый источник света. Так что в равной степени верны следующие утверждения:
1) тени есть на сфере, т.к. только она является непрозрачным объектом.
2) теней вообще нет. Нет источника света. Темнота на сфере является раскраской.
3) Тени есть для объекта, но не учтены для фона :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 12, 2014, 14:26
У меня ещё задача. На работу с камерой.
Имеется прямоугольник, на него наводим указатель в произвольное место и нажимаем "+". Прямоугольник при этом увеличивается на 10% и при этом указатель показывает на то же место, на которое указывал до увеличения.
Здесь принципиальная разница какая камера: перспективная или нет. В последнем случае все просто: есть 2 матрицы камеры, одна переводит из модели в пиксели, др наоборот. Домножаем масштаб на 1.1 и переводим пиксельную разницу в смещение которое добавляем к матрице. Для перспективной камеры решения нет т.к. здесь вью не может быть "увеличено на 10%" - мы можем только ставить камеру ближе/дальше от объекта(ов)


Название: Re: Геометрия (задачки)
Отправлено: Old от Сентябрь 12, 2014, 15:03
т.к. здесь вью не может быть "увеличено на 10%"
А нам не надо увеличивать вью, нам надо увеличивать прямоугольник. Только после увеличения камера должна продолжать смотреть на ту же точку прямоугольника, что и до увеличения.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 12, 2014, 15:29
есть 2 матрицы камеры, одна переводит из модели в пиксели, др наоборот. Домножаем масштаб на 1.1 и переводим пиксельную разницу в смещение которое добавляем к матрице.

Как вычислить смещение?


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Сентябрь 12, 2014, 15:37
Ну раз увеличиваем, то смещение будет равно текущим коодинатам + % увеличения, нет?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 12, 2014, 15:47
А нам не надо увеличивать вью, нам надо увеличивать прямоугольник.
Ну если растут размеры самого пр-ка - то др задача. А иначе не понял что Вы имели ввиду.

Только после увеличения камера должна продолжать смотреть на ту же точку прямоугольника, что и до увеличения.
Можно конечно, но если точка не в центре, то камера будет как-то хитро вращаться, поэтому обычно так не делают.

- запомнить текущий вектор камера-цель
- передвинуть камеру
- вычислить новый вектор камера-цель
- довернуть камеру на угол между 2 векторами

Как вычислить смещение?
Сделайте 2 ф-ции: одна переводит из пикселей в 3D, другая наоборот. В изометрии это возможно. Не исключено такие ф-ции есть в OpenGL. После этого все вопросы отпадут сами


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 12, 2014, 16:24
Сделайте 2 ф-ции: одна переводит из пикселей в 3D, другая наоборот. В изометрии это возможно. Не исключено такие ф-ции есть в OpenGL. После этого все вопросы отпадут сами
Я понял вашу идею. Но не проще ли вычислять положение камеры, точнее, матрицу проекции?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 13, 2014, 06:15
Я понял вашу идею. Но не проще ли вычислять положение камеры, точнее, матрицу проекции?
Текущая камера может быть повернута произвольным образом, заново вычисляя матрицу Вы потеряете этот поворот.

Для перспективной камеры обычно принимается какое-то "расстояние до цели", напр основываясь на объектах или просто юзверь может задать. Одна и та же точка экрана может соответствовать близкому/дальнему объекту, известен луч но не расстояние по нему. Вы можете двигать камеру по лучу но какое видимое увеличение это вызовет - хз.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 13, 2014, 12:56
Я понял вашу идею. Но не проще ли вычислять положение камеры, точнее, матрицу проекции?
Текущая камера может быть повернута произвольным образом, заново вычисляя матрицу Вы потеряете этот поворот.
Давайте заново.
Имеется ортографическая проекция, описываемая матрицей project.
Имеется положение объекта в пространстве, описываемое матрицей modelview.
Применяя увеличение мы не станем затрагивать матрицу modelview, мы сократим только обзор матрицы project. Также мы применим к ней смещение относительно курсора.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 14, 2014, 10:46
.. мы сократим только обзор матрицы project. Также мы применим к ней смещение относительно курсора.
А разве эта матрица переводит в пиксели? По-моему нет, напр если в resizeGL вызовем glViewPort то получим уже др пиксели, но матрица GL_MODELVIEW останется той же. Хотя я могу ошибаться, знатоком OpenGL никогда не был. Проверьте, потом продолжим


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 14, 2014, 13:24
glViewPort задаёт лишь область в окне, куда будет выводиться картинка.
Матрица ModelView преобразует исходную геометрию в новую с учётом поворотов, трансляций и масштабов.
Матрица Projection преобразует геометрию (результат преобразования матрицы ModelView) в новую таким образом, что полученные координаты помещаются в "коробку" размером 2.0f х 2.0f х 2.0f, где центр этой "коробки" находится в {0; 0; 0}. Примитивы, выходящие за пределы коробки отсекаются конвейером, остальные прорисовываются.

Таким образом у нас на экране получается, что центр преобразованной геометрии соответствует центру ViewPort'а, левый и нижний края соответствуют проекционным значениям -1.0f, а правый и верхний - 1.0f.

Что я хочу сказать. Матрицу преобразований трогать мы не станем, нам достаточно только сдвинуть положение этой "коробки", то есть немножечко изменить проекционную матрицу. Задать её параметры l, r, t, b (прямоугольник) смещёнными относительно курсора.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 14, 2014, 14:06
Матрицу преобразований трогать мы не станем,
Так давайте лучше о ней и не упоминать  :)

Матрица Projection преобразует геометрию (результат преобразования матрицы ModelView) в новую таким образом, что полученные координаты помещаются в "коробку" размером 2.0f х 2.0f х 2.0f, где центр этой "коробки" находится в {0; 0; 0}. Примитивы, выходящие за пределы коробки отсекаются конвейером, остальные прорисовываются.
А по-моему за размер коробки отвечает glOrtho, и он может быть любым (не только 2х2х2). А матрица Projection просто преобразует из одних координат в другие - что получилось, то и получилось. Давайте сначала разберемся зависит ли она от glViewport и glOrtho



Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 14, 2014, 14:46
ViewPort преобразует координаты таким образом:
(https://imagizer.imageshack.us/v2/245x94q90/631/5E5HPt.png)
Слева результирующие координаты в пространстве окна. xd, yd, zd - исходные координаты, приходящие во вьюпорт (после всех матричных преобразований, то есть в нормированном состоянии). px, py - ширина и высота вьюпорта в пикселях (здесь прошу обратить внимание на то, что не матрица преобразует координаты в пиксели, это мнение, на мой взгляд, ошибочно). f и n - координаты дальней и ближней плоскостей (1.0f и -1.0f). ox и oy - координаты центра вьюпорта в пикселях.
Отсюда видно, что можно выкинуть всякие projection и modelView и рисовать свои координаты напрямую в поле [-1.0f; 1.0f] x [-1.0f; 1.0f] x [-1.0f; 1.0f];
ModelView матрица выполняет переориентирование геометрии относительно нулевой координаты (надеюсь, правильно выразился)
Новая геометрия получается по формуле modelView * vertex = newVertex.
В правом столбце матрицы ModelView находится центр будущей геометрии относительно нулевой координаты. Таким образом центр можно задать тупо перезаписав значения в правом столбце. В первых 3х находятся направления базиса по x, y и z в виде единичных векторов.
Поворот геометрии осуществляется по формуле rotationMatrix (https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0) * currentModelView * vertex = newVertex.
Трансляция осуществляется с учётом поворота:
translationMatrix * currentModelView = newModelView
Про масштабирование говорить не берусь - не применял, боюсь обмануть.
После применения вышеописанных преобразований мы получаем матрицу, которая будет преобразовывать нашу геометрию.
(Существует ещё матрица lookAt, которая тоже относится к преобразованиям ModelVew)

Projection матрица описывает "коробку", в которую будут помещаться вершины, ранее преобразованные матрицей ModelView (далее vertex - преобразованная вершина с помощью ModelView)
Одной из самых популярных матриц проекции является перспективная матрица. Один из способов её задания является описание усечённой пирамиды (Frustum):
(https://imagizer.imageshack.us/v2/432x125q90/911/MQo27a.png)
Полученная усечённая пирамида "сжимается в параллелепипед" (таким образом, что ближайшее сечение сжимается меньше, чем дальнее) и получается эффект перспективы.
Стоит упомянуть, что библиотеки Qt и GLU предоставляют возможность более простого задания Frustum через функцию Perspective.
Также существует матрица ортографической проекции, которая описывает параллелепипед (Ortho):
(https://imagizer.imageshack.us/v2/427x125q90/631/olTJbr.png)
Умножая матрицу проекции на ранее преобразованную вершину мы на выходе получаем спроецированную вершину:
projection * vertex = projectedVertex.

Теперь давайте рассмотрим весь процесс отрисовки. Для простоты примем, что мы отрисовываем исключительно точки:
Первоначально мы создаём матрицу проекции proj.
Далее создадим матрицу преобразований геометрии modelView. Изначальна она единичная. Применяя вышеописанные операции приведем её к целевой.
Введем также ещё одну временную матрицу modelViewProjection = proj * modelView. Она и станет у нас преобразователем вершин.
Теперь берём каждую вершину и преобразовываем:
modelViewProjection * vertex = convertedVertex.
Далее проверяем, какие вершины в своих координатах имеют числа выходящие за предел [-1.0f; 1.0f] (за предел нашей "коробочки"). Такие вершины отсеиваются (в случае рисования точек).
Теперь полученные вершины натягиваем на вьюпорт с помощью первой формулы.
Далее происходит отрисовка пикселей.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 14, 2014, 15:20
Аллегория матрицы проецирования с коробкой, скорее всего, не очень хороша, но пока не знаю, как лучше изъяснить свое мнение. Надеюсь, что всё-таки оно остаётся понятным.

Теперь, к нашим баранам  :)
Возьмем коробку шириной и высотой в размер экрана и бесконечной глубиной. Возьмем в ней плоскость, на глубине 0 (середина коробки). На данной плоскости нанесем вершины, которые все попадут в коробку. Так как размеры коробки равны размерам вьюпорта, содержимое её остается неизмненным и мы получаем:
(https://imagizer.imageshack.us/v2/200x200q90/674/z0lMOs.png)
Теперь давайте увеличим нашу геометрию относительно центра в 2 раза. Для этого плоскость с вершинами оставим прежнюю, а коробку возьмем в 2 раза меньше по каждому из её краев кроме глубины:
(https://imagizer.imageshack.us/v2/200x200q90/631/aaCDkU.png)
Вершины, не попавшие в коробку отсекаются, содержимое коробки натягивается на вьюпорт - получаем:
(https://imagizer.imageshack.us/v2/200x200q90/673/3YWvez.png)
Теперь произведём увеличение с учетом положения курсора мышки. Положение новой коробки должно быть выбрано таким образом, чтобы курсор до и после увеличения указывал на один и тот же объект (глубиной пренебрегаем).
(https://imagizer.imageshack.us/v2/200x200q90/538/dv4pJj.png)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 14, 2014, 15:59
Давайте сначала с теорией разберемся
после всех матричных преобразований, то есть в нормированном состоянии
). px, py - ширина и высота вьюпорта в пикселях (здесь прошу обратить внимание на то, что не матрица преобразует координаты в пиксели, это мнение, на мой взгляд, ошибочно).
Матрицы ничего не нормируют, они просто перегоняют из одних координат в другие. Никакого "нормированного состояния" не существует. Преобразование вьюпорта матричное, другое дело "в OpenGL нет матрицы переводящей в пиксели" - но никто не мешает сделать ее самому, просто домножив на матрицу вьюпорта.

ModelView матрица выполняет переориентирование геометрии относительно нулевой координаты (надеюсь, правильно выразился)
Не надо искать в матрице какой-то "волшебный смысл" :), это просто перевод из одного пр-ва в другое - здесь из модели во вьюер. Таким образом убедились - от glOrtho и glViewport эта матрица не зависит. Уже хорошо.

Одной из самых популярных матриц проекции является перспективная матрица. Один из способов её задания является описание усечённой пирамиды (Frustum):
(https://imagizer.imageshack.us/v2/432x125q90/911/MQo27a.png)
Полученная усечённая пирамида "сжимается в параллелепипед" (таким образом, что ближайшее сечение сжимается меньше, чем дальнее) и получается эффект перспективы.
Перспектива не описывается матрицей (что бы ни говорил OpenGL).
Матричное (аффинное) преобразование отображает равные отрезки в равные
А для перспективного преобразования это не так. Поэтому НИКАКАЯ матрица не делает из куба фрустум (усеченную пирамиду). Что имеется ввиду в OpenGL - не знаю. Во всяком случае это не та матрица что в математике.

Насчет остального - я подумаю и отпишусь позже. (если смогу, тут опять стрельба  :'()


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 14, 2014, 17:27
Никакого "нормированного состояния" не существует.
Да, загнул.
НИКАКАЯ матрица не делает из куба фрустум (усеченную пирамиду)
Я имел в виду, что происходит имитация пирамиды. Эту имитацию придают значения в третьем столбце


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 15, 2014, 11:30
Обратил внимание
Матричное (аффинное) преобразование отображает равные отрезки в равные
Строго говоря это неверно - напр мы можем вытянуть куб вдоль одной из осей. Правильно "параллельные равные". Кстати и параллельность сохраняется. А перспективное преобразование это просто

x_new = x * focal_length / z;
y_new = y * focal_length / z;

где x, y, z = исходные координаты, а focal_length = параметр перспективной камеры. Ладно, пока разберемся с изометрией

---------------

Из того что Вы рассказали я понял что матрица GL_MODELVIEW никакого отношения к масштабу и пикселям не имеет. Ну и хорошо, тогда просто так

scale = ortho_width / viewport_width;  

ortho_width - размер пресловутой "коробки" по горизонтали (то что подается в glOrtho). Масштаб по Y тот же. При увеличении бОльший размер подается и наоборот. Пусть есть пыксель с координатами x_screen, y_screen (от левого верхнего угла) и мы хотим чтобы при увеличении он остался на месте

x_delta = (x_screen - viewport_width * 0.5) * (scale_old - scale_new);
y_delta = (viewport_height * 0.5 - y_screen) * (scale_old - scale_new);

Получили x_delta и y_delta в координатах вьюера. Эти значения надо добавить в последний столбец матрицы GL_MODELVIEW. Остается проверить на практике  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 15, 2014, 12:46
На практике расписал поиск новых top left на бумаге и получил это
Код
C++ (Qt)
#include <QApplication>
#include <QGLWidget>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QDebug>
 
class Magnifier : public QGLWidget
{
public:
   Magnifier(QWidget* parent = 0) :
       QGLWidget(parent)
   {
       for (int i = 0; i < 5; i++)
           for (int j = 0; j < 10; j++)
           {
               points[(i * 10 + j) * 3] =  -0.8f + (i % 2) * 0.2f + j * 1.6f / 10.0f;
               points[(i * 10 + j) * 3 + 1] = -0.8f + i * 1.6f / 5.0f;
               points[(i * 10 + j) * 3 + 2] = 0.0f;
           }
       top = left = -1.0;
       mag = 1.0;
       countMagWindow(0, 0);
       setMouseTracking(true);
   }
   void initializeGL()
   {
       glClearColor(0.0f, 0.0f, 0.1f, 1.0f);
       glPointSize(3.0f);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
       glMatrixMode(GL_PROJECTION);
   }
 
   void resizeGL(int w, int h)
   {
       glViewport(0, 0, w, h);
   }
 
   void paintGL()
   {
       glLoadIdentity();
       glOrtho(left, left + 2.0 / mag, top + 2.0 / mag, top, -1.0, 1.0);
 
       glClear(GL_COLOR_BUFFER_BIT);
       glColor3f(1.0f, 0.0f, 0.0f);
       glEnableClientState(GL_VERTEX_ARRAY);
       glVertexPointer(3, GL_FLOAT, 0, points);
       glDrawArrays(GL_POINTS, 0, 50);
       glDisable(GL_VERTEX_ARRAY);
 
       glColor3f(0.0f, 1.0f, 0.0f);
       glBegin(GL_LINES);
           glVertex2d(magLeft, magTop);
           glVertex2d(magLeft, magTop + 2.0 / mag / 1.1);
           glVertex2d(magLeft, magTop + 2.0 / mag / 1.1);
           glVertex2d(magLeft + 2.0 / mag / 1.1, magTop + 2.0 / mag / 1.1);
           glVertex2d(magLeft + 2.0 / mag / 1.1, magTop + 2.0 / mag / 1.1);
           glVertex2d(magLeft + 2.0 / mag / 1.1, magTop);
           glVertex2d(magLeft + 2.0 / mag / 1.1, magTop);
           glVertex2d(magLeft, magTop);
       glEnd();
 
   }
   void mouseMoveEvent(QMouseEvent *event)
   {
       qDebug() << QString("x: %1, y: %2").arg(event->x()).arg(event->y());
       countMagWindow(event->x(), event->y());
       updateGL();
   }
 
   void wheelEvent(QWheelEvent *event)
   {
       if (event->delta() > 0)     //от себя
       {
           left = magLeft;
           top = magTop;
           mag *= 1.1;
       }
       else
       {
           countUnMagWindow(event->x(), event->y());
           left = magLeft;
           top = magTop;
           mag /= 1.1;
       }
       countMagWindow(event->x(), event->y());
       updateGL();
   }
 
   void countMagWindow(int x, int y)
   {
       double futureMag = mag * 1.1;
       double right = left + 2.0 / futureMag,
              bottom = top + 2.0 / futureMag;
       magLeft = (right - left) * x / width() * (1.0 / 11.0) + left;
       magTop = (bottom - top) * y / height() * (1.0 / 11.0) + top;
   }
 
   void countUnMagWindow(int x, int y)
   {
       double futureMag = mag / 1.1;
       double right = left + 2.0 / futureMag,
              bottom = top + 2.0 / futureMag;
       magLeft = (right - left) * x / width() * (-0.1) + left;
       magTop = (bottom - top) * y / height() * (-0.1) + top;
   }
 
private:
   float points[50 * 3];
   double top, left, mag,
          magTop, magLeft;
};
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   Magnifier w;
   w.show();
 
   return a.exec();
}
 

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


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 15, 2014, 13:13
Из того что Вы рассказали я понял что матрица GL_MODELVIEW никакого отношения к масштабу и пикселям не имеет.
Имеет.

Помимо способа, предложенного мною, можно не трогать матрицу PROJECTION и масштабировать вершины в матрице MODELVIEW с помощью glScale (устаревшая). А также можно сдвигать вершины вершины по осям, чтобы в коробку попали необходимые с помощью glTranslate (тоже устаревшая).

Я может быть ошибаюсь, но к пикселям имеет отношение почти всё, что встречается на пути по конвейеру (в общем случае). Не совсем понимаю, зачем мы их упоминаем.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 16, 2014, 07:11
Из того что Вы рассказали я понял что матрица GL_MODELVIEW никакого отношения к масштабу и пикселям не имеет.
Имеет.
...
Я может быть ошибаюсь, но к пикселям имеет отношение почти всё, ...
Разумеется любые изменения GL_MODELVIEW повлияют на результат. Но различные вызовы glOrtho никак не изменяют эту матрицу. Поэтому практичнее для операций pan/zoom вообще ее не трогать а просто управлять пр-ком подаваемым в glOrtho

Реализация в аттаче. Если выбран вертекс то он центр масштаба, иначе относительно текущего положения мыши. Замечания:

- для простоты принимается bounding box [-0.5..0.5], по-взрослому он должен вычисляться на основании модели и иметь любые размеры/центр

- выбор вертекса предполагает единичные матрицы OpenGL иначе не будет работать корректно. Ну и вообще перебор всех - не подход.

- возможно более правильно (или технично) использовать gluProject/gluunProject вместо самопальных переводов

Ну в конце-концов это просто пример  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 16, 2014, 07:27
Посмотрел - очень интересно. Но, пока я на тачпаде - выглядит забавно. Разберу код чуть позже.

Вот ещё момент вчера решил. Как будем таскать объект по экрану с помощью ПКМ?

При отпускании мыши она должна указывать на ту же точку геометрии, что и при нажатии. Я это уже решил, но интересно мнение форумчан
P.S.: в своем проекте я выполняю pan за счет трансляции в начале рисования, то есть с помощью ModelView. И это удобно


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 16, 2014, 07:37
Как будем таскать объект по экрану с помощью ПКМ?
Такая аббревиатура мне неизвестна :) Зависит от смысла "таскания". Если имеется ввиду реальное перемещение объекта - то однозначно GL_PROJECTION. Если же меняется view (pan, т.е. скролл окна) то так же как в примере выше.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 16, 2014, 07:57
ПКМ - правая кнопка мыши.

Да, забыл упомянуть, я задачки решаю на ортопроекции.

Тут еще пришло в голову:

destVertex = project * someMatrixOperations * ModelView * sourceVertex.

someMatrixOperations - некие операции трансляции, поворота и масштаба, представлены в виде перемножения различных матриц и очень редко изменяются пользоватлем, или даже вообще не изменяются, например это перенос центра исходной геометрии в центр "экрана", поворот на 100500 градусов вокруг осей и масштабирование в 2 раза, то есть так сказать положение, от которого начинаем плясать. Также нам известно, что projection тоже редко меняется, а ModelView перестраивается на каждом кадре.

Так вот, чтобы сэкономить на операциях предлагаю такой вариант решения задачи:
В матрицу project запишем результат project * someMatrixOperations. Таким образом эта матрица будет хранить не только правила проецирования геометрии, но также и её преднастройку. А матрицу ModelView мы можем вертеть как хочешь.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 16, 2014, 08:06
предлагаю такой вариант решения задачи:
Я один из немногих активно обсуждающих, но поверьте - даже мне неясно о какой задаче Вы говорите?  :) Так часто бывает с автором - ведь у него задача всегда в голове, он думает и у других тоже.

Предлагаю сделать отдельную тему, напр "Создаем OpenGL Viewer с нуля" - и там уже развернуться по полной, со всеми подробностями.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Сентябрь 16, 2014, 08:27
ок, ещё раз  :)

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

Так вот, я предлагаю эту операцию отдать под ответственность матрицы proj. Она меняется редко. Обычно в случае изменения размеров окна. Таким образом получается, что мы на каждом кадре экономим 1 операцию.

Если имеется ввиду реальное перемещение объекта - то однозначно GL_PROJECTION. Если же меняется view (pan, т.е. скролл окна) то так же как в примере выше.

Не важно, каким образом происходит перемещение (но необходим оптимальный). Важно, чтобы на экране пользователя объект был перемещён из точки А в точку Б.
То есть интересно как мы пиксели будем переводить в координаты и производить само перетаскивание каким либо из методов.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 16, 2014, 09:06
Но вот мы знаем, что каждый раз выводя геометрию на экран нам необходимо предварительно сделать ряд однообразных превращений modelview. Пускай это будет перемещение в центр области построения геометрический центр (центр масс) детали (она у нас одна). На протяжении работы с деталью геометрический центр остаётся неизменным. То есть у нас получается, что мы каждый раз при прорисовке детали делаем одну и ту же операцию.
В изометрии есть обязательная операция Fit (вписать) которая гарантирует что все объекты будут полностью видимы. Ее тоже лучше делать не трогая никакие матрицы как в примере выше (см resizeGL). Конечно можно все сделать в одной (любой) матрице, но потом с ней будет неудобно работать. Стандартные роли:

GL_PROJECTION - отражает реальные движения объекта
GL_MODELVIEW - поворот камеры
glOrtho - отвечает за pan/zoom

Все удобно, зачем искать приключений?

(она у нас одна).
Заявления типа "у меня одна (и только одна) модель!", "у меня нет (и не будет) источников света!" показывают, мягко говоря, "недостаток опыта" и капитально отбивают охоту Вам отвечать.

И еще: пожалуйста создайте новую тему, там продолжим. А этот топик я создавал для др целей и больше отвечать Вам здесь НЕ буду. Спасибо за понимание. 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 07, 2014, 15:32
#8) Солнечный свет - он параллельный или как? Параллельны ли "солнечные лучи"?. Чему (какой модели) соответствует солнечный свет в CG? (CG = computer graphics). А в (долбаном) OpenGL? Насколько бесспорно это соответствие?

Данные: радиус Солнца 695,800 km, радиус Земли ~6,400 km, расстояние ~150e+6 km


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 10, 2014, 12:46
Солнечный свет - он параллельный или как? Параллельны ли "солнечные лучи"?.
Мне кажется, смотря как посмотреть. Естественно лучики солнечного света испускаются со сферической поверхности (и не обязательно перпендикулярно к ней).
Думаю, что можно пренебречь тем, что лучи испускаются и они не параллельны. С земли видно, что они якобы обладают некой параллельностью (можно высчитать угол между двумя лучами солнца и увидеть его незначительность).

Чему (какой модели) соответствует солнечный свет в CG? (CG = computer graphics). А в (долбаном) OpenGL?
Про CG = computer graphics не слышал. Слышал про C for Graphics. Он стал прародителем GLSL (что является частью OpenGL).
Если вы имели в виду этот Cg, то я находил несколько моделей на GLSL в книжке Алексея Борескова "Разработка и отладка шейдеров".
Не скажу, что там модели именно для 100% имитации солнца, но что-то на них сделать можно. Советую посмотреть откомпилированные примеры. По моему, там были и примеры на Cg.
В OpenGL 1.x можно попробовать написать некую приблуду, которая позволит оперативно расставлять источники света и регулировать их показатели отражаемости, диффузии и окружающей освещенности. Ну и чтобы она свойства освещаемого материала могла крутить оперативно. Далее тупой подбор.

Насколько бесспорно это соответствие?
Всегда будет спорно. Это же модель, значит учитывает не все аспекты физики.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 10, 2014, 12:58
Если вы имели в виду этот Cg,
Не имел, это 2 разные аббревиатуры

Мне кажется, смотря как посмотреть. Естественно лучики солнечного света испускаются со сферической поверхности (и не обязательно перпендикулярно к ней).
Думаю, что можно пренебречь тем, что лучи испускаются и они не параллельны. С земли видно, что они якобы обладают некой параллельностью (можно высчитать угол между двумя лучами солнца и увидеть его незначительность).
Хмм.. ну вот я дернул фотку наугад (аттач), вроде очень даже значительно


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 10, 2014, 13:17
Цитировать
Хмм.. ну вот я дернул фотку наугад (аттач), вроде очень даже значительно

У меня тож задачка:
Если вечером, прогуливаясь, сильно прищурившись посмотреть на свет от дальних фонарей, то свет от них мы будем видеть в виде вертикальных светлых полос.. Почему так?)     


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 10, 2014, 13:17
Ну, я не особо наблюдательный и в реальной жизни таких рассветов не видал.
Предположим, что есть материальная точка в виде солнца. Расстояние до земли составляет 149.6E9 метров. Предположим, что протяжённость горы, изображенной на фото 200км. Значит от середины горы (за которой и располагается материальная точка) до края горы будет 100Е3 метров.
Подсчитаем угол между лучом по середине и крайним лучом.
alpha = atan(100E3 / 149.6E9) = 3.829931785633275e-005 градуса
На фото мы видим явно завышенный угол. Значит:
1) фотография - фэйк
2) за горой стоит здоровенный отражательный прибор
3) я в чём-то ошибаюсь


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 10, 2014, 13:18
У меня тож задачка:
Если вечером, прогуливаясь, сильно прищурившись посмотреть на свет от дальних фонарей, то свет от них мы будем видеть в виде вертикальных светлых полос.. Почему так?)     

Свет огибает ресницы :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 10, 2014, 13:19
У меня тож задачка:
Если вечером, прогуливаясь, сильно прищурившись посмотреть на свет от дальних фонарей, то свет от них мы будем видеть в виде вертикальных светлых полос.. Почему так?)     

Свет огибает ресницы :)
Нет) Для чистоты эксперимента можно выщипать ресницы) Эффект только усилиться)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 10, 2014, 13:22
У меня тож задачка:
Если вечером, прогуливаясь, сильно прищурившись посмотреть на свет от дальних фонарей, то свет от них мы будем видеть в виде вертикальных светлых полос.. Почему так?)     

Свет огибает ресницы :)
Нет) Для чистоты эксперимента можно выщипать ресницы) Эффект только усилиться)
Боюсь спросить, откуда вы знаете :)
Но если начать наклонять голову от плеча к плечу, то полосы начнут поворачиваться вместе с головой. То есть вертикальность относительно земли пропадёт.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 10, 2014, 13:32
Igors, если вам необходимо получить эффект как на фото, то, думаю, что необходимо это делать как-то через текстуры.
Советую поиграть во всем известную игрушку Serious Sam: first encounter.
Там довольно-таки неплохо нарисовано египетское солнце с использованием OpenGL 1.x. Даже при прямом взгляде на небо появляются блики. Может эта визуализация натолкнет вас на мысли. Есть ещё версия HD, где, скорее всего шейдеры.
В аттаче интерфейс той самой приблуды, которую я приблизительно имел в виду.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 18, 2014, 07:46
(опять на неделю отрубили  :'()
У меня тож задачка:
Если вечером, прогуливаясь, сильно прищурившись посмотреть на свет от дальних фонарей, то свет от них мы будем видеть в виде вертикальных светлых полос.. Почему так?)     
Тут неск эффектов, неясно о каком Вы. Если "большие мутные" полосы - то (полагаю) связано со слезой омывающей глаз. Но есть др эффект - если смотреть на лампочку прищурившись, то видны яркие тонкие лучи, местами концы чуть загибаются. Почему - не знаю. Популярное объяснение "ресницы образуют грубую дифракционную решетку" ничего не объясняет. Ну решетка, и что с того? Кстати и для совершенно др эффектов объяснение дается то же самое  :) Поэтому с удовольствием послушаю, подробненько пожалуйста     


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 18, 2014, 08:17
Подсчитаем угол между лучом по середине и крайним лучом.
alpha = atan(100E3 / 149.6E9) = 3.829931785633275e-005 градуса
На фото мы видим явно завышенный угол. Значит:
1) фотография - фэйк
2) за горой стоит здоровенный отражательный прибор
3) я в чём-то ошибаюсь
Ну ход мысли неплохой :) Кстати вместо atan гораздо лучше использовать atan2. Но гора здесь совершенно ни при чем. 

Солнечные лучи не параллельны, т.к. мы видим солнце как диск (а не точку). Напр один луч приходит с верхней части диска, др с нижней, очевидно их направление немного различно. Насколько
atan2(sun_radius, distance_to_sun) = ~0.25 градуса.
В большинстве случаев этим можно пренебречь и считать направление солнечного света одним вектором. Но не всегда.

Направление и разброс лучей остается практически тем же для любой точки "земной" сцены, разница даже в тысячи километров пренебрежимо мала по сравнению с расстоянием до солнца.

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



Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:19
А на фотографии мы просто видим эффект перспективы, вспомните как "сходятся" рельсы на горизонте. Представьте себе трамвайчик едущий от широкой части луча к узкой, чем он дальше тем меньше его визуальный размер. Если мы будем отходить назад то увидим что шаффлы выпрямляются. В этом смысле глаз - тоже фейк, он работает как перспективная камера.

Да, но расстояние между рельс у нас в ногах 1520 мм, а в дали примерно 0 (визуально, естественно). То, как вы представляете перспективу солнечных лучей можно перенести на рельсы так: Расстояние между рельс в дали 1520, а в ногах примерно очень много.

Я нарисовал в компасе солнце и землю (см. аттач, рисовал в Kompas 14 Build 1159 (http://rutracker.org/forum/viewtopic.php?t=4618712)). К сожалению png низкого качества заняла 5 мб и выложить её я не смогу. Из-за ограниченности компаса я принял за единицу измерения 1000км. В аттаче 2 мы видим под каким углом приходят лучи от солнца к "полюсам" земли (лучи изображены бирюзовым цветом, поверхности земли и солнца синим). Этот угол мне средствами компас вывести не удалось. Он его округляет до 0.

Что по поводу ресниц, предполагаю, что "усиленные" полосы это интерференция относительно ресниц (2 луча огибают ресницу с двух сторон и оба приходят в одну точку являясь лучом "в два раза" ярче)
(https://upload.wikimedia.org/wikipedia/commons/8/8e/Fentes_young.jpg)
А размытые полосы это лучепреломление (дифракция) + слеза + ещё что-то


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 18, 2014, 12:20
Да, но расстояние между рельс у нас в ногах 1520 мм, а в дали примерно 0 (визуально, естественно). То, как вы представляете перспективу солнечных лучей можно перенести на рельсы так: Расстояние между рельс в дали 1520, а в ногах примерно очень много.
Напоминает "что тяжелее: килограмм гвоздей или килограмм ваты ?" :)  Физически расстояние одинаково вблизи и вдали, а если говорить о "видимом размере" то он совсем не 1520. Художники меряют "на карандаш"  (на вытянутой руке). Пусть мы находимся на некотором расстоянии d от трамвая, его видимый размер по вертикали напр "1 карандаш". Теперь если он отъедет от нас на расстояние 2d, то его видимый размер станет "пол-карандаша". Строго говоря
Цитировать
visible_y = real_y * focal_length / (d + focal_length);
Но focal_length глаза мало, сантиметра 2 макс

Я нарисовал в компасе солнце и землю (см. аттач, рисовал в Kompas 14 Build 1159 (http://rutracker.org/forum/viewtopic.php?t=4618712)). К сожалению png низкого качества заняла 5 мб и выложить её я не смогу. Из-за ограниченности компаса я принял за единицу измерения 1000км. В аттаче 2 мы видим под каким углом приходят лучи от солнца к "полюсам" земли (лучи изображены бирюзовым цветом, поверхности земли и солнца синим). Этот угол мне средствами компас вывести не удалось. Он его округляет до 0.
Ничего не понял :) Возможно Вы исходили из предположения что лучи "исходят перпендикулярно поверхности солнца" или "радиально от центра" - но это не так. Напр в случае солнечного затмения оставшийся кусочек солнца все же светит.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 18, 2014, 12:44
Игорь, возьмите любую CAD систему и попробуйте там порисовать задачку или воспользуйтесь моим файлом.
Возьмите два произвольных отрезка, один из концов которых лежит на солнце, а другой на земле.
Вы увидите, что угол между этими отрезками неприлично мал (много меньше 0,25), как бы вы их не взяли.

Я имел в виду, что на фотографии неправдоподобная перспектива.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 18, 2014, 14:22
Игорь, возьмите любую CAD систему и попробуйте там порисовать задачку или воспользуйтесь моим файлом.
Возьмите два произвольных отрезка, один из концов которых лежит на солнце, а другой на земле.
Вы увидите, что угол между этими отрезками неприлично мал (много меньше 0,25), как бы вы их не взяли.
Макс разброс составляет 0.5 градуса (0.25 * 2) для любых 2 лучей на противоположных точках солнца. Возможно Вы пытаетесь найти разброс "из точки Солнца", там действительно он ничтожен. А вот "с точки Земли" он совсем не пренебрежимо мал.

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

Ладно, а когда такой малый угол (+/- 0.25) имеет значение? (наверное в CAD'ах есть ответ и на этот вопрос  :))


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 18, 2014, 15:50
Ладно, а когда такой малый угол (+/- 0.25) имеет значение? (наверное в CAD'ах есть ответ и на этот вопрос  :))
Если это как-то относится к освещению детали или сборки, то можно забить, я думаю.
Если это относится к размерам/допускам деталей ответственного назначения, то явно не стоит забивать :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 18, 2014, 20:24
Знаю как объяснить свечение на той картинке.
Как я и говорил, за горой стоит большой светоотражательный элемент. А именно сама гора.
Гора, являясь полусферой, принимает параллельные лучи на всю свою заднюю поверхность. Те в свою очередь отражаются от этого скругления на все 180 градусов. Равносильно дискошару.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 19, 2014, 11:09
Знаю как объяснить свечение на той картинке.
Как я и говорил, за горой стоит большой светоотражательный элемент. А именно сама гора.
Гора, являясь полусферой, принимает параллельные лучи на всю свою заднюю поверхность. Те в свою очередь отражаются от этого скругления на все 180 градусов. Равносильно дискошару.
Ой  :)

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


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Ноябрь 19, 2014, 12:11
Если это как-то относится к освещению детали или сборки, то можно забить, я думаю.
А вот NVidia (и др монстры) почему-то забивать не хотят, бросают на решение этой проблемы лучших разработчиков (впрочем без особого успеха)

ИМХО для работы в CAD это маловажно. Необходимость суперосвещения в CAD равносильна необходимости в тесселяции. Единственное, к чему это можно прикрутить - какой-нибудь PhotoView.
А вам зачем суперосвещение, если не секрет?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 19, 2014, 21:03
Тут неск эффектов, неясно о каком Вы. Если "большие мутные" полосы - то (полагаю) связано со слезой омывающей глаз. Но есть др эффект - если смотреть на лампочку прищурившись, то видны яркие тонкие лучи, местами концы чуть загибаются. Почему - не знаю. Популярное объяснение "ресницы образуют грубую дифракционную решетку" ничего не объясняет. Ну решетка, и что с того? Кстати и для совершенно др эффектов объяснение дается то же самое  :) Поэтому с удовольствием послушаю, подробненько пожалуйста     
Я говорю о эффекте как на фото по ссылке: http://id85679450.35photo.ru/photo_748506/ (http://id85679450.35photo.ru/photo_748506/) Правда там шесть лучей, но это это не принципиально.. Если бы диафрагма была в виде щели, то получилось бы два луча (перпендикулярные перпендикулярные плоскости щели).
На самом деле это чисто квантовый эффект) Свет - это частица (фотон) и такая картина получилась даже если бы мы бомбардировали матрицу одиночными фотонами (фотон-пауза, фотон-пауза и т.д..)

Есть хорошая книга у Фейнмана (для школьников) "КЭД - странная теория света и вещества." написанная очень доступным языком (на пальцах) без лишних формул (скачать можно, например здесь http://ilib.mccme.ru/djvu/bib-kvant/ked.htm (http://ilib.mccme.ru/djvu/bib-kvant/ked.htm)).
Там есть ответ не только на этот эффект (с. 50), но и на много чего интересного) Рекомендую, читается легко)
   


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 20, 2014, 07:07
Я говорю о эффекте как на фото по ссылке: http://id85679450.35photo.ru/photo_748506/ (http://id85679450.35photo.ru/photo_748506/) Правда там шесть лучей, но это это не принципиально.. Если бы диафрагма была в виде щели, то получилось бы два луча (перпендикулярные перпендикулярные плоскости щели).
На самом деле это чисто квантовый эффект) Свет - это частица (фотон) и такая картина получилась даже если бы мы бомбардировали матрицу одиночными фотонами (фотон-пауза, фотон-пауза и т.д..)
Это популярный эффект "flares" (можно "фларики") который просто "рисуется" (обычно поверх) рез-та рендера. Но, насколько мне известно, он вызывается конструкцией камеры, точнее ее несовершенством, отражениями внутри. У каких-то видов телескопов тоже есть такой дефект, у др нет.

Однако я совершенно не вижу как это для глаза. Ресницы "отражают" - ну никак не лепится, хоть мокрые хоть сухие.

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

А размытые полосы это лучепреломление (дифракция) + слеза + ещё что-то
Лучепреломление (refraction) это изменение направления луча пр переходе из одной среды в другую (напр из воздуха в воду). Дифракция - весьма широкий термин, часто связывается с длиной волн спектра (напр радужные переливы), но также и "огибание волной препятствий". Напр через достаточно узкую щель часть света пройдет "по бокам", но об усилении хотя бы вдвое нет и речи.


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 20, 2014, 20:54
Цитировать
Это популярный эффект "flares" (можно "фларики") который просто "рисуется" (обычно поверх) рез-та рендера. Но, насколько мне известно, он вызывается конструкцией камеры, точнее ее несовершенством, отражениями внутри. У каких-то видов телескопов тоже есть такой дефект, у др нет.
"Отражения внутри" здесь ни при чём.. И это не дефект камеры) То фото было сделано при зажатой диафрагме ("прищуривание") и длиной выдержке.. Возьмите спичечный коробок, прорежьте с фронтальной стороны лезвием щель а с другой вставьте плёнку..  После экспозиции эффект будет такой же: два луча от источника, перпендикулярных щели.
У объектива (при зажатой диафрагме) будет столько лучей, сколько лепестков у диафрагмы..

Цитировать
Однако я совершенно не вижу как это для глаза. Ресницы "отражают" - ну никак не лепится, хоть мокрые хоть сухие.
Да чёрт с ними, с ресницами - это здесь не принципиально..


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 21, 2014, 15:08
Возьмите спичечный коробок, прорежьте с фронтальной стороны лезвием щель а с другой вставьте плёнку..  После экспозиции эффект будет такой же: два луча от источника, перпендикулярных щели.
Ну где я пленку возьму... Хорошо, попробуем на пустой сигаретной пачке. Ровным счетом ничего не происходит - свет проходит через щель, но никаких перпендикулярных лучей нет. Да и с чего бы им взяться? Как ни прищуривайся - там хорошие "доли миллиметра", до которых длине волны далеко.

Немного покопался в инете, совсем не густо. Вот 2 ссылки где, по крайней мере, внятно сказано почему  

http://www.thephotoforum.com/threads/lens-flare.259629/ (http://www.thephotoforum.com/threads/lens-flare.259629/)
Цитировать
The spikes are caused by the lens aperture blades.

http://dptnt.com/2007/12/what-causes-the-sparkles-in-night-photos/ (http://dptnt.com/2007/12/what-causes-the-sparkles-in-night-photos/)
Цитировать
Apparently this is caused by a physics phenomenon called diffraction. Diffraction occurs when light hits an opaque edge in the light path, such as the aperture blades in the lens. Diffraction causes the light to be spread out in a plane that is perpendicular to the edge from where the diffraction occurs. So you get two points of sparkle from one edge. If there are odd number of aperture blades in the lens, you get 2X the number of points for the sparkle. If the lens has even number of aperture blades, you get the same number of points as the number of the blades due to over-lapping points of sparkle.

Ну наверное "blade" здесь - тонкая проволока, что ли. Применительно к глазу - без ресниц ничего интересного  не будет, поэтому выщипывать не стоит :) Но как происходит дифракция на ресницах - не понимаю


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 05, 2014, 18:21
#9) Какой геометрический смысл следующих выражений
Код
C++ (Qt)
QVector3D v0, v1;
..
float a1 = QVector3D::dotProduct(v0, v1) / (v0.length() * v1.length());
float a2 = QVector3D::dotProduct(v0, v1) / v0.length();
float a3 = QVector3D::dotProduct(v0, v1) / v0.lengthSquared();
QVector v2 = v0 * a3;
QVector v3 = v1 - v2;
 
Др словами кто такие a1, a2, a3, v2. v3. чему они соответствуют?


Название: Re: Геометрия (задачки)
Отправлено: kambala от Декабрь 05, 2014, 18:38
a1 — косинус угла между v0 и v1, остальное вроде с проекцией связано


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Декабрь 05, 2014, 22:39
v3 - вектор между точками, начало которого в 0. То есть, известно направление и длина.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 06, 2014, 10:24
a1 — косинус угла между v0 и v1, остальное вроде с проекцией связано
Неплохо, обычно выпускник и косинуса не помнит :)
Кстати, а что Вы думаете о классе QVector3D?

v3 - вектор между точками, начало которого в 0. То есть, известно направление и длина.
Неожиданный ответ, поясните ход рассуждений


Название: Re: Геометрия (задачки)
Отправлено: kambala от Декабрь 06, 2014, 13:46
а а2 (длина вектора умножить на косинус) — это не направляющий косинус? (в памяти всплыло)
Кстати, а что Вы думаете о классе QVector3D?
никогда им не пользовался, так что толком ничего сказать не могу. беглый просмотр показал наличие классических векторных операций.

P.S. вспомнилась тема про поворот вектора вокруг оси: а с этим мог бы справиться кватернион?
Цитировать
The QQuaternion class represents a quaternion consisting of a vector and scalar.

Quaternions are used to represent rotations in 3D space, and consist of a 3D rotation axis specified by the x, y, and z coordinates, and a scalar representing the rotation angle.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Декабрь 06, 2014, 14:43
Кстати, а что Вы думаете о классе QVector3D?

v3 - вектор между точками, начало которого в 0. То есть, известно направление и длина.
Неожиданный ответ, поясните ход рассуждений
Почему-то QVector3D/4D использую только для передачи в матрицу столбца. Всё остальное делаю своими inline (наверное, быстрее работают - но не проверял). Просто мало доверяю.

Я рассуждаю, что v1 и v2 это координаты точек в пространстве. Между ними заточён вектор, начало которого в v2. Если мы возьмем координаты точек этого вектора и вычтем из обеих v2, то получим v1 - v2; v2 - v2, точки, между которых заточён вектор с тем же направлением и длиной. Так как v2 - v2 = 0, его начало находится в 0.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 07, 2014, 10:57
P.S. вспомнилась тема про поворот вектора вокруг оси: а с этим мог бы справиться кватернион?
Конечно, ведь он для вращения и предназначен

Ладно, вернемся к теме
Цитировать
float a2 = QVector3D::dotProduct(v0, v1) / v0.length();
Это проекция вектора v1 на направление заданное вектором v0. Или, точнее, знаковая длина проекции, т.к. a2 скаляр. Заметим что смыслов/интерпретаций может быть много. Не надо считать что "если это верно - значит другое неверно". Напр можно и по-другому

a2 - это косинус угла между векторами помноженный на длину v1 (как бы с точки зрения алгебры)
a2 - это координата точки v1 на оси v0 (так v1 вектор или точка? Имеем право считать так и так  :))

Цитировать
float a3 = QVector3D::dotProduct(v0, v1) / v0.lengthSquared();
QVector v2 = v0 * a3;
QVector v3 = v1 - v2;
a3 - тоже длина проекции но относительно длины вектора направления. Вектор v2 - вектор проекции (кстати вычисленный без вызова sqrt). И наконец v3 - вектор второй проекции перпендикулярный v2. В итоге исходный v1 разложен на 2 составляющих v2 и v3 (ну конечно имена им надо дать поприличнее)

Этот простейший прием используется очень часто. Пример
Цитировать
Есть отрезок заданный точками p0 и p1. Найти на нем точку с минимальным расстоянием до заданной точки pt
Разумеется мы открываем описание QVector3D
Цитировать
Чебоксары... чебуреки... а Чебурашки нет
Да, вот есть метод distanceToLine, но это не то..

Ваши действия? 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 05, 2015, 11:26
#10) "Шейдеры" сейчас очень модны, их хотят подключать, иметь :) Увы, дальше тупенького переписывания дело обычно не идет (впрочем такова природа OpenGL). Ладно, попробуем "копнуть". Вот неплохое изложение (http://andmonahov.blogspot.ru/2012/10/opengl-es-20.html), где есть чертеж и формула
Цитировать
float diffuse = k_diffuse * max(dot(n_normal, lightvector), 0.0);
которая является базовой (канонической) и так или иначе присутствует практически в любом fragment shader'е. Однако в реальном мире эта формула далеко не всегда применима. Приведите пример(ы) где эта формула неверна.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Февраль 05, 2015, 13:02
дальше тупенького переписывания дело обычно не идет
не соглашусь. формула описывает один источник света. Если требуется N источников, то модифицируем.
Вопрос чем-то похож на моделирование солнца... Вопрос, только в каком масштабе вы работаете. В макрообъёме можно, учитывать шероховатость поверхности и другие параметры. В микрообъёме конфигурацию и тип зёрен (если для металла), но там и расчёты будут немного тяжелее.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 05, 2015, 13:25
не соглашусь. формула описывает один источник света. Если требуется N источников, то модифицируем.
С этим никто не спорит, более того, принимаем что свет имеет направление упрощенно описываемое вектором (в жизни это не так - ну да ладно).

Вопрос чем-то похож на моделирование солнца... Вопрос, только в каком масштабе вы работаете. В макрообъёме можно, учитывать шероховатость поверхности и другие параметры. В микрообъёме конфигурацию и тип зёрен (если для металла), но там и расчёты будут немного тяжелее.
Речь здесь не идет о каких-то "микро-нюансах", напротив, в комнате где Вы сидите наверняка есть объекты для которых эта формула неверна. А на улице их еще больше  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Февраль 05, 2015, 13:35
Она ни к чему не применима если критерии адекватности модели будут жесткими.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Февраль 05, 2015, 13:39
Применима, наверное, к однородному, цельному куску материала.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 05, 2015, 13:52
... критерии адекватности модели будут жесткими.
Ага, блистаем академическим образованием - это хорошо  :)

Применима, наверное, к однородному, цельному куску материала.
Давайте рассматривать объекты которые Вы можете нормально держать в руке (и часто делаете это), то есть да - однородные, цельные


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Февраль 05, 2015, 14:48
Однородность это http://www.ngpedia.ru/id206466p1.html (http://www.ngpedia.ru/id206466p1.html)
Те предметы, которые можно взять со стола, имеют, по крайней мере, переменный k_diffuse


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 05, 2015, 15:04
Те предметы, которые можно взять со стола, имеют, по крайней мере, переменный k_diffuse
Не надо так доверчиво воспринимать все что пишут в OpenGL. То k_diffuse - совсем не число, а цвет/фильтр. Напр "предмет красный" - значит он отражает красные лучи (часть спектра) а остальные поглощает. Если "темно-красный" - ну поглощает и часть  красных. Однако это не имеет отношения к вопросу.
 


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Февраль 05, 2015, 15:14
Я имел в виду подобное строение материалов на макроуровне:
(http://arzpuck.ru/pic/arz050pic040.jpg)
Но, тут можно, конечно, измельчением сетки и нормалями всё допилить.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 05, 2015, 15:40
Однородность это http://www.ngpedia.ru/id206466p1.html (http://www.ngpedia.ru/id206466p1.html)
Видимо авторитетность источника оценивается по принципу "у кого денег больше"  :)

Но, тут можно, конечно, измельчением сетки и нормалями всё допилить.
То измельчение обойдется в мульены полигонов, поэтому такие мелочи делают bump'ом. Вообще микродетали - интереснейшая тема, но там обычно первую скрипку играет specular (аттач). Диффуза слишком вялая для этого


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 06, 2015, 14:28
Ну вот и ответы иссякли :)  Ладно, посмотрим какие объяснения дает автор блога

Цитировать
В общем случае скалярное произведение может быть отрицательным, если угол между векторами больше 90 градусов. Отрицательные значения нам нужно отсечь. Поэтому выберем максимальное значение между скалярным произведением и нулем:
max(dot(n_normal, lightvector), 0.0)
По существу это утверждение "источник не освещает заднюю (по отношению к нему) сторону объекта". Что справедливо для большинства материалов - но далеко не для всех

1) (полу)Прозрачные объекты, напр стакан из которого пьем чай или водку. Очевидно часть света проникает и на заднюю сторону

2) Многие "organic" объекты/материалы. Напр листья деревьев (или даже лист бумаги если не плотный ватман) непрозрачны (мы не видим перекрытые ими объекты), но свет пропускают. А у некоторых растений задняя сторона листьев выглядит даже ярче передней.

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

Ну и так далее  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 02, 2015, 12:04
#11) Продолжим тему шейдеров. Вторая формула - расчет specular (бликов) также давно стала канонической и переписывается из поколения в поколение
Цитировать
float specular = k_specular * pow( max(dot(lookvector,reflectvector),0.0), 40.0 );
Источник тот же (http://andmonahov.blogspot.ru/2012/10/opengl-es-20.html). Вместо 40 чаще юзают 200 (или песню с "блинном") - но не суть.

Собственно это ничем не плохо, но узковато, бедно. На всех картинках мы ясно видим: светит "точка" напр солнце или лампочка. Но всегда ли это так? Если мы в комнате - светит окно, а это прямоугольник. Какая формула для этого?


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 02, 2015, 12:19
Кажется, это называется Cube Map Texturing


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 02, 2015, 12:23
Хотя, возможно, заблуждаюсь


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 02, 2015, 14:30
Попробуйте погуглить opengl car reflection


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 03, 2015, 10:44
См схемку (из того же блога Андрея). Как бы нам вместо лампочки (вверху слева) зарядить окно? Просто так не выходит, окно имеет площадь, поэтому какого-то одного выходящего вектора для окна нет. Поэтому давайте трассировать не от источника, а наоборот - от камеры (глаза). Тогда отразится не синий луч, а красный - см второй аттач. Итого: есть точка и луч исходящий из нее. Найти попадает ли этот луч в заданное окно.

Ну что - все равно никак?  :'(


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 03, 2015, 12:36
Может поможет...
https://prezi.com/dpejfl_wkxml/opengl-reflections/ (https://prezi.com/dpejfl_wkxml/opengl-reflections/)
http://artis.imag.fr/Recherche/RealTimeShadows/pdf/stencil.pdf (http://artis.imag.fr/Recherche/RealTimeShadows/pdf/stencil.pdf) - страница 24


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 03, 2015, 13:34
Может поможет...
https://prezi.com/dpejfl_wkxml/opengl-reflections/ (https://prezi.com/dpejfl_wkxml/opengl-reflections/)
http://artis.imag.fr/Recherche/RealTimeShadows/pdf/stencil.pdf (http://artis.imag.fr/Recherche/RealTimeShadows/pdf/stencil.pdf) - страница 24
Этот топик создавался не для того чтобы мне помогали :) Это "задачки" - простые и (надеюсь) интересные. Не надо воспринимать их с позиции OpenGL и немедленно чего-то "прикручивать". Если решение ясно - можно и перевести на GLSL (напр в данном случае это несложно), но необязательно. В любом случае сначала разрабатывается алгоритм, а потом уже его железячная реализация.

Возвращаясь к окну. Reflection map (карта отражения) отражает "окружение" (часто небо) которое "бесконечно далеко", но совсем не окно комнаты имеющее реальные размеры. Напр для объектов вблизи окна наш specular большой, для дальних маленький. А если объект поместить достаточно "вбок" от окна то вообще specular'а не увидим. Reflection map ничего этого не делает.

Просьба думать самостоятельно а не рыться в гнусном OpenGL отстойнике, ничего хорошего там нет.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 10, 2015, 09:44
12) Опять шейдеры. Как уже упоминалось, wireframe  (проволочный каркас) может освещаться. Но по каким-то причинам это не выглядит "так уж хорошо" (левая картинка). Вот если мы заменим каждый сегмент на модельку цилиндра - тогда другое дело (правая картинка). Увы, такая замена - операция совсем не мгновенная и очень дорогостоящая, объем данных вырастает в десятки раз. Отсюда 2 квешнза:

- а почему линии/проволока так уныло, тускло рендерится?
- а не сбацать ли нехилый шейдерок чтобы рендерил линии как справа?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 13, 2015, 12:05
Ну вот, опять нет смелых :'( Ладно, попробуем оживить. Два момента

1) Заверяю что OpenGL познания здесь НЕ требуются, его технические подробности здесь совершенно ни при чем. Вот если дело дойдет до конкретной GLSL реализации - вот тогда надо будет читать ихние опусы, может спрашивать на gamedev (где в лесах много диких обезьян) и.т.п. А на уровне разработки алгоритма/решения ничего этого нет (и слава богу).

2) Утверждение "мы видим объекты" спорно. Мы видим как они освещены. Напр если нет никакого света - все черное, ничего не видим.

Ну, как говорят буржуины, "hope that helps"  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 16, 2015, 10:14
13) Как Вы знаете, 3D модель имеет данные нормалей (для каждого вертекса). Здравый смысл говорит что нормаль - это перпендикуляр к поверхности, поэтому "нормальные" нормали должны быть как на рисунке слева (ну может развернуты на 180). Однако иногда умышленно создают совсем другие нормали, как справа. (особенно этим любят заниматься с OpenGL  :))

Зачем так делают ?


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Август 17, 2015, 15:03
В OpenGL освещение граней базируется на нормалях, насколько я знаю. Таким образом можно различные эффекты получать.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 17, 2015, 15:22
В OpenGL освещение граней базируется на нормалях, насколько я знаю.
В "не OpenGL" тоже  :)

Таким образом можно различные эффекты получать.
Какой же полезный эффект мы получаем направляя нормаль вверх?


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Август 18, 2015, 15:10
Таким образом можно задать нормаль по умолчанию, если известно, что объектом является, например, карта высот. Этим мы экономим время для рассчета усредненных нормалей в каждой вершине, если нужен рендеринг в реальном времени. Сами как-то так делали.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 18, 2015, 17:06
Таким образом можно задать нормаль по умолчанию, если известно, что объектом является, например, карта высот. Этим мы экономим время для рассчета усредненных нормалей в каждой вершине, если нужен рендеринг в реальном времени. Сами как-то так делали.
Ну такое решение для меня - слишком смелое  :) Не очень естественный ландшафт. Но "тепло"  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 08, 2016, 12:01
14) Сочный бабец :) Но кому (и зачем) понадобилось так ее рисовать, причем с довольно высоким квачеством (оригинал 2048х2048)?


Название: Re: Геометрия (задачки)
Отправлено: Old от Март 08, 2016, 12:14
Похоже на текстуру натягиваемую на объект голова. :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Март 08, 2016, 18:50
Да, с 8 марта вас, дорогие наши дамы)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 22, 2016, 14:30
15) Почему объект (напр шарик) красный? Физики никакой не знаю (правда), довольствуюсь простым объяснением типа: "ну потому что красные лучи он отражает (пере-излучает), а другие нет". Правда он может еще и блестеть (и совсем не красным), ну то ладно, пусть шарик из грубой резины, нет никаких блесков (только "диффузное" освещение). Выберем на нем какую-то точку и будем ходить вокруг. С какой точки (угла) ни посмотри - целевая точка одинаково красная. Из этого часто делается вывод типа
Цитировать
Лучи отражаются (пере-излучаются) одинаково интенсивно во всех напр-ях, поэтому диффузное освещение не зависит от позиции камеры/наблюдателя
Согласны ли Вы с этим утверждением? Если нет то как доказать что оно неверно?



Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Март 22, 2016, 17:58
Расположение источников света и возможные тени от других объектов никто не отменял, поэтому такое возможно только для сферического шарика в вакууме :) хотя, и для него тоже невозможно...


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 23, 2016, 11:19
Расположение источников света и возможные тени от других объектов никто не отменял, поэтому такое возможно только для сферического шарика в вакууме :) хотя, и для него тоже невозможно...
Что "такое" и что "(не) возможно"? :)  В жизни все излучает (или пере-излучает). Где-то читал: "да-да, поверьте, Ваши штаны тоже излучают!" :).

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


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 23, 2016, 11:33
Излучающие штаны... Вы где то рядом с АЭС живёте что ли?


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 13:38
Как излучающие штаны связаны с "Геометрия (задачки)"?  :D :D :D


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 23, 2016, 16:45
Это ж Igors... У него штаны переизлучают свет. Новое слово в геометрии  - поглощение и отдача световой энергии красным шариком и штанами.

PS это вообще возможно - переизлучение то? На мой взгляд это рушит теорию сохранения энергии :D


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 16:50
16) Сколько нужно Igors, чтобы заставить штаны переизлучать?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 23, 2016, 17:33
Это ж Igors... У него штаны переизлучают свет.
Как и Ваши. Не надо связывать слово "излучение" с "радиация - Чернобыль - хана". Любой предмет в реальной жизни излучает - поэтому мы и видим его цвет. Иначе это был бы абсолютно черный силуэт/дыра.

Вы в комнате, яркое солнце смотрит в в окно. Поставьте на пол лист белой бумаги ребром, так чтобы этот лист освещался солнцем. На полу Вы увидите довольно мощное излучение (пятно).   

:D :D :D
Вы там случайно не упысались? Все-таки до каких высот может докатиться человек усердно всасывая "документацию"  :)   


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 17:42
Любой предмет в реальной жизни излучает - поэтому мы и видим его цвет. Иначе это был бы абсолютно черный силуэт/дыра.
:D :D ;D :D ;D :D :D

Исходя из этой тиории вы тоже излучаете  ;D


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 17:44
Вы там случайно не упысались?

Ещё чуть-чуть и точно  :D


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 23, 2016, 17:52
Igors, штаны не излучают...
Это солнечный свет отражается от них и попадание в ваши глаза. Именно так это работает.
Т.е. происходит отражение части световых потоков. А цвет мы определяем из состава отраженного излучения. Сколько то штаны поглотили, вот на основании этого мы и решаем что они красные али синие :)

Излучать могут предметы, в которых протекают реакции, например лампочка(нагрев) или фосфор(хим реакции) или атомные реакторы(эффект черенкова).

Переизлучать материалы не могут. Они могут поглотить излучение, потратить его на какие-либо реакции и начать излучать самим. Ну если выразиться проще - они поглотят излучение света и будут излучать сами, причем это будут два разных по составу и интенсивности излучения.
Самый яркий пример такого "поглощателя-излучателя" это люминофоры. Они на краю понятия переизлучения, но увы, это разные излучения :D

to Heaven - нечего ржать, все мы излучаем :) Самый наглядный пример - тепловое излучение, али инфакрасное. Легко проверяется приборами ночного видения. Так же чуток электромагнитного :)

PS создание переизлучающего материала подорвёт современную физику. К примеру закон сохранения энергии будет нарушен.


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Март 23, 2016, 19:02
Цитировать
Излучать могут предметы, в которых протекают реакции, например лампочка(нагрев) или фосфор(хим реакции) или атомные реакторы(эффект черенкова).

Переизлучать материалы не могут. Они могут поглотить излучение, потратить его на какие-либо реакции и начать излучать самим. Ну если выразиться проще - они поглотят излучение света и будут излучать сами, причем это будут два разных по составу и интенсивности излучения.
Самый яркий пример такого "поглощателя-излучателя" это люминофоры. Они на краю понятия переизлучения, но увы, это разные излучения

to Heaven - нечего ржать, все мы излучаем  Самый наглядный пример - тепловое излучение, али инфакрасное. Легко проверяется приборами ночного видения. Так же чуток электромагнитного

PS создание переизлучающего материала подорвёт современную физику. К примеру закон сохранения энергии будет нарушен.
Абсолютная бредятина.. Особенно последний PS. Вы про приборы ночного видения что-нить слыхали?

Все тела излучают - это экспериментальный факт, даже чёрные дыры. Погуглите про равновесное тепловое излучение, и про распределение Планка.
А лучше вообще со школьной физики начать, перед тем как делать подобные перлы
Цитировать
создание переизлучающего материала подорвёт современную физику. К примеру закон сохранения энергии будет нарушен.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 19:10
Мы на каком уровне рассматриваем? Сюда можно ещё закон стефана-больцмана добавить так-то...


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Март 23, 2016, 19:16
Мы на каком уровне рассматриваем? Сюда можно ещё закон стефана-больцмана добавить так-то...
Я на фундаментальном, а вы? И зачем здесь приближённый закон Стефана-Больцмана, когда мы имеем точную теорию Планка?)


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 23, 2016, 20:59
Вы ещё реликтовое излучение приплетите :D Которое везде есть, но его никто не нашёл :D

m_ax, ваши теории говорят лишь о том, что тепловая энергия просто излучается и поглощается в рамках данной темы. Ну если проще сказать, все предметы в мире подвергаются тепловому воздействию и воздействуют друг на друга, излучая и поглощая.
Но если вы возьмёте штаны и положите их в комнату с четким 0 по цельсию, тепловое излучение исчезнет через некоторое время, т.к. штаны не источник тепла, а всего лишь ммм... накопитель? Всего лишь участник общего теплообмена.

А вот допустим факел является именно источником тепла и света. И даже помещение его в нейтральную среду не изменит того, что он излучает.

PS можно вообще до кварков опуститься и понять, что там всё постоянно в неопределённом положении :D

PPS перепутал прибор ночного видения и теплового. Как то они у меня в одно устройство подумались :D

PPPS ну или вообще до нейтрино дойти можно. Они ж тоже взаимодействуют и даже давление оказывают, но в данном случае оно пренебрежительно мало :P

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


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Март 23, 2016, 21:30
Я к тому, что штаны излучение дают, но оно столь незначительное, что в обыденной жизни им можно пренебречь. И что их цвет точно не зависит от этого излучения. 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 24, 2016, 09:40
Излучать могут предметы, в которых протекают реакции, например лампочка(нагрев) или ..
Уже лучше. Да, в "бытовом" смысле под "излучением" часто понимают активный (первичный) источник света. Поэтому я и выражался осторожно ("отражают (пере-излучают)").

Простой пример: в комнате одна лампочка, др источников света нет. Положите руку на стол, под ней будет довольно густая тень. Теперь "несите" руку к лампочке. Тень становится все больше и больше, но также и бледнее. Почему так происходит? И вообще почему в тени все довольно хорошо видно - откуда же там взялся свет если лапочка перекрыта?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 24, 2016, 09:45
Я к тому, что штаны излучение дают, но оно столь незначительное, что в обыденной жизни им можно пренебречь. И что их цвет точно не зависит от этого излучения. 
Выше пример с ярко освещенным листом бумаги. Попробуйте взять напр красный лист вместо белого. По поводу "пренебречь" см мой предыдущий пост. Это только OpenGL засранцы включают "амбиент" и счастливы :)


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 24, 2016, 16:32
А вот тут мы подходим к двум вещам:
1) прозрачность
Часть излучения проходит сквозь предметы.
2) отражение
Часть излучения отражается

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

Если убрать отражённый свет, допустим отделав комнату и все предметы графеном или другим поглощающим свет материалом, мы получим почти равномерную тень, с малыми отклонениями, в зависимости от поднятия/опускания ладони. Тут как раз возникнет пропорциональное увеличение пропускаемого света рукой, в зависимости от расстояния руки до лампочки и интенсивности света.

100% отражения, равно как и 100% прозрачности не существует, всё равно остаются малые величины которые мы игнорируем :P

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


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 25, 2016, 11:05
А вот тут мы подходим к двум вещам:
1) прозрачность
Часть излучения проходит сквозь предметы.
Ну не совсем, ведь сквозь руку мы ничего видеть не можем. А вот небольшое кол-во света "organic" материалы действительно пропускают. Ну чтобы не терзаться или не отвлекаться можно взять вместо руки напр карандаш или др предмет - они уж точно ничего не пропустят.

2) отражение
Часть излучения отражается
...
Отраженный от стен и других предметов свет попадает под руку и освещает пространство.
...
"Пере-излученный" более точно/уместно, "отражение" может пониматься как "зеркало". Теперь о штанах - допустим Вы облепили всю комнату (стены, пол и потолок) штанами. Что изменится в примере с тенью? Да ничего, выходит штаны действительно пере-излучают, и этот эффект отнюдь не микроскопический, а прекрасно виден невооруженным глазом. Без него тени в комнате были бы идеально черными, примерно так бывает если ночью стоите на пустыре под фонарем.

Однако вернемся к вопросу: если цвет точки одинаков с любой точки зрения/камеры - то значит и пере-излучается во все стороны равномерно? Или как?


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 25, 2016, 12:39
1) отражение != переизлучению. Пере - значит излучение должно быть поглощено и затем излучено. А у нас происходит поглощение и отражение. И вот дальше уже поглощение приведёт к проведение реакции и излучению другого излучения.

2) ммм... штаны отражают свет, что вам неясного? Так же как стены и любой объект который мы видим.

Вы путаете два понятия - излучение и отражение.

Излучение - когда излучает что то само по себе.
Отражение - когда объект отражает излучение другого объекта.

В случае с штанами, они отражают. Уберите источник света и в комнате будет тьма египетская, т.к. штаны излучать свет не могут. Максимум они несколько секунд после отключения источника света будут излучать тепловую энергию, и то если лампочка накаливания.
Пример с фонарём плохой. Тень от фонаря не идеально чёрная. Это уже наши глаза наводят контрастность, а на деле происходит всё то же отражение и освещение всего вокруг :P Легко проверяется - отойдите от фонаря и вы увидите всё вокруг, как только ваши глаза увеличат чувствительность. В круге света они просто "забиваются"  :D

3) Прозрачность - свет проходит сквозь руку :) поставьте на руку фонарик с фокусированным лучом и вы сможете рассмотреть всё в пределах 10-15 см с обратной стороны. Плохо проходит, но проходит. А к примеру свет от ядерного взрыва пройдёт насквозь :P


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Март 25, 2016, 12:48
Верес вы опять чушь несёте..

Отражённый свет - это всегда переизлученный свет. Фотон сначала поглощается, а затем излучается. При этом, в зависимости от материала, переизлученный фотон может изменить как свою поляризацию, так и длину волны.  


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 25, 2016, 13:12
Ага, но при этом это уже не то излучение...

m_ax вы смотрите узко. Если излучение входящее и исходящее будет одинаковым, то это будет пере-излучение.  Т.е. излучение не меняется, оно лишь переизлучается.

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

Хотя можно понять и вашу точку зрения - с точки зрения физики можно любое излучение приравнять к любому излучению, по сути это одно явление :P

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

Я же разделяю на фазы, фаза излучение, отражения, поглощения. Простейшие воздействия, из которых строятся уже дальнейшие взаимодействия.

PS любое излучение можно разбить на частицы, деление на "свет"/"тепло"/"радиацию" чисто человеческое, чтобы не путать. Разница восприятия в интенсивности и воздействии на наши органы чувств :P  


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 25, 2016, 14:28
Именно так это работает.
...
Вы ещё реликтовое излучение приплетите :D
..
Вы путаете два понятия..
...
m_ax вы смотрите узко..
Ну вот почему, ни хрена не зная, Вы беретесь утверждать, причем довольно категорично, да при этом еще грубить интеллигентным людям? :)  Вас заинтересовала тема, хотите поговорить - на здоровье, но борзеть-то зачем? Что за плебейские замашки лезть нахрапом?

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

Можно поставить задачу и более конкретно: есть нормаль к поверхности N. Сгенерить случайный вектор V который соответствует диффузному излучению.


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Март 25, 2016, 16:13
Никому не грублю, никого не оскорбляю, привожу доводы для беседы. Если это вы называете грубостью - печаль...

update: Кстати понял одну вещь (мб и другие поймут). Темноты не существует. Есть планка минимального излучения, при котором мы может видеть, и не более того. Т.е. незначительное излучение наши глазки не учитывают.
То есть все споры Igors о "пренебрежении" - это глюк. Т.к. он рассматривает темноту как отсутствие излучения, а на деле это просто участки с светом ниже определённого уровня.

И как бы он не мучался, в любой точке пространства будет излучение, точнее фотоны и прочая, которые мы даже рассчитать не сможет и за 10 лет, а уловить и подавно.

PS т.е. все его рассуждения о расчётах всего излучения - бред. Потому и надо установить планки, крайние значения излучения и степень упрощения его модели. И только после этого уже можно будет задавать и отвечать на вопросы в рамках модели :P


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 03, 2016, 08:43
16) Кривое зеркало искажает (см мультфильм "Ну погоди"). Хорошо, пусть поверхность зеркала идеально прямая - такое зеркало все равно искажает или нет?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 03, 2016, 11:09
Конечно - меняет правое на левое и наоборот) 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 03, 2016, 12:10
Конечно - меняет правое на левое и наоборот) 
Это подход "с фундаментальных позиций"?  :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 03, 2016, 12:53
Цитировать
Это подход "с фундаментальных позиций"?   :)
Ну если хотите) Я бы сказал, если рассматривать операцию отражения с точки зрения теории групп, то оно (это действие) не переводит любой элемент группы в сам себя)
Хотя ещё не понятно, что Вы понимаете под искажениями?)    


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 04, 2016, 08:44
[Хотя ещё не понятно, что Вы понимаете под искажениями?)    
То что видели Волк и Заяц в комнате смеха


Название: Re: Геометрия (задачки)
Отправлено: Bepec от Ноябрь 04, 2016, 16:11
Та она на второй странице скатилась в "Если бы бабка была дедкой, у бабки был бы ***" :D


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 04, 2016, 17:10
Та она на второй странице скатилась в "Если бы бабка была дедкой, у бабки был бы ***" :D
Та может и хорошо если б была - по крайней мере Вас бы не было  :)

Вообще я сомневался стоит ли постить такую задачку - ну ответ ведь совершенно очевиден. К тому же "почему" звучало на этом форуме раз 5 точно. Вообще современный человек может что-то решить просто своей головой - или только черпать из гуглы?  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 26, 2016, 12:32
17) В разных исходниках разных авторов встречается по существу один и тот же прием (аттач). В чем его смысл? Что это за "финт ушами"


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 26, 2016, 14:52
Цитировать
В чем его смысл?
Это просто переход к другому базису, где ось z меняет направление на противоположное. 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 26, 2016, 15:31
Это просто переход к другому базису, где ось z меняет направление на противоположное. 
И что должен думать человек который "с этим не работал"? Примерно так
Цитировать
Шо, блин, за "базис" ??? QTransform знаю, там никаких базисов нет. И как это ось "меняет напр-е" ??? И почему множит и слева и справа на одно и то же? Объяснил называется - ни хрена не понятно
:)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 26, 2016, 17:43
Имеется в виду, я так понимаю, базовая координатная система робота.
А "флипают" ось z, чтобы перейти от базиса робота к базису тула (ну т.к. он обычно висит вертикально и z для него направлен вниз, а не вверх).
Но само вычисление мне тоже не понятно, честно говоря. Матричная магия?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 26, 2016, 18:19
Цитировать
Но само вычисление мне тоже не понятно, честно говоря. Матричная магия?
Да какая магия?) Как матрицы (тензоры) преобразуются при вращениях системы координат:


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 27, 2016, 07:06
Да какая магия?) Как матрицы (тензоры) преобразуются при вращениях системы координат:
И сразу "тензором" по ушам, а потом еще цитаткой, где хз кто такой O(tr), с понтом все это должны знать. Пояснить что такое "базис" - не дождетесь! Ладно, попробую я как умею

Все знают что есть "мировая" система координат (МСК) в которой меряются все остальные, ее матрица всегда единичная (identity). Однако нет никаких правил как (или куда) должны быть направлены оси и должна ли быть тройка осей правой или левой. Наиболее популярна СК как в OpenGL

- ось X слева направо
- ось Y снизу вверх
- ось Z "на нас"

Однако есть и другие. Напр в продуктах AutoDesk ось Z торчит вверх. А в QPainter ось Y идет вниз (вот он, другой "базис").

Пример: в QPainter мы знаем/имеем матрицу(ы) которые делают то что надо. А теперь все то же самое надо рисовать в OpenGL. Как же приспособить имеющиеся матрицы? Вычислять их заново не хотелось бы, это может оказаться трудоемким. Тут начинается.. Первым делом пробуется та матрица что есть ("а вдруг пройдет") - но увы, не работает. Ну и дальше (обычно долгие) попытки чего-то домножить. Ваши действия?

Но само вычисление мне тоже не понятно, честно говоря. Матричная магия?
Сбивает с толку что слева и справа одно и то же. В действительности это прямая и обратная матрицы - просто здесь они равны. Дальше см выше теорию в изложении m_ax   :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 27, 2016, 10:03
Я своим студентам по интересней задачки даю (из векторного и тензорного анализа))  :)
 


Название: Re: Геометрия (задачки)
Отправлено: kambala от Декабрь 27, 2016, 13:51
Цитировать
где хз кто такой O(tr), с понтом все это должны знать
матричных операций не тонна, скорее всего это транспонирование. если человек годами работает с трехмерной графикой, он наверняка должен знать основы математики матриц.
Цитировать
Все знают что есть "мировая" система координат
видимо, это знаю только те, кто работает с трехмерной графикой, поэтому
Цитировать
с понтом все это должны знать
:)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 27, 2016, 23:51
Цитировать
видимо, это знаю только те, кто работает с трехмерной графикой
Я вот, например, впервые слышу, что есть какая то особенная "мировая" система координат :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 28, 2016, 05:44
матричных операций не тонна, скорее всего это ...
А разве хорошо что читающий должен делать предположения о том что такое tr, а также T "с крышкой" и T-штрих. Почему термины не описаны до их использования? (на худой конец после)

Я вот, например, впервые слышу, что есть какая то особенная "мировая" система координат :)
Ну если она "одна для всех" - то скажите как/куда направлены ее оси? :) Разные приложения имеют разные "миры" которые не совпадают, в чем легко убедиться открыв ихние UI. Когда точки (координаты) импортируются из одного приложения в другое это необходимо учитывать. Обычно это очень просто, напр point.z = -point.z. Но не всегда дело на этом и кончается - часто необходимо "принять" матрицу из др приложения. А иногда и углы поворота (углы Эйлера) - они тоже получаются разными.

Я своим студентам по интересней задачки даю (из векторного и тензорного анализа))  :)
Интересно, но будьте добры определить все термины до их использования (в крайнем случае укажите букварь). А то если привлекать "специфику" задачек можно запостить море :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 28, 2016, 08:29
Цитировать
Ну если она "одна для всех" - то скажите как/куда направлены ее оси?
Нет, это Вы говорите) Я, напротив, говорю, что для меня нет какой то одной предпочтительной особенной системы координат) Все законы природы инвариантны относительно их выбора) Всё относительно)

Цитировать
Разные приложения имеют разные "миры" которые не совпадают, в чем легко убедиться открыв ихние UI. Когда точки (координаты) импортируются из одного приложения в другое это необходимо учитывать. Обычно это очень просто, напр point.z = -point.z. Но не всегда дело на этом и кончается - часто необходимо "принять" матрицу из др приложения. А иногда и углы поворота (углы Эйлера) - они тоже получаются разными.
Это я понимаю...

Цитировать
Интересно, но будьте добры определить все термины до их использования
А что там непонятного? n_i - компоненты единичного вектора, направление которого в пространстве случайно. Нужно усреднить приведённые выражения (черта над выражением) по всем его возможным направлениям, пользуясь лишь свойствами ортогонального преобразования и симметрийными соображениями. :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Декабрь 28, 2016, 09:31
А как же дать описание минус однёрки в степени и оператора присваивания?  :D


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 28, 2016, 12:50
А что там непонятного? n_i - компоненты единичного вектора, направление которого в пространстве случайно. Нужно усреднить приведённые выражения (черта над выражением) по всем его возможным направлениям, пользуясь лишь свойствами ортогонального преобразования и симметрийными соображениями. :)

Ну вот вся эта криптография понятна будет только специалистам в данной области, а тут таких не думаю, что много...
Но это с любой областью так, ваша - не исключение :)
Меня вот что всегда интересовало - а какая область применения данного решения? Ну вот усреднил человек произвольный вектор... но что с ним дальше то делать? Для чего "это" хорошо?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 28, 2016, 13:06
Цитировать
Меня вот что всегда интересовало - а какая область применения данного решения?
Ну вы бы ещё спросили область применения математики, чуть выходящей за рамки средней школы)

На самом деле частенько в прикладных вычислениях приходится усреднять выражения подобного рода..
Я могу, конечно, привести конкретные примеры, но нужно ли это? Просто поверьте мне на слово  :)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 28, 2016, 14:49
Математика ради математики - не нужна никому, кроме математиков.
Точно так же и медицина без пациентов, и программирование без применения.
Просто есть вещи, которые реально применяются в жизни, а есть такие, которые создаются ради диссертаций и званий (а по сути - пшик).
Вот я и хотел узнать - а что, собственно, даст людям знание о том, как усреднить абстрактный вектор? :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 28, 2016, 15:44
Цитировать
Математика ради математики - не нужна никому, кроме математиков.
Да неужели? А ничего что все науки используют язык математики? Более того, многие разделы  математики предвосхитили своё время, и только позже нашли своё применение, например в физике? Самый простой пример - комплексные числа. Вам, наверное, они и нафиг не сдались бы.. Но зачем же делать такие необдуманные заявления:
Цитировать
Математика ради математики - не нужна никому, кроме математиков.
Другой пример - грассмановы числа.. Народ только после понял, как они оказались удобны для описания природы. Кстати, постоянно ими пользуюсь)

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

Цитировать
Вот я и хотел узнать - а что, собственно, даст людям знание о том, как усреднить абстрактный вектор?

Им это даст возможность посчитать какую-либо физическую величину и потом, возможно, сравнить её с экспериментом. Сделать вывод на сколько теория соответствует действительности.. Потом другой используя его результаты создаст транзистор, а третий создаст компьютер, планшет, сенсорные экраны, квантовые компьютеры и т.д.. Это я утрирую, конечно, но мысль, надеюсь, донёс)   
 


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 28, 2016, 17:28
А ничего что все науки используют язык математики?

Ну, я бы столь широко не обобщал :) Иначе так же можно сказать и про лингвистику, например - все научные труды написаны на каком-либо языке, значит, лингвистика еще более фундаментальна)

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

Вашими словами Вы как раз подтверждаете мои :) Если бы не область использования - не было бы и математики как науки.

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

Общим нельзя подменить частное.
Математика, как и любая другая отрасль науки, имеет свои специализации. Как врач-стоматолог, зная основы общей медицины, лучше всего владеет умением, как лечить зубы, так и для любого инженера или ученого достаточно иметь элементарные математические знания (да, привет, школо). А дальше вопрос того, в чем человек углубляется. Даже тот же грассманиан, думаю, знают и используют далеко не все математики.

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

Цитировать
Вот я и хотел узнать - а что, собственно, даст людям знание о том, как усреднить абстрактный вектор?

Им это даст возможность посчитать какую-либо физическую величину и потом, возможно, сравнить её с экспериментом. Сделать вывод на сколько теория соответствует действительности..   
[/quote]

Это да, но опять же, Вы приводите достаточно узкоспециализированные примеры. То есть, чтобы понять, очем в примере шла речь, человек должен быть как минимум выпускником физтеха...


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 29, 2016, 07:34
Цитировать
Все знают что есть "мировая" система координат
видимо, это знаю только те, кто работает с трехмерной графикой
Я вот, например, впервые слышу, что есть какая то особенная "мировая" система координат :)
Конечно есть. В любой задаче СК множество (ну как минимум всякий объект имеет свою СК) - но эти СК локальны и отсчитываются относительно мировой (или относительно родительской - все равно в конце-концов сводится к миру). Напр мы создали такую СК
Цитировать
1  0    0
0  0.5 -0.866
0  0.866 0.5
Это объект повернутый на 30 градусов вокруг мировой оси X, т.е. MCК - это то в чем все выражается. Невозможно установить другую МСК чем identity, а локальные СК можно менять как угодно.

Еще пример. В QPainter мы поставили (0, 0) в центр экрана, направили Y вверх и чего-то рисуем. Но это совсем не значит что мы "изменили мир" - мы просто создали локальную СК и пользуемся. Пока мы в ней остаемся - разницы никакой. Но мы не можем просто так использовать местные матрицы для рисования в др системе (с тем же Y вверх)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 29, 2016, 07:44
Ну вот вся эта криптография понятна будет только специалистам в данной области, а тут таких не думаю, что много...
Но это с любой областью так, ваша - не исключение :)
Меня вот что всегда интересовало - а какая область применения данного решения? Ну вот усреднил человек произвольный вектор... но что с ним дальше то делать? Для чего "это" хорошо?
Вот прямо сейчас пишу новогодний шейдер - и, поверьте, имею серию проблем с... единичным вектором! Конечно не таких точно, но в том же плане.

В Вашей критике есть доля справедливости, заметен некоторый "отрыв от практики". Но увлечение "чистым программированием" (увы, столь популярное здесь) - гораздо большее зло.

А к задачкам m_ax мы обязательно вернемся - и скоро  :)


Название: Re: Геометрия (задачки)
Отправлено: Old от Декабрь 29, 2016, 09:41
Просто есть вещи, которые реально применяются в жизни, а есть такие, которые создаются ради диссертаций и званий (а по сути - пшик).
Ну почему пшик. Перед тем как обывателю стали доступны формулы аффинных преобразований, их какой-то математик сел и исследовал, возможно ради диссертации. :)
Это сейчас любой "гений" может взять готовые формулы и крутить свои чайники как угодно...
Точно также со всем остальным. Обыватель создает простой виджет и даже не представляет, какой стек технологий при этом задействован, а весь этот стек так или иначе описывается математикой.

Вот для того, что бы у нас появлялись не только обыватели (которые берут готовые технологии и используют), а еще и те, кто эти технологии смогут придумать, описать математически и в конечном счете реализовать, m_ax задает такие задачи своим студентам. Дай Бог одному студенту из потока это поможет, что-то решить - уже хорошо. :)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 29, 2016, 12:13
Ну почему пшик. Перед тем как обывателю стали доступны формулы аффинных преобразований, их какой-то математик сел и исследовал, возможно ради диссертации. :)

Тут ведь какая штука частенько получается) Сидят в шаражках Деды-С-Именами-Трижды-Академики, придумывают новую теорию, пыхтят, гранты проедают, их ассистенты защищаются толпами на базе новоявлянного аппарата... Так длится не год не два, а 10-20-30 лет... Потом Дедами становятся те, кто на базе этой теории стал ТриждыДоктором, и вот выясняется, что теория то была ложной... Дальше пишутся диссертации на тему разоблачения супертеории, ассистенты защищаются толпами... теория низложена... гранты проедены... премии получены... статьи и монографии написаны... а в итоге все равно - ПШИК. Имеем 0 результат и кучу "ученых людей" :)

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

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

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


Название: Re: Геометрия (задачки)
Отправлено: Old от Декабрь 29, 2016, 12:21
а в итоге все равно - ПШИК. Имеем 0 результат и кучу "ученых людей" :)
Вы исследовательской работой когда нибудь занимались? :)
Отрицательный результат это тоже результат. Нельзя пойти по дорожке, по которой никто не ходил, и гарантировать что в конце пути придем в прекрасное место. Можно не дойти или прийти в болото... :)


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


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 29, 2016, 12:31
а в итоге все равно - ПШИК. Имеем 0 результат и кучу "ученых людей" :)
Вы исследовательской работой когда нибудь занимались? :)
Отрицательный результат это тоже результат. Нельзя пойти по дорожке, по которой никто не ходил, и гарантировать что в конце пути придем в прекрасное место. Можно не дойти или прийти в болото... :)

Приходилось заниматься :) Правда, больше в алгоритмической области.
Нет, я не спорю насчет отрицательного результата - его тоже надо получить :)
Я немного о другом - когда "бегут впереди паровоза", пытаясь выстроить ничем не подкрепленные теории на пустом месте. А потом оказывается, что паровоз-то ушел... Ну знаете, такая "лысенковщина" от науки, квадратно-гнездовые методы в вакууме. Долгое время культ в почете, пока не найдется сил развенчать. А результата ноль и ресурсы проедены.

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

Просто во первых, это не всегда нужно, а во вторых, не всегда возможно :)



Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 29, 2016, 15:23
Тут ведь какая штука частенько получается) Сидят в шаражках Деды-С-Именами-Трижды-Академики, придумывают новую теорию, пыхтят, гранты проедают, их ассистенты защищаются толпами на базе новоявлянного аппарата... Так длится не год не два, а 10-20-30 лет... Потом Дедами становятся те, кто на базе этой теории стал ТриждыДоктором, и вот выясняется...
Да, красочную нарисовали картину :) Но позвольте напомнить исходный пост этой задачки
17) В разных исходниках разных авторов встречается по существу один и тот же прием (аттач). В чем его смысл? Что это за "финт ушами"
Как видите, мой интерес чисто практический, утилитарный. Мне нужно понять что делает это место в исходниках. Никаких диссеров я писать не собирался. Что такое "тензорный анализ" - без понятия. Никаких грантов не получал - ну и соответственно не проедал :)  Поэтому утверждение что это, мол, далеко-заоблачная теория совершенно безосновательно.

Правильный, на мой взгляд, ответ примерно
Цитировать
Это перевод матрицы из одной системы координат в другую, в данном случае с инверсным Z
"Проблема" в том этот ответ (как и ответ m_ax) не дает каких-то "немедленных выгод". Запоминать эту фразу довольно бесполезно. Его нужно осмыслить, напр представить себе как модели крутятся в той или иной ситуации. Многим это не нравится ("а почему не понятно немедленно?" - тлетворное влияние букваря), Вот и почва для рождения легенд типа "нашел в инете готовые формулы и теперь издевается, гад" :) Поверьте, никаких других формул (кроме перемножения матриц) здесь нет


Название: Re: Геометрия (задачки)
Отправлено: Old от Декабрь 29, 2016, 16:11
Поверьте, никаких других формул (кроме перемножения матриц) здесь нет
Да, да. Матрицы и операции над ними исследовал математик(и), и выложил "технологию" их использования для обывателя. :)
Он не думал, насколько это "оторвано от практики" и вообще не представлял всех практических применений использования матриц.


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 30, 2016, 00:42
Просто есть вещи, которые реально применяются в жизни, а есть такие, которые создаются ради диссертаций и званий (а по сути - пшик).
Вот для того, что бы у нас появлялись не только обыватели (которые берут готовые технологии и используют), а еще и те, кто эти технологии смогут придумать, описать математически и в конечном счете реализовать, m_ax задает такие задачи своим студентам. Дай Бог одному студенту из потока это поможет, что-то решить - уже хорошо. :)
Вот, прямо как с уст сняли) Сенйчас как раз зачётная сессия идёт у студентов - у меня прям волосы на голове шевелятся (и, наверное, не только на голове: "ну да, есть там симпатичные студентки") от того потока сознания, что мне в эти дни довелось услышать.. А всё почему? Правильно, всем этим студентам, совершенно не интересно от куда берутся эти самые формулы.. Т.е. у них на столько инерционное мышление, что они даже не задумываются почему так, как так получается: они привыкли всё под формулы подставлять (со школьной скамьи), а из каких соображений они получаются - тот мостик в понимании - полностью нивелирован( Конечно, не все такие, но.. большинство..(

И вот, товарищ Racheengel совершенно не сведущий в этой области делает такие громогласные заявления.. О лженауке и т.д. и т.п.  Так вот, научный метод в корне отличается от лженауки.. Лженаука - это как данность - она всегда была, есть и будет, но.. Но она в этом смысле всегда импотента. Ничто ещё на её основе не создано реального, того, к чему бы мы  могли бы прикоснуться.. Реальная наука всегда беспощадно критична, она всегда подвергает сомнению новые теории и т.д. И все кто не выжил в этой борьбе, те, кто не прошёл проверку экспериментам - просто отмирают - это неизбежно. У реальной науки и научного метода всегда есть некий люфт. Мы не говорим, что то что мы знаем сейчас - есть истина в последней инстанции - но это лучшее что мы имеем на сегодняшней день для понимания этого мира.

P.S.
Завтра допишу)
 




Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 30, 2016, 02:22
как с уст сняли) Сенйчас как раз зачётная сессия идёт у студентов - у меня прям волосы на голове шевелятся (и, наверное, не только на голове: "ну да, есть там симпатичные студентки") от того потока сознания, что мне в эти дни довелось услышать.. А всё почему? Правильно, всем этим студентам, совершенно не интересно от куда берутся эти самые формулы.. Т.е. у них на столько инерционное мышление, что они даже не задумываются почему так, как так получается: они привыкли всё под формулы подставлять (со школьной скамьи), а из каких соображений они получаются - тот мостик в понимании - полностью нивелирован( Конечно, не все такие, но.. большинство..(

Знакомая проблема, очень знакомая... А знаете, в чем дело? Как ни банально, но виновата система образования. Ведь как учат этих людей в школах да институтах? Выходит препод к доске и начинает чертить формулы, не объясняя сути. И так весь семестр. А потом зачет или экзамен, где со студентов требуют тупо те же формулы в расчетах. Что делает студент? Правильно, списал, сдал и забыл. Но его в этом нельзя обвинять по большому счету - ведь он понятия не имеет, КАК использовать все то, что ему нагружали несколько месяцев. Потому что нет этого в программе. Формулы, цифры, статистика... А за деревьями не видно леса. Вот как объяснить студенту суть дифура или производной? Нарисовать формулу? так толка не будет.

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

И вот, товарищ Racheengel совершенно не сведущий в этой области делает такие громогласные заявления.. О лженауке и т.д. и т.п.  Так вот, научный метод в корне отличается от лженауки..

m_ax, это как бы не в ваш огород камень, насчет лженауки. Просто вот есть вещи, которые любому (практически) человеку дано "пощупать", ну там синусы-косинусы (не верим в формулу sin x+ cos x = 1? взял калькулятор, посчитал), ну или простой какой-нить код на жабе-с-питоне (написал-запустил-оно работает-ура). Пальцы в розетку сунул - 220 ощутил - больше не сунет :) Ну и так далее. То есть вещи, достаточно простые для понимания, даже не специалисту. Как бы сомневаешься - проверил - поверил. Но что делать с абстракциями, которые есть сами по себе порождения абстрактных идей? Как проверить, так ли это на самом деле? Или нас водят за нос, выдавая кизяк за зеленый горошек? Эксперименты? Ну а как подтвердить или опровергнуть то, чего в принципе в природе не существует, кроме как на листе бумаги, записанное какими-то странными символами? Я не знаю, допустим. А ведь для многих это - почва хлебная, манна с небес. Переливают из пустого в порожнее, там грантик, там стипендия, там конференция, там еще что-то... Это наука? Не знаю... не уверен, честно говоря...


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 30, 2016, 07:24
Лучше бы преподы не формулами людей давили, а рассказывали, хотя бы поверхностно, какое отображение в реальность имеет то или иное понятие. Это было бы намного ценнее, чем расписывать телеги на полторы доски и потом заставлять это все учить и сдавать.
Хмм... не думаю. Во всяком случае в мое время некоторые преподы пытались так делать, но без особого успеха. Да, если его внимательно слушать - действительно интересно и польза большая. Но.. стоит на пару минут отвлечься, "потерять нить" - и все, хана, включиться снова невозможно. В итоге о чем лекция - хз, а конспекта практически нет. Поэтому какой-то (значительный, весомый) элемент "зубрежки" неизбежен, это нормально. И заставлять учить и сдавать тоже надо, иначе ни хрена делать не будут


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 30, 2016, 13:08
Хмм... не думаю. Во всяком случае в мое время некоторые преподы пытались так делать, но без особого успеха. Да, если его внимательно слушать - действительно интересно и польза большая. Но.. стоит на пару минут отвлечься, "потерять нить" - и все, хана, включиться снова невозможно. В итоге о чем лекция - хз, а конспекта практически нет. Поэтому какой-то (значительный, весомый) элемент "зубрежки" неизбежен, это нормально. И заставлять учить и сдавать тоже надо, иначе ни хрена делать не будут

Мне кажется, кому материал понадобится - тот и формулу найдет при необходимости, и смысл ее поймет.
А кому нет - ну, лучше уж пусть СУТЬ в голове останется, чем формулы забудутся через неделю после зачета.
А так возьмут в dX/dt сократят d, останется X/t = ?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 31, 2016, 07:38
Так вот, научный метод в корне отличается от лженауки.. Лженаука - это как данность - она всегда была, есть и будет, но.. Но она в этом смысле всегда импотента. Ничто ещё на её основе не создано реального, того, к чему бы мы  могли бы прикоснуться..
Видимо предновогодние заботы отвлекли научного работника :) Моя работа - чистой воды лженаука (что можно сказать и о всей CG), Которая однако непрерывно создает реальное (ну по крайней мере видимое). Вот пошленький новогодний шейдер (http://www.4shared.com/video/7sMeTz0Ice/Gro2.html) о котором я упоминал.
Цитировать
Нее, ну "это не ко мне". Это надо знать физику твердого тела, микрокристаллическую структуру льда и еще много чего - а я программист. Каждый должен заниматься своим делом и.т.д.
Подобное буквальное следование real-life практически всегда обречено. Фундаментальная наука здесь бесполезна - она не занимается вопросами визуализации типа "а как это должно блестеть чтобы юзверю было приятно". Да, это подделка не имеющая ничего общего с физикой.

18) как сделан этот эффект? (ну конечно "в принципе", вдаваться в технические детали необязательно)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 31, 2016, 14:24
Цитировать
Видимо предновогодние заботы отвлекли научного работника
Аха, если зачётная сессия это предновогодние заботы, то да)

Цитировать
Моя работа - чистой воды лженаука (что можно сказать и о всей CG),

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

Цитировать
Подобное буквальное следование real-life практически всегда обречено. Фундаментальная наука здесь бесполезна - она не занимается вопросами визуализации типа "а как это должно блестеть чтобы юзверю было приятно". Да, это подделка не имеющая ничего общего с физикой.
 
Ну и вчём тогда претензия к фундаментальной науки? Замечу, что без неё не было бы у Вас сейчас возможности создавать, рисовать и симулировать и играться с шейдерами..

Цитировать
m_ax, это как бы не в ваш огород камень, насчет лженауки. Просто вот есть вещи, которые любому (практически) человеку дано "пощупать", ну там синусы-косинусы (не верим в формулу sin^2 x+ cos^2 x = 1? взял калькулятор, посчитал), ну или простой какой-нить код на жабе-с-питоне (написал-запустил-оно работает-ура). Пальцы в розетку сунул - 220 ощутил - больше не сунет Улыбающийся Ну и так далее. То есть вещи, достаточно простые для понимания, даже не специалисту. Как бы сомневаешься - проверил - поверил. Но что делать с абстракциями, которые есть сами по себе порождения абстрактных идей? Как проверить, так ли это на самом деле? Или нас водят за нос, выдавая кизяк за зеленый горошек? Эксперименты? Ну а как подтвердить или опровергнуть то, чего в принципе в природе не существует, кроме как на листе бумаги, записанное какими-то странными символами? Я не знаю, допустим. А ведь для многих это - почва хлебная, манна с небес. Переливают из пустого в порожнее, там грантик, там стипендия, там конференция, там еще что-то... Это наука? Не знаю... не уверен, честно говоря...
 
Да, только вот понимаете в чём дело: далеко не всё мы можем представить исходя из нашего бытового опыта, я уж не говорю о пощупать.. Взять, например, квантовую механику или ОТО.. Ну нельзя их на пальцах в рамках наших бытовых представлений объяснить.. Помню, Фейнман как то сказал по поводу квантовой механики (не дословно): все наши попытки создать и объяснить квантовую механику исходя из здравого смысла - неизбежно оказывались тчетными, и только когда мы отказывались от здравого смысла (наш бытовой опыт) и подходили к проблеме чисто аксиоматически - всё замечательно работало..
Отмечу, что квантовая мех. - это фактически основа всех современных технологий, начиная от транзистора, заканчивая квантовыми компьютерами..
Так что не всё так так просто - не нужно смотреть на мир биполярно - между чёрным и белым ещё куча оттенков серого (и не 50, а больше :)) ).


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Декабрь 31, 2016, 14:25
Да, ну и с наступающим всех :)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Декабрь 31, 2016, 19:08
Да, ну и с наступающим всех :)

С наступающим :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 02, 2017, 08:27
Ну и вчём тогда претензия к фундаментальной науки? Замечу, что без неё не было бы у Вас сейчас возможности создавать, рисовать и симулировать и играться с шейдерами..
О претензиях речь не идет. Просто есть "стык" между теорией и практикой. Есть масса задач где требуются познания в математике, физике (ну в геометрии в первую очередь) - но никакого отношения к фундаментальной науке они не имеют. Напр симуляция, визуализация и др - это громадные прикладные области, и то что они не развивают науку меня нисколько не смущает.

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

Ваша позиция (типовая для научного работника) немногим лучше. Мол, "наука - все". А то чем я занимаюсь - никакая не наука, стало быть, Вы тут тоже ни при чем. Кто же будет писать шейдеры и др?  :)


Название: Re: Геометрия (задачки)
Отправлено: Old от Январь 02, 2017, 12:02
Напр симуляция, визуализация и др - это громадные прикладные области, и то что они не развивают науку меня нисколько не смущает.
Конечно не развивают, они и не могут развить науку, т.к. все происходит наоборот: наука развивает прикладные области. Всегда. :)

И тут начинается... Программист прямо-таки "отбрыкивается", как будто его хотят (грязно) использовать для каких-то формул, а откуда он их может знать? Безобидное слово "матрица" часто имеет эффект красной тряпки для быка. Вот изучать всякие либы, опции командной строки и.т.п. - вот это да, это программирование, а остальное нет.
Это средние программисты отбрыкиваются от формул, как и от всего остального нового для него. Остальные программисты понимают, что без формул и математики они далеко не уедут. :)

Ваша позиция (типовая для научного работника) немногим лучше. Мол, "наука - все". А то чем я занимаюсь - никакая не наука, стало быть, Вы тут тоже ни при чем. Кто же будет писать шейдеры и др?  :)
Да кому это интересно, тот и будет их писать. Тоже мне проблема новая модная - шейдеры. :)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Январь 02, 2017, 18:00
Это средние программисты отбрыкиваются от формул, как и от всего остального нового для него. Остальные программисты понимают, что без формул и математики они далеко не уедут.

Я думаю, тут дело не в "среднести" программистов, а в различии профессионального мышления между технарями, математиками и гуманитариями :)
Формула - это не алгоритм, "результат" ее работы не очевиден, в отличии от кода.
Код можно дебагером пробежать и понять принцип работы и проблемы. А формулу как дебагать? А если там ошибка, как "программисту-не математику" выявить ее наличие или отсутствие?


Название: Re: Геометрия (задачки)
Отправлено: Old от Январь 03, 2017, 12:02
А если там ошибка, как "программисту-не математику" выявить ее наличие или отсутствие?
Никак. Выявлять ошибки в фундаментальных знаниях должна наука (тот самый математик), а не программист. Программист пользуется уже готовыми данными.
Вы же не ставите под сомнения формулы аффинных преобразований, вы просто берете их и используете. Но без фундаментальной науки они бы даже не появились. Именно наука тянет за собой прикладные области.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 03, 2017, 13:18
Я думаю, тут дело не в "среднести" программистов, а в различии профессионального мышления между технарями, математиками и гуманитариями :)
Формула - это не алгоритм, "результат" ее работы не очевиден, в отличии от кода.
Код можно дебагером пробежать и понять принцип работы и проблемы. А формулу как дебагать? А если там ошибка, как "программисту-не математику" выявить ее наличие или отсутствие?
Так Вы же сами говорили, мол, можно тупенько списывать/запоминать формулы, а можно понимать их суть/смысл. Напр формула, которую я применил в шейдере известна лет 30 и перепечатывалась тысячи раз. Хотя бы здесь (http://andmonahov.blogspot.com/2012/10/opengl-es-20.html) (см "бликовое освещение". Правда почему spread = 40 хз, по классике 200). Как правило, шейдеры не изобретают новых формул, а ре-интерпретируют имеющиеся, как бы меняют контекст их применения. Дебаг формул в большинстве случаев возможен, напр один из типовых приемов "вцепиться" в пиксель изображения и печататься пока не станет ясно почему он ведет себя не так как ожидалось.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 03, 2017, 15:14
Да, и вот что. Я конечно питаю глубокое уважение к фундаментальной науке, но явно зашкаливают утверждения типа "все (абсолютно все) проистекает из нее", и мы должны ей быть безмерно благодарны типа
Цитировать
Спасибо отцам квантовой механики за наше счастливое детство
Это явный перегиб. См аттач, вот схема той формулы что приводил выше (источник тот же). Ну посчитал косинус между отраженным лучом и взглядом, задрал в степень и... все. Это что, фундаментальная наука? Ну не знаю, не могу сказать категорически "нет", но как-то не очень верится. Гораздо более правдоподобным выглядит версия что это придумал просто хороший алгоритмист. Который не совал бестолковых интегралов, не наводил "тень на плетень" заумными выкладками и.т.д. И как-то миллионы(?) людей используют эту простейшую формулу - и особо плохо пока никому не стало. 


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 03, 2017, 15:43
Цитировать
но явно зашкаливают утверждения типа "все (абсолютно все) проистекает из нее", и мы должны ей быть безмерно благодарны типа
"Спасибо отцам квантовой механики за наше счастливое детство"
Ну Вы здесь передёргиваете.. Говорилось, что у фунд. науки и, например, тем чем занимаетесь Вы - разные цели и подходы - и не надо их смешивать.
Никто здесь не принижает прикладные области.


Название: Re: Геометрия (задачки)
Отправлено: Old от Январь 03, 2017, 15:49
Это что, фундаментальная наука? Ну не знаю, не могу сказать категорически "нет", но как-то не очень верится.
Конечно. Без фундаментальной науки не было бы  никаких косинусов и никаких степеней. Именно фундаментальная наука сделала их доступным для обывателя. :)

Гораздо более правдоподобным выглядит версия что это придумал просто хороший алгоритмист.  

А откуда этот хороший алгоритмист узнал законы отражения света? Или Френель с Ферма хорошие алгоритмисты? :)


Название: Re: Геометрия (задачки)
Отправлено: Alex Custov от Январь 04, 2017, 12:38
Да, и вот что. Я конечно питаю глубокое уважение к фундаментальной науке, но явно зашкаливают утверждения типа "все (абсолютно все) проистекает из нее", и мы должны ей быть безмерно благодарны типа
Цитировать
Спасибо отцам квантовой механики за наше счастливое детство
Это явный перегиб.

Почему? Я благодарен. Квантовые ямы, например, используются в DVD лазерах и мобильных телефонах. Так что я точно благодарен отцам квантовой механики :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 05, 2017, 11:29
Ладно, вернемся к задачкам m_ax (аттач). Для простоты рассматриваем человеческие вектора x, y, z (напр QVector3D). Условия понял так: "Направления равновероятны" - значит достаточно большой набор таких векторов из одной точки образует равномерный "ежик", без проплешин и сгущений. "Единичный" - значит нормированный, длина = 1

Задача 37. Хотя напр-я распределены равномерно, но сами компоненты (x, y, z) нет. Напр значения x близкие к 1(-1) будут выпадать гораздо реже чем близкие к нулю. Наверное по "нормальному" закону (других просто не знаю  :)). Но во всяком случае ф-ция распределения (pdf) симметрична относительно оси Y. Еще проще - какая бы хитрая pdf ни была, но "плюс" значения распределены так же как и "минус". А значит ответ "ноль" на все

Задача 38. Ну "точка" - наверное скалярное произведение (dot). Также пусть длины всех константных векторов = 1 чтобы эти множители не путались под ногами. Тогда

a) dot(a, n) ^ 2
Для среднего без разницы на что проецируется n, рез-т один для любого "а", в том числе и для осей координат. А значит это просто средняя длина любой компоненты. Для нормированного вектора
Цитировать
x * x + y * y + z * z = 1
т.к. x, y, z равноправны, то
x * x = y * y = z * z = 1/3
Ответ 1/3

b) dot(a, n) * dot(b, n)
Если a == b. то сводится к предыдущему случаю. Если a перпендикулярен b то ноль (как в задаче 37). А вот формулку не соображу. Ладно, как-то так (фонарь)
Ответ: max(dot(a, b), 0) / 3

c) dot(a, n) * n
Здесь просто раскрываем скобки
Ответ: a/3

d) (a x b) ^ 2
Ну "x" наверно векторное произведение, но это вектор, как он может быть в квадрате? Наверное имелась ввиду его длина. Это квадрат синуса, квадрат косинуса уже считали (1/3) поэтому
Ответ: 2/3

Это все. m_ax, даже если тут все неверно - повремените денек с "правельным ответом". Может товарищи тоже хотят высказаться  :)
 
 


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 05, 2017, 16:30
На самом деле, решение задачи 33  кроется в результате задачи 32*. Если мы знаем средние вида:
ninj,  ninjnk,    ninjnknl

то примеры из 33 решаются элементарно.  :)

Цитировать
Это все. m_ax, даже если тут все неверно - повремените денек с "правельным ответом". Может товарищи тоже хотят высказаться
Да, я завтра вечерком напишу как я обычно объясняю эти задачки)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 06, 2017, 18:01
Выкладываю решения. 
Старался расписать решение как можно более подробно (текст в pdf приатачен) Но если остались вопросы - спрашивайте)

 


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Январь 06, 2017, 21:24
Выкладываю решения. 
Старался расписать решение как можно более подробно (текст в pdf приатачен) Но если остались вопросы - спрашивайте)
ю
m_ax, простите меня, но Вы сделали именно то, против чего я выступал в предыдущих своих комментариях.
Вы приводите в качестве решения записи, которые в принципе могут быть понятны только узкому специалисту.
Я не уверен, что в данном сообществе таких много (были бы - наверное бы отписались уже).
Для остальных подобные решения выглядят, извините, как набор египетских иероглифов :)
Поэтому ответить на вопрос - а насколько верно подобное решение - тут никто не сможет.
Вот если бы Вы наглядно изобразили проблему и решение (картинку привели, например?) - то был бы другой разговор.
Это возможно?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 06, 2017, 21:54
Цитировать
Вот если бы Вы наглядно изобразили проблему и решение (картинку привели, например?) - то был бы другой разговор.
Это возможно?
Конечно возможно) Ведь эти результаты достаточно просто моделируются на компьютере) Так что мешает сравнить результаты численных методов с аналитическими?
Вот только, к сожалению, не все задачки так легко поддаются численному счёту, или информацию из них выудить оказывается крайне сложно..(
Но конкретно здесь, можно легко сравнить результаты) Welcome  :)
 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 08, 2017, 08:54
Мдааа....  :) Ну хоть ответы совпадают с моими (в упрощенной постановке). С первого раза - ну конечно ни хрена не понятно (бедные пацаны студенты). Но понимаю что надо иметь терпение, поразмыслить - хотя мало кто это будет делать. Обещаю что последние Ваши задачки попробую решить. Но сначала меня заинтересовало другое - Ваше упоминание об интеграле по телесному углу. Думаю это будет хороший пример как (казалось бы) абстрактные формулы могут выливаться в весьма конкретные/практические рез-ты

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

- есть пр-к произвольным образом повернутый в пр-ве, длины сторон известны
- есть точка (P) где надо посчитать свет

Требуется

a) простой вопрос - как вообще посчитать сколько света (число) доходит до точки P ? (здесь академическая подготовка не нужна, можно и догадаться)

b) сложный вопрос - как считать диффузу и спекуляр (о которых не раз говорилось выше)? Ведь "площадь" - совсем не точка, где взять вектор? Ну разумеется "центр пр-ка" не проходит, так вблизи источника будет темно



Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 08, 2017, 09:39
Для остальных подобные решения выглядят, извините, как набор египетских иероглифов :)
Поэтому ответить на вопрос - а насколько верно подобное решение - тут никто не сможет.
Вот если бы Вы наглядно изобразили проблему и решение (картинку привели, например?) - то был бы другой разговор.
Это возможно?
Ну я тоже не знаю как это выразить картинкой. Можно попробовать "разжевать" один из примеров, напр самый простой
Цитировать
dot(a, n) ^ 2
Для QVector3D его компоненты (x, y, z) - это ведь тоже "скалярные произведения" этого вектора c осями х (y, z). А поскольку "все напр-я равноправны", то вместо dot(a, n) мы можем спокойно рассматривать компоненту x (или y или z). Чему равно ее среднее? Нулю (плюс выпадает так же как и минус). А среднее квадрата? 1/3 из условий нормировки. Задачки действительно простые - но вот "приловчиться" к академическому стилю изложения - ой непросто  :'(


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 08, 2017, 16:00
Цитировать
Но сначала меня заинтересовало другое - Ваше упоминание об интеграле по телесному углу. Думаю это будет хороший пример как (казалось бы) абстрактные формулы могут выливаться в весьма конкретные/практические рез-ты
Кстатии, там опечатка в формуле для элемента телесного угла: синус там не в квадрате, а просто синус..
Вообще все конкретные серьёзные результаты всегда "выливаются" из абстрактных формул и теорий) Которые многие воспринимают не более чем забавные значки..( 

Цитировать
a) простой вопрос - как вообще посчитать сколько света (число) доходит до точки P ? (здесь академическая подготовка не нужна, можно и догадаться)
Самое наивное - предположить, что оно будет пропорционально той площади пр-а видимой нам из т. P. и обратно пропорционально квадрату расстояния от пр-к до т. P - т.е. как раз телесному углу, под которым мы видим пр-к. 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 09, 2017, 09:15
Самое наивное - предположить, что оно будет пропорционально той площади пр-а видимой нам из т. P. и обратно пропорционально квадрату расстояния от пр-к до т. P - т.е. как раз телесному углу, под которым мы видим пр-к. 
Видимая площадь / квадрат расстояния - это как раз приближенная оценка телесного угла (solid angle), которая неплохо работает когда P "достаточно далеко". Но увы, вблизи источника это не катит

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

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


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 10, 2017, 15:43
Как обещал, дорешаю задачки m_ax

a) Начнем с простого dot(a, n) * dot(b, n). Тупенько распишем скалярные произведения
Цитировать
(a.x * n.x + a.y * n.y + a.z * n.z) *
(b.x * n.x + b.y * n.y + b.z * n.z)
Всего слагаемых 9 но для среднего остаются только 3 которые имеют квадраты n.x (n.y, n.z)
Цитировать
a.x * b.x * n.x * n.x + a.y * b.y * n.y * n.y + a.z * b.z * n.z * n.z
и средние
a.x * b.x / 3 + a.y * b.y / 3 + a.z * b.z / 3
Ответ: dot(a, b) / 3

b) Накинем еще вектор dot(a, n) * dot(b, n) * dot(c, n)
А здесь мэртво ноль, и не волнует что а == b == c

c) Наконец 4 вектора dot(a, n) * dot(b, n) * dot(c, n) * dot(d, n)
Цитировать
(a.x * n.x + a.y * n.y + a.z * n.z) *
(b.x * n.x + b.y * n.y + b.z * n.z) *
(c.x * n.x + c.y * n.y + c.z * n.z) *
(d.x * n.x + d.y * n.y + d.z * n.z)
Здесь всего 81 слагаемое (9 * 9), но с ненулеыми средними 27. Формально "ответ готов", но расписать такую колбасу тяжело, поэтому все сводится к неисчерпаемой задаче алгебры "упростить выражение". Не уверен, но по-моему так
Цитировать
Ответ: (dot(a, b) * dot(c, d) + dot(a, c) * dot(b, d) + dot(a, d) * dot(b, c)) / 9


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 10, 2017, 16:03
Цитировать
Ответ: (dot(a, b) * dot(c, d) + dot(a, c) * dot(b, d) + dot(a, d) * dot(b, c)) / 9
Да, верно, только не на 9, а на 15 нужно делить.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 10, 2017, 16:12
Да, верно, только не на 9, а на 15 нужно делить.
Хммм... я подумаю почему


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 11, 2017, 16:34
Да, верно, только не на 9, а на 15 нужно делить.
В упор не вижу откуда 15. Ладно, зайдем с др стороны
Код
C++ (Qt)
#include <QtWidgets>
 
inline float RandF( void )
{
return float(qrand()) / RAND_MAX - 0.5f;
}
 
int main(int argc, char *argv[])
{
qsrand(0);
const int num = 1000 * 1024;
double sum[5] = { 0.0 };
for (int i = 0; i < num; ++i) {
QVector3D vec(RandF(), RandF(), RandF());
vec.normalize();
double x2 = vec.x() * vec.x();
double y2 = vec.y() * vec.y();
double z2 = vec.z() * vec.z();
sum[0] += x2;
sum[1] += x2 * x2;
sum[2] += x2 * y2;
sum[3] += x2 * z2;
}
for (int i = 0; i < 4; ++i)
qDebug() << (sum[i] / num) << "/" << (num / sum[i]);
 
return 0;
}
 
Печатает
Цитировать
0.333066 / 3.00241    // x2
0.180041 / 5.55429    // x2 * x2
0.0765195 / 13.0686  // x2 * y2
0.0765056 / 13.0709  // x2 * z2
Т.е. не 9 и не 15, а какое-то левое 13.07. Предполагаю потому что x, y, z зависимы (хотя и равноправны). Также среднее x2 * x2 совершенно другое, и простые соображения говорят что это верно. Тогда "один делитель на всех" неверно. Выходит методика не обобщается на 4 и более степеней? Или я где-то насвистел в тесте?


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 11, 2017, 17:45
Цитировать
Или я где-то насвистел в тесте?
Дело в тесте, точнее в
Код
C++ (Qt)
QVector3D vec(RandF(), RandF(), RandF());
vec.normalize();
 
Это не даёт честного равновероятного распределения по направлениям, поэтому и результаты плывут..
Должно быть, конечно:
1/3
1/5
1/15
1/15

Это легко проверить прямым счётом (интегрируя по телесному углу): см. аттач. Хотя можно посчитать для произвольной размерности и без всяких интегралов, исходя из свойств орт. преобразования и симметрии. 




Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 12, 2017, 09:32
Генерация случайного вектора в сферической СК - популярные грабли, она не дает равномерного распределения
Код
C++ (Qt)
QVector3D RandomVec( void )
{
float theta = float(qrand()) / RAND_MAX * M_PI;   // случайный "угол возвышения"
float phi = float(qrand()) / RAND_MAX * M_PI * 2;   // случайный "азимут"
return QVector3D(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
}
"На пальцах" - компонента Z выбрасывается как будто в 2D, а X и Y "придавлены" ее синусом. Поэтому

среднее(x * x) = 1/4
среднее(y * y) = 1/4
среднее(z * z) = 1/2

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

Хотя можно посчитать для произвольной размерности и без всяких интегралов, исходя из свойств орт. преобразования и симметрии.  
Прошу исполнить. Спасибо


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 12, 2017, 11:09
Ага, а вот при таком генераторе векторов
Код
C++ (Qt)
inline float RandF( void )
{
return float(qrand()) / RAND_MAX * 2 - 1;
}
 
QVector3D RandVec( void )
{
while (true) {
QVector3D vec(RandF(), RandF(), RandF());
float len = vec.length();
if (len <= 1.0f) return vec / len;
}
}
Четко получается 1/5 и 1/15. Да, все верно


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 12, 2017, 14:56
Цитировать
Генерация случайного вектора в сферической СК - популярные грабли, она не дает равномерного распределения
Ну с этим никто не спорит..

Однако если выбрать параметризацию, в которой случайной величиной является проекция ед. вектора на ось z и угол phi:
Код
C++ (Qt)
static const double pi = 4.0*atan(1.0);
 
inline double sign(const double & x) { return (x >= 0.0) ? 1 : -1; }
 
 
int main()
{
   random_device rd;
   mt19937 gen(rd());
 
   uniform_real_distribution<double> phi_dist(0.0, 2.0*pi); // распределение для угла phi
   uniform_real_distribution<double> z_dist(-1.0, 1.0); // распределение для проекции вектора на ось z
 
 
   const int num = 1000 * 1024;
   double sum[5] = { 0.0 };
   for (int i = 0; i < num; ++i)
   {
       double z = z_dist(gen);
       double phi = phi_dist(gen);
 
       double x = sign(z)*sqrt(1.0 - z*z)*cos(phi);
       double y = sign(z)*sqrt(1.0 - z*z)*sin(phi);
 
 
       double x2 = x*x;
       double y2 = y*y;
       double z2 = z*z;
       sum[0] += x2;
       sum[1] += x2 * x2;
       sum[2] += x2 * y2;
       sum[3] += x2 * z2;
   }
   for (int i = 0; i < 4; ++i)
       cout << (sum[i] / num) << endl;
 
   return 0;
}
 

то всё будет корректно. Такое усреднение будет соответствовать интегрированию по телесному углу.

Выкладываю pdf с выводом формулы для среднего от произведения ni nj nk nl




Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Январь 12, 2017, 15:23
Код
C++ (Qt)
static constexpr double pi = 4.0*atan(1.0);
На всякий случай, atan не constexpr по стандарту. Clang не скомпилирует.


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 12, 2017, 15:30
Цитировать
На всякий случай, atan не constexpr по стандарту. Clang не скомпилирует.
Ну да, там просто const должен быть, конечно)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Январь 12, 2017, 16:49
Код
C++ (Qt)
static constexpr double pi = 4.0*atan(1.0);
На всякий случай, atan не constexpr по стандарту. Clang не скомпилирует.

Хотя странно, честно говоря - ведь в данном примере агрумент atan это константа, а не переменная.


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 12, 2017, 17:08
Цитировать
Хотя странно, честно говоря - ведь в данном примере агрумент atan это константа, а не переменная.
Надо посмотреть, что там по этому поводу стандарт говорит)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Январь 12, 2017, 19:17
http://stackoverflow.com/questions/17347935/constexpr-math-functions (http://stackoverflow.com/questions/17347935/constexpr-math-functions)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Январь 12, 2017, 19:34
Я так понимаю, gcc все же умеет constexpr для этих древних legacy функций :)

А для остальных, я так понял причину - типа так как функции очень старые и раньше не были constexpr, то и не будем мы это менять, как бы чего не вышло? Но что может измениться, косинусы углов вдруг станет модно считать по другому ??? Имхо, надуманная причина "оставить как есть"...


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Январь 12, 2017, 20:19
По ссылке 2 причины:
Изменение глобальной переменной errno
constexpr функция не должна быть сложной (содержать циклы, например).


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 25, 2017, 08:03
20) Есть 2 шарика одинакового размера и материала (напр бильярдных)
Код
C++ (Qt)
struct Ball {
QVector3D m_position;
QVector3D m_speed;
static float radius;
};
Написать ф-цию
Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
// Если шарики столкнулись то вернуть true
// и рассчитать новые скорости шариков
}


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 25, 2017, 17:45
Цитировать
20) Есть 2 шарика одинакового размера
Ну это просто решается в системе центра масс..
Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
   QVector3D r0 = ball1.pos - ball2.pos;
   QVector3D u = ball1.speed - ball2.speed;
 
   float u2 = u.lengthSquared();
   float r0u = QVector3D::dotProduct(r0, u);
 
   float rho2 = r0.lengthSquared() - r0u*r0u/u2;
 
   return (rho2 < 4*Ball::radius * Ball::radius);
}
 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 27, 2017, 07:01
Ну это просто решается в системе центра масс..
Шо за система  ???

Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
   QVector3D r0 = ball1.pos - ball2.pos;
   QVector3D u = ball1.speed - ball2.speed;
 
   float u2 = u.lengthSquared();
   float r0u = QVector3D::dotProduct(r0, u);
 
   float rho2 = r0.lengthSquared() - r0u*r0u/u2;
 
   return (rho2 < 4*Ball::radius * Ball::radius);
}
 
Посчитаем тестовый пример (на бумажке)
Код
C++ (Qt)
Ball b1, b2;
 
// первый шарик справа и движется вправо
b1.position = QVector3D(1, 0, 0):
b1.speed = QVector3D(1, 0, 0):
 
// а второй стоит в (0, 0, 0)
b2.position = QVector3D(0, 0, 0):
b2.speed = QVector3D(0, 0, 0):
 
Ball::radius = 0.4f;
bool collided = BallCollided(b1, b2);
Тогда все получается по единичке, а rho2 = 0. Так что, выходит пересеклись? Где-то перемудрили, надо было потратиться на нормализацию


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 27, 2017, 07:26
По поводу пересечения шариков: ну а почему не просто так
Код
C++ (Qt)
bool BallsCollided( Ball & b1, Ball & b2 )
{
   if ((b1.position - b2.position).length() > Ball::radius * 2)  // не пересеклись?
    return false;
 
// пересеклись, считаем новые скорости
 
   return true;
}
 
Вот почему никто не предложил этого простейшего варианта - хз. Неужели и здесь надо вооружиться знаниями новейших технологий, прочитать тонну ссылок, а потом уж... А просто так длину проверить - ни-ни!  :)

Такая проверка не то чтобы "неправильна", но не учитывает крайних случаев. Напр мы симулируем движение 2 шариков
Код
C++ (Qt)
while (true) {
 BallsCollided(b1, b2);
 b1.position += b1.speed * dt;   // часто для простоты dt = 1
 b2.position += b2.speed * dt;
}
И тут можно получить по дюнделю
а) пересечение состоялось, но на след итерации оно еще есть (шарики удаляются друг от друга слишком медленно)
b) наоборот, скорости слишком велики, и шарики "проскочили" сквозь друг друга
с) или шарики уж "слишком пересеклись", может "слились"

В общем, есть такое словечко "робостный".


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 27, 2017, 13:26
Цитировать
Шо за система  ???
Ландау, Лифшиц 1 том..

 
Цитировать
Посчитаем тестовый пример (на бумажке)
Да, сорри, забыл условие проверить.. Теперь всё ок
Код
C++ (Qt)
bool BallsCollided( Ball & ball1, Ball & ball2 )
{
   QVector3D r0 = ball1.pos - ball2.pos;
   QVector3D u = ball1.speed - ball2.speed;
 
   float u2 = u.lengthSquared();
   float r0u = QVector3D::dotProduct(r0, u);
 
   float rho2 = r0.lengthSquared() - r0u*r0u/u2;
 
   return (rho2 < 4.0*Ball::radius * Ball::radius) & (r0u < 0.0f);
}
 

Цитировать
По поводу пересечения шариков: ну а почему не просто так
Это вообще что??  
Как я понял из условия задачи: В некоторый момент времени нам были даны координаты и скорости шаров.  Вопрос: Столкнутся ли они в будущем? Всё.
Та формула/функция, что я привёл однозначно на этот вопрос отвечает.)
Могу, конечно, её расшифровать/вывести..  

Ну и скорости после столкновения тоже легко вычисляются..


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 28, 2017, 12:46
Как я понял из условия задачи: В некоторый момент времени нам были даны координаты и скорости шаров.  Вопрос: Столкнутся ли они в будущем? Всё.
Ну как всегда, сами напутаете - а я виноват :) Я писал
// Если шарики столкнулись то вернуть true
// и рассчитать новые скорости шариков
А Ваша ф-ция возвращает true если вообще столкновение будет (может через год). Какой смысл это считать? Практически нужно знать что они уже столкнулись или столкнутся в течение заданного интервала времени dt (шага симуляции), который часто опускается для простоты (dt = 1). Т.е. если столкновения нет, то просто прибавляем скорость к позиции
Код
C++ (Qt)
ball.position += ball.speed;
 
Могу, конечно, её расшифровать/вывести..  
Ну давайте повыводим, я начну
Цитировать
QVector3D position1 = ball1.position + ball1.speed * t;  // закон движения первого шарика
QVector3D position2 = ball2.position + ball2.speed * t;  // закон движения второго шарика

QVector3D diff = position1 - position2;   // вектор центр-центр шариков

шарики точно столкнулись (т.е. без проникновения) если
float dist = diff.lengthSquared() = QVector3D::dotProduct(diff, diff) = 4 * Ball::radius * Ball::radius;

Нужно найти t при котором это равенство выполняется (если такое t существует)
Присмотримся к вектору diff
Цитировать
QVector3D origin = ball1.position - ball2.position;
QVector3D direction = ball1.speed - ball2.speed;
diff = origin + direction * t;
Так это же ур-е луча выходящего из точки origin в напр-и direction. Оказывается задачка-то сводится к хорошо известной "пересечение луча со сферой", в данном случае центр сферы в (0, 0, 0) и радиус = 2 * Ball::radius. Вот мы и прорвались к "готовым проверенным решениям"! :)

Впрочем в данном случае проще самому. Можно действовать чисто "алгеброй" (формулы) расписав dot(diff, diff), тогда все вектора обратятся в числа, и дело сведется к школьному ур-ю параболы a * t * t + b * t + c = 0. Но мне больше нравится "по чертежу", просто дважды применив теорему Пифагора. Как вижу, m_ax тоже предпочитает этот способ, передаю ему слово


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Январь 29, 2017, 15:15
Цитировать
Ну как всегда, сами напутаете - а я виноват
Конечно. Нужно корректно ставить задачу.
Сейчас выясняется что есть ещё и шаг dt и т.д. и т.п..

Цитировать
Практически нужно знать что они уже столкнулись или столкнутся в течение заданного интервала времени dt
Ну и в чём проблема тогда? Скорость сближения/разбегания известна, относительное расстояние известно..
Странные у Вас какие то задачки..) 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 29, 2017, 18:41
Конечно. Нужно корректно ставить задачу.
Сейчас выясняется что есть ещё и шаг dt и т.д. и т.п..
Задачи "столкнутся ли (когда-нибудь) шарики" не ставилось. Но если вы/мы ее решаем, то рез-т должен быть "когда столкнутся" (через какое время), тогда в этом есть смысл. А чтобы ф-ция вернула да/нет это найденное время должно c чем-то сравниваться. В общем, dt возникает по Вашей же инициативе.

Ну и в чём проблема тогда? Скорость сближения/разбегания известна, относительное расстояние известно..
В упор не вижу никакого "относительного расстояния" в Вашем коде.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 02, 2017, 15:01
Мда, никаких пояснений не дождесся :'(  А попробуешь спросить - получишь томом Ландау по рогам. Неужели все так сложно? Попробую-ка я. Вот чертеж (аттач). Известно AC (расстояние между центрами) и направление AB (разница скоростей).
Код
C++ (Qt)
bool BallsCollded( Ball & b1, Ball & b2, float dt = 1.0f )
{
// находим напр-е AB
 QVector3D vecAB = b1.speed - b2.speed;
 float curSpeed = vecAB.length();
 
// убедимся что разница скоростей достаточно велика
 const double minSpeed = 1.0e-7;
 if (curSpeed < minSpeed) return false;
 vecAB /= curSpeed;
 
// находим длину AB как проекцию AC на напр-е AB
QVector3D vecAC = b1.position - b2.position;
float lenAB = QVector3D::dotProduct(vecAC, vecAB);
 
// если lenAB отрицательна, то шары расходятся
if (lenAB <= 0) return false;
 
// по теореме Пифагора находим квадрат длины катета BC
float lenBC2 = vecAC.lengthSquared() - lenAB * lenAB;
 
// если lenBC2 < квадрата (двойного) радиуса, то шарики никогда не пересекутся
float R2 = Ball:radius * Ball:radius * 4;
if (lenBC2 > R2) return false;
 
// из тр-ка DBC найдем длину BD
float lenBD = sqrt(R2 - lenBC2);
 
// длина AD = время первого касания
float t0 = lenAB - lenBD;
 
// успеют ли шарики столкнуться за время dt ?
if (t0 * dt > curSpeed) return false;
 
// столкнулись, рассчитываем новые скорости
 ...
 return true;
}
 
Выглядит как задачка средней школы (даже не для старших классов). Даже засомневался, а верно ли я рассуждаю? Вдруг с фундаментальных позиций это совсем не так? (я ведь тоже много читал букварь :))

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

Да, но те тележки всегда двигались навстречу друг другу, а шарики сталкиваются под любым углом. Что же делать?


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 02, 2017, 16:08
Цитировать
Как я понял из условия задачи: В некоторый момент времени нам были даны координаты и скорости шаров.  Вопрос: Столкнутся ли они в будущем? Всё.

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

Функция расстояния между двумя движущимися объектами выглядит так (выводится из теоремы косинусов)

ρ^2=(S_1-V_1∙t)^2+(S_2-V_2∙t)^2-2∙(S_1-V_1∙t)∙(S_2-V_2∙t)∙cos⁡〖α_12 〗

(http://www.prog.org.ru/index.php?action=dlattach;topic=27072.0;attach=8864)

где

S1 - расстояние от центра первого шара до точки пересечения траекторий;
S2 - расстояние от центра второго шара до точки пересечения траекторий;
V1 - скорость движения первого шара к точке пересечения траекторий (может быть отрицательной);
V2 - скорость движения второго шара к точке пересечения траекторий (может быть отрицательной);
α12 – внутренний угол треугольника между траекториями в месте их пересечения
t - момент времени

Зная расстояние, можно найти соответствующие моменты времени. Нужно решить квадратное уравнение относительно t: если корней нет - сближения на заданное расстояние не будет, если корни есть, то интересует ближайший (момент сближения).

Зная момент времени, можно рассчитать взаимное положение шаров в пространстве в момент удара (углы, направления движения и т.п.) и рассчитать "по законам сохранения импульса" новые характеристики движения шаров.


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 03, 2017, 08:46
Мда, никаких пояснений не дождесся :'(  А попробуешь спросить - получишь томом Ландау по рогам. Неужели все так сложно? Попробую-ка я. Вот чертеж (аттач). Известно AC (расстояние между центрами) и направление AB (разница скоростей).
...

Геометрическое решение в относительном движении тоже правильное

Смущает только

Код
C++ (Qt)
// длина AD = время первого касания
float t0 = lenAB - lenBD;
 
// успеют ли шарики столкнуться за время dt ?
if (t0 * dt > curSpeed) return false;
 

Наверное, в соответствии с единицами измерения должно быть

Код
C++ (Qt)
// длина AD = время первого касания
float lenAD = lenAB - lenBD;
 
// успеют ли шарики столкнуться за время dt ?
if ( lenAD > curSpeed * dt ) return false;
 



Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 03, 2017, 15:13
но решение такой задачи на плоскости не сложное
А зачем ограничивать задачу 2D и связываться c S1 и S2? Если хотелось решать квадратное ур-е
Цитировать
#define DOT(a, b) QVector3D::dotProduct(a, b)

QVector3D origin = ball1.position - ball2.position;
QVector3D direction = ball1.speed - ball2.speed;
QVector3D diff = origin + direction * t;

// исходное ур-е
DOT(diff, diff) = 4 * radius * radius;

// тогда  для ур-я
a * t * t + b * t + c = 0;

Коэффициенты
a = DOT(direction, direction);   // или  direction.lengthSquared();
b = DOT(origin, direction) * 2;
c = DOT(origin, origin) - 4 * radius * radius;

Зная момент времени, можно рассчитать взаимное положение шаров в пространстве в момент удара (углы, направления движения и т.п.) и рассчитать "по законам сохранения импульса" новые характеристики движения шаров.
Как будто достаточно произнести 3 магических слова "закон сохранения импульса" - и все решится  :) И почему никто не скажет
Цитировать
И что с того закона? Новые скорости-то как считать?
Увы, непосредственность и свежесть мысли новичка быстро теряются с накоплением "опыта"

Наверное, в соответствии с единицами измерения должно быть
Да, верно


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 03, 2017, 16:03
Как будто достаточно произнести 3 магических слова "закон сохранения импульса" - и все решится  :) И почему никто не скажет
Цитировать
И что с того закона? Новые скорости-то как считать?
Увы, непосредственность и свежесть мысли новичка быстро теряются с накоплением "опыта"

Я думал, все знают как  :-\).

Для определения компонент новых векторов необходимо принять во внимание два уравнения:

- закон сохранения импульса (векторное уравнение)

m1*v1 + m2*v2 = const

- закон сохранения энергии

0.5 * m1*v1^2  + 0.5 * m2*v2^2 = const

В случае абсолютно упругого столкновения решением является

u1 = -v1 + 2 * (m1*v1 + m2*v2) / (m1 + m2);
u2 = -v2 + 2 * (m1*v1 + m2*v2) / (m1 + m2);

где
m - массы шаров
v - векторы скоростей до столкновения
u - векторы скоростей после столкновения

При равенстве масс, формулы упрощаются до неприличия

u1 = v2;
u2 = v1;


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 03, 2017, 16:40
Да забыл пояснить, что при нецентральном столкновении вышеописанные формулы работают с компонентами проекций векторов скоростей шаров на проходящую через их центры линию. :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 03, 2017, 19:59
При равенстве масс, формулы упрощаются до неприличия

u1 = v2;
u2 = v1;
Об этом я уже сообщил выше  :)

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


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 11, 2017, 12:50
21) Вот эти "столбы света" (аттач) выглядят очень привлекательно. Как их делают?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 13, 2017, 12:02
На всякий случай напоминаю что, как и другие, этот вопрос не требует каких-то специальных знаний, знакомства с современными (могучими) технологиями и.т.п. :)  Также не ставится задача рисовать лучи света в real-time - нужно просто их нарисовать, ну можно сказать и "посчитать"


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Апрель 13, 2017, 12:08
3d Studio max? :)


Название: Re: Геометрия (задачки)
Отправлено: Apktyc от Апрель 13, 2017, 12:15
Этож вроде зовется gods rays? Алгоритм наличествует (https://software.intel.com/sites/default/files/m/f/b/3/8/7/38644-GodRays.pdf)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 17, 2017, 13:19
3d Studio max? :)
Ну вот почему всегда такой чисто шкурный подход? :)

Этож вроде зовется gods rays? Алгоритм наличествует (https://software.intel.com/sites/default/files/m/f/b/3/8/7/38644-GodRays.pdf)
Всяко зовут. Статья - сразу получаем HDRI (значения цвета > 1), OpenCL (тоже слон), да и вообще трудновато понять о чем речь. Ну и к чему такие страсти? Нельзя ли как-то нарисовать по-простому/народному?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 09, 2017, 08:18
22) Довольно популярное утверждение, звучит примерно так
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Верно ли это? Существует ли такая (волшебная) матрица? :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 09, 2017, 18:56
http://doc.qt.io/qt-5/qmatrix4x4.html#viewport


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 10, 2017, 08:08
http://doc.qt.io/qt-5/qmatrix4x4.html#viewport
Давно заметил что отвечающие ссылкой сами ее даже не читают. Ну вьюпорт-то здесь причем? Наверное логика типа
Цитировать
Ага, вот тут тоже есть [-1, 1] - ну значит "оно"
:)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 10, 2017, 09:29
Не обязательно [-1, 1] диапазон применяется для отображения. Вьюпорт матрица заданная с помощью геометрии окна преобразует координаты вершин в координаты окна. можно отображать и [-2, 2]...


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 10, 2017, 13:23
Не обязательно [-1, 1] диапазон применяется для отображения. Вьюпорт матрица заданная с помощью геометрии окна преобразует координаты вершин в координаты окна. можно отображать и [-2, 2]...
Читаем букварь вместе  :)
Цитировать
void QMatrix4x4::viewport(float left, float bottom, float width, float height, float nearPlane = 0.0f, float farPlane = 1.0f)
Multiplies this matrix by another that performs the scale and bias transformation used by OpenGL to transform from normalized device coordinates (NDC) to viewport (window) coordinates. That is it maps points from the cube ranging over [-1, 1] in each dimension to the viewport with it's near-lower-left corner at (left, bottom, nearPlane) and with size (width, height, farPlane - nearPlane).
Тут речь идет уже о следующей операции, которая применяется вовсе не к "координатам вершин", а к тем которые уже каким-то чудесным образом удовлетворяют условию видимости [-1, 1]. Вот я и спрашиваю каким?

Да, и вопрос не требует знания OpenGL специфики, просто "там тоже" - но не более того


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 10, 2017, 14:05
Тут речь идет уже о следующей операции, которая применяется вовсе не к "координатам вершин", а к тем которые уже каким-то чудесным образом удовлетворяют условию видимости [-1, 1]. Вот я и спрашиваю каким?
Перемножение этой матрицы с вектором, который описывает преобразованную вершину, даёт вектор, описывающий положение пикселя в окне.

Если я всё правильно помню, то вся цепочка преобразований выглядит следующим образом:
PixelPos= viewportMatrix * projectionMatrix * modelviewMatrix * vertexVector
Средняя часть и загоняет вершину в "отображаемый" диапазон.
Можно её выделить как отдельную матрицу
modelViewProjectionMatrix = projectionMatrix * modelviewMatrix
тогда
PixelPos= viewportMatrix * modelViewProjectionMatrix  * vertexVector




Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 10, 2017, 17:03
Если я всё правильно помню, то вся цепочка преобразований выглядит следующим образом:
PixelPos= viewportMatrix * projectionMatrix * modelviewMatrix * vertexVector
Для широкого круга: последовательность операций в OpenGL записывается наоборот, читать надо справа налево (начиная с vertexVector). Хреново и неудобно.

Средняя часть и загоняет вершину в "отображаемый" диапазон.
Можно её выделить как отдельную матрицу
modelViewProjectionMatrix = projectionMatrix * modelviewMatrix
Именно это часто повторяется теми или иными словами, но верно ли это? Я думаю что нет, во всяком случае - не всегда. Ладно, подождем, может еще кто захочет высказаться.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 10, 2017, 17:14
Именно это часто повторяется теми или иными словами, но верно ли это?

Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.

ModelView:
http://doc.qt.io/qt-5/qmatrix4x4.html#rotate-1
http://doc.qt.io/qt-5/qmatrix4x4.html#translate-2

Projection:
http://doc.qt.io/qt-5/qmatrix4x4.html#frustum
http://doc.qt.io/qt-5/qmatrix4x4.html#perspective
http://doc.qt.io/qt-5/qmatrix4x4.html#ortho


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 11, 2017, 12:53
Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.
Не вижу как, тем более "с легкостью" :) Ладно, почему я думаю что это неверно. Умножение на матрицу происходит так
Цитировать
x' = x * m00 + y * m10 + z * m20 + m30;
Где
x, y, z - координаты исходного вертекса (точки)
mXX - числа сидящие в матрице
x' - новая координата x (y' и z' получаются аналогично)
Неважно какие конкретно значения mXX и откуда они взялись. Важно что они одни и те же (остаются неизменными) для всех исходных точек

Теперь допустим что точка с исходными координатами (1, 1, 1) видима на экране. Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана, напр
(10, 10, 10) - видима
(100, 100, 100) - видима
и.т.д

Поэтому какими бы ни были mXX - всегда можно найти такую исходную точку для которой x' > 1. А значит матрицы которая чего-то там "вписывает" в природе не существует. Вот в изометрии (glOrtho) - там пожалуйста

Заметьте что ответ не требовал никаких знаний классов и.т.п.  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 11, 2017, 15:53
Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана
На каком луче?

Цитировать
А значит матрицы которая чего-то там "вписывает" в природе не существует.
Так вопрос в существовании матрицы fitToScreen? В #243 как-то иначе постановка звучала. ModelViewProjection, что была упомянута мною выше преобразует точки к необходимым представлению и проекции, а далее Viewport, которая описывает отображение "обработанных" вершин переводит те в координаты экрана. Для OpenGL принято, что Viewport не показывает вершины вне диапазона [-1; 1]. Вроде так.

Классы QMatrix4x4 и QVector4D с лёгкостью позволяют это проверить.
Не вижу как, тем более "с легкостью" :)

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Код
C++ (Qt)
#include <QCoreApplication>
#include <QMatrix4x4>
#include <QDebug>
 
 
int main()
{
   QMatrix4x4 viewportMatrix;
   viewportMatrix.viewport(0, 0, 100, 100);  // {0, 0} is bottomLeft
 
   QMatrix4x4 projectionMatrix; // identity
 
   QMatrix4x4 modelViewMatrix;
   modelViewMatrix.rotate(45, 0, 0, 1);
 
 
   const QVector4D vec (1, 0, 0, 1);
 
   const QMatrix4x4 modelViewProjectionMatrix = projectionMatrix * modelViewMatrix;
 
   const QVector4D modelViewProjectedVec = modelViewProjectionMatrix * vec;
   qDebug() << modelViewProjectedVec;
   qDebug() << viewportMatrix * modelViewProjectedVec;
 
   return 0;
}
 


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 12, 2017, 07:27
На каком луче?
Который выходит из точки (0, 0, 0) и проходит через заданную, в данном случае (1, 1, 1). Все точки с координатами (t, t, t) попадут в одну и ту же точку экрана. Так (в принципе) работает кинопроектор, фильмоскоп, человеческий глаз - любая перспективная камера. Наблюдать изометрию в природе мы не можем.

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Как говорилось выше, с ортогональной проблем нет. Но вот для перспективной проекции никакого "вписания" не произойдет.

Так вопрос в существовании матрицы fitToScreen?
Не совсем, хотя и близко. Если знать наперед позиции всех вертексов, матрицу можно подобрать/пристроить так чтобы "все было в экране", но аналитически ее задать нельзя. Поэтому кнопки "fit" обычно и нет для перспективы, вместо нее предлагается что-то типа "zoom", т.е. юзверь сам таскает камеру ближе/дальше


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 12, 2017, 09:48
Поэтому кнопки "fit" обычно и нет для перспективы, вместо нее предлагается что-то типа "zoom", т.е. юзверь сам таскает камеру ближе/дальше
Такая кнопка есть по крайней мере в 2х CAE системах, что я использую (ESI VisualViewer, ПолигонСофт).
Если знать наперед позиции всех вертексов, матрицу можно подобрать/пристроить так чтобы "все было в экране", но аналитически ее задать нельзя.
По сути, матрица проекции описывает объём, который будет выведен на экран. Для перспективы форма этого объёма усечённая пирамида. Вот и считайте её. Для упрощения можно считать параллелепипед, вписанный в эту пирамиду.

Вот пример с ортоганальной проекцией в коробке [-1; 1]
Как говорилось выше, с ортогональной проблем нет. Но вот для перспективной проекции никакого "вписания" не произойдет.
Что имеется в виду под "вписанием"?
Теперь допустим что точка с исходными координатами (1, 1, 1) видима на экране. Значит все точки сидящие на этом луче тоже видимы и попадут в ту же точку экрана, напр
Я так не думаю. Видимость точек определяется матрицей проекции, а условия перекрытия точек определяется матрицей представления. см. аттач. Точка {10;10;10} вне области видимости, и вектор {1;1;1} не параллелен Zc (направление взгляда)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 12, 2017, 15:51
Я так не думаю. Видимость точек определяется матрицей проекции, а условия перекрытия точек определяется матрицей представления. см. аттач. Точка {10;10;10} вне области видимости, и вектор {1;1;1} не параллелен Zc (направление взгляда)
Точка (0, 0, 0) вовсе не находится на передней стенке - это вершина пирамиды. Поэтому если выходящий из нее луч пересек переднюю стенку - он обязательно пересечет и заднюю, относительные координаты точек пересечения будут одинаковы.

Что имеется в виду под "вписанием"?
То что изначально спрашивалось -
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Ладно, проверяем. Вот слегка измененный Qt пример (аттач). Все вертексы видны на экране. Печатает
Цитировать
0 QVector4D(-1.81066, -2.41421, -0.5, 4)
1 QVector4D(1.81066, -2.41421, -0.5, 4)
2 QVector4D(-1.81066, 2.41421, -0.5, 4)
3 QVector4D(1.81066, 2.41421, -0.5, 4)
4 QVector4D(1.81066, -2.41421, -0.5, 4)
5 QVector4D(1.81066, -2.41421, 4.5, 6)
6 QVector4D(1.81066, 2.41421, -0.5, 4)
7 QVector4D(1.81066, 2.41421, 4.5, 6)
8 QVector4D(1.81066, -2.41421, 4.5, 6)
9 QVector4D(-1.81066, -2.41421, 4.5, 6)
10 QVector4D(1.81066, 2.41421, 4.5, 6)
11 QVector4D(-1.81066, 2.41421, 4.5, 6)
12 QVector4D(-1.81066, -2.41421, 4.5, 6)
13 QVector4D(-1.81066, -2.41421, -0.5, 4)
14 QVector4D(-1.81066, 2.41421, 4.5, 6)
15 QVector4D(-1.81066, 2.41421, -0.5, 4)
16 QVector4D(-1.81066, -2.41421, 4.5, 6)
17 QVector4D(1.81066, -2.41421, 4.5, 6)
18 QVector4D(-1.81066, -2.41421, -0.5, 4)
19 QVector4D(1.81066, -2.41421, -0.5, 4)
20 QVector4D(-1.81066, 2.41421, -0.5, 4)
21 QVector4D(1.81066, 2.41421, -0.5, 4)
22 QVector4D(-1.81066, 2.41421, 4.5, 6)
23 QVector4D(1.81066, 2.41421, 4.5, 6)
Где же [-1..1]? Или хотя бы [-2..2]?  :)

По сути, матрица проекции описывает объём, который будет выведен на экран.
Это "логично предположить", ну действительно, дали такую матрицу - получили так, другую - эдак.
Но в действительности ничем таким она не занимается  :) Вообще она "дитя OpenGL", без него проще обойтись без этой матрицы.


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 12, 2017, 16:57
Надо немножко подумать. Пока нет времени. С перспективой плотно не работал. Обратил внимание, что отсутствует viewport матрица в явном виде, каким образом учитывается размер экрана тоже пока не разобрался. А матрица проекции выглядит
Цитировать
QMatrix4x4(type:General
   1.81066         0         0         0         
         0   2.41421         0         0         
         0         0      -2.5     -10.5         
         0         0        -1         0         
)
Первые 3 столбца не описывают единичный вектор.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 13, 2017, 07:46
Надо немножко подумать.
Полезная процедура. Чуть намекну

Если я всё правильно помню, то вся цепочка преобразований выглядит следующим образом:
PixelPos= viewportMatrix * projectionMatrix * modelviewMatrix * vertexVector
Между viewportMatrix и projectionMatrix есть еще одно преобразование (но не матрица). Ну а можно посчитать пыксели используя только modelviewMatrix (конечно зная параметры камеры)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 17, 2017, 11:32
23) Предлагается такая ф-ция для перевода 3D точки (в координатах камеры) в пыксели экрана
Код
C++ (Qt)
inline QVector2D CameraPoint2Screen( const QVector3D & src, float scale, bool perspectiveFlag )
{
 return src * (scale / (perspectiveFlag ? -src.z() : 1.0f));
}
a) Верно/корректно ли это?

b) Если да, то откуда взять (как вычислить) scale? Считаем что параметры камеры задаются стандартно: QMatrix4x4::ortho или QMatrix4x4::perspective 

с) Как всегда, познания в OpenGL не требуются, но для тех кто увлекается этой мерзостью доп вопрос: если все так просто, то почему же в OpenGL так не делают  ???


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 30, 2017, 18:47
Хорошая статья:
http://www.songho.ca/opengl/gl_transform.html

Совсем забыл про операцию деления на w
Доработал код вашей процедуры. Надеюсь, не наврал.
Код
C++ (Qt)
void GeometryEngine::PrintVertices(const QMatrix4x4 & mvp , const QMatrix4x4 &viewport)
{
int count = sizeof(vertices) / sizeof(vertices[0]);
for (int i = 0; i < count; ++i) {
QVector4D ver(vertices[i].position, 1.0f);
ver = mvp * ver;
       ver /= ver.w();
//        ver = viewport * ver; // screen coordinates
qDebug() << i << ver;
}
qDebug() << "end";
}
 

viewport в QOpenGLWidget задаётся равным размеру окна при каждом вызове paintGL (из описания класса)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 31, 2017, 10:21
Совсем забыл про операцию деления на w
Да, "оно". Заметим что это преобразование невозможно выразить матрицей, поэтому на вопрос
Цитировать
Любую точку множим на эту матрицу. Если получившиеся координаты x (y, z) лежат в пределах от -1 до +1, значит точка видима на экране (в окне вывода), иначе нет
Можно ответить сразу - нет, это утверждение неверно, т.к. перспективное преобразование не матричное

А откуда же берется это хитрое "w"?


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 31, 2017, 11:39
По ссылке выше объясняется откуда w. Более конкретно про неё здесь
http://www.songho.ca/math/homogeneous/homogeneous.html

Вектор, который вы используете 3 компонентный. Перспектива же описывается с помощью 4х4 матрицы. Начните использовать 3х3 матрицу проектирования и получите те самые [-1; 1].


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 31, 2017, 12:58
Перспектива же описывается с помощью 4х4 матрицы. Начните использовать 3х3 матрицу проектирования и получите те самые [-1; 1].
Уверяю Вас, перспектива НЕ описывается матрицей :), а задается одним числом (можно всяко-разно).

Цитировать
Ну как же так, открываем спецификацию, официальный документ (attach). Вот тут черным по белому написано "the perspective matrix" и какие-то формулы (не вникал). А этот чувак говорит... Он че - такой умный?
Я ничего не напутал?  :)

В действительности никакого противоречия здесь нет, просто OpenGL делает простую операцию (см вопрос 23) очень хитрым, извилистым путем. Есть желание разобраться в этой мифической матрице?   


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Май 31, 2017, 13:51
Матрица не мифическая.
http://www.songho.ca/opengl/gl_projectionmatrix.html
Тут описание того, как она формируется и почему


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 01, 2017, 15:16
Матрица не мифическая.
http://www.songho.ca/opengl/gl_projectionmatrix.html
Тут описание того, как она формируется и почему
В очередной раз напомню что задачки не требуют каких-то познаний в OpenGL, вполне достаточно школьных знаний, ну может (иногда) первый семестр ВУЗа (насколько я помню скалярное и векторное произведения изучаются там) - И ВСЕ

Беда "гуглящих" - найдя что-то решают что это "оно", и что делать нужно непременно так. Хотя никто не обещал что найденное - лучшее, да и вообще верно и/или уместно (о чем сам инет честно предупреждает). Порой абсурдность такого изучения довольно очевидна. Ну в самом деле, неужели для перевода 3D точки в экран необходимо:

- иметь однородные координаты
- создать по меньшей мере 2 матрицы
- выполнить каноническую последовательность действий

Не слабо. А нельзя ли то же самое сделать на базе знаний 7-го класса (где изучалось подобие тр-ков)? Не, никак?  :) А если уж такая любовь к OpenGL то почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев" - нее, нужна очередная "обильная" ссылка  :)

Впрочем книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Ладно, вернемся к задачкам, на всякий случай напомню текущую

23) Предлагается такая ф-ция для перевода 3D точки (в координатах камеры) в пыксели экрана
Код
C++ (Qt)
inline QVector2D CameraPoint2Screen( const QVector3D & src, float scale, bool perspectiveFlag )
{
 return src * (scale / (perspectiveFlag ? -src.z() : 1.0f));
}
a) Верно/корректно ли это?

b) Если да, то откуда взять (как вычислить) scale? Считаем что параметры камеры задаются стандартно: QMatrix4x4::ortho или QMatrix4x4::perspective 

с) Как всегда, познания в OpenGL не требуются, но для тех кто увлекается этой мерзостью доп вопрос: если все так просто, то почему же в OpenGL так не делают  ???


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 01, 2017, 15:44
Пфффф
На мой взгляд, подход, используемый в gl мало чем отличается от других библиотек 3D графики. Особой беды не вижу в использовании матриц вместо систем уравнений, которые так привычны школьникам.

Цитировать
Беда "гуглящих" - найдя что-то решают что это "оно"
Лучше такая беда, чем беда "негуглящих"

Никто не мешает вам пользуясь знаниями 7 класса делать картинки, только результат будет соответствующий.

Цитировать
почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев"
Потому что это утверждение ложно.

Цитировать
книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Возможно потому что их не для школьников пишут?


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Июнь 01, 2017, 21:05
Цитировать
книги по "компьютерной графике" - такой же тихий ужас, никогда не осиливал больше 1-2 страниц.
Возможно потому что их не для школьников пишут?

Их обычно пишут "окодемеки" с большим доктортитулом. Основная их беда в том, что они обычно не занимаются практической стороной реализации :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 02, 2017, 11:56
Особой беды не вижу в использовании матриц вместо систем уравнений, которые так привычны школьникам.
Да помилуйте, какие еще "системы уравнений"? Я предложил (задачка 23) сделать то же самое с помощью умножения на константу и деления на -z. Ответа "верно ли это" я так и не услышал  :)

Цитировать
почему нельзя ответить просто "w - это то самое z на которое делим, только с минусом у OpenGL извращенцев"
Потому что это утверждение ложно.
Но ведь так записано в матрице (см картинку выше) из спецификации. Как же оно может быть ложно?  :)

Их обычно пишут "окодемеки" с большим доктортитулом. Основная их беда в том, что они обычно не занимаются практической стороной реализации :)
Не всегда, напр ту же спецификацию в этом не упрекнуть.
Цитировать
если все так просто, то почему же в OpenGL так не делают  ???
Потому что там нужно чтобы возвращаемая координата была "самодостаточна". Формально OpenGL рендер не знает никаких матриц, ни флажка perspectiveFlag, ничего этого ему не передается. Пришлось городить мудаковатые "однородные" координаты чтобы для каждой точки фактически хранить параметр камеры. Да еще по ходу дела надо z нормировать - тоже слили в матрицу. Вот так из 2 арифметических действий и получился монстряка  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 06, 2017, 11:15
24) Задачка обратная предыдущей: теперь есть точка (x, y) в экране (окне вывода). Считаем что точка (x = 0, y = 0) в центре экрана, x идет вправо, y вверх. Нужно найти 3D точку в пр-ве камеры.

Если такая постановка кажется Вам неполной и/или некорректной - дополните/откорректируйте ее


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Июнь 06, 2017, 14:24
24) Задачка обратная предыдущей: теперь есть точка (x, y) в экране (окне вывода). Считаем что точка (x = 0, y = 0) в центре экрана, x идет вправо, y вверх. Нужно найти 3D точку в пр-ве камеры.

Если такая постановка кажется Вам неполной и/или некорректной - дополните/откорректируйте ее

Хех... тут, батенька, одной камерой не обойтись) Как минимум 2 надо, чтоб из 2д-картинки 3д-точки воссоздать)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 06, 2017, 14:30
Игорь, в 7 классе таких задачек не решают :)

точка на плоскости является проекцией линии в объёме, когда вектор проекции параллелен проецируемой линии, поэтому решений бесконечное множество.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 07, 2017, 07:38
Хех... тут, батенька, одной камерой не обойтись) Как минимум 2 надо, чтоб из 2д-картинки 3д-точки воссоздать)
точка на плоскости является проекцией линии в объёме, ..
Так я ж и говорю
Если такая постановка кажется Вам неполной и/или некорректной - дополните/откорректируйте ее
Напр найти луч (2 точки в 3D) на котором лежат все точки в пр-ве камеры

Игорь, в 7 классе таких задачек не решают :)
Да, наверное, теорему Пифагора проходят раньше, уже и не помню когда


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 07, 2017, 09:32
Кстати, в 7 классе уже умеют корректно описывать постановку задачи. "Дано", "Найти", помните? :)

Цитировать
найти луч (2 точки в 3D) на котором лежат все точки в пр-ве камеры

Для каждой точки {xv, yv} на плоскости ("экране") соответствует линия в пространстве ("камера"), заданная системой
xc=xv
yc=yv


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 07, 2017, 10:54
Кстати, в 7 классе уже умеют корректно описывать постановку задачи. "Дано", "Найти", помните? :)
А что собсно не так? Решение не единственное? Ну бывает и так - значит имеете полное право предъявить любое. Возможно Z известен "извне" - тоже вариант. Неизвестен - найти хотя бы луч. Что нравится - то и решайте, принципиальной разницы никакой

Для каждой точки {xv, yv} на плоскости ("экране") соответствует линия в пространстве ("камера"),
Что за "линия"? Наверное Вы хотели сказать "прямая"? Ну все-таки "луч" точнее, точки за спиной камеры на экран не проецируются

...заданная системой
xc=xv
yc=yv
??? И кто такие xc и ус, откуда их взять? Может имелось ввиду ур-е прямой? Так его тоже надо задать. В общем - теряюсь в догадках  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 07, 2017, 11:07
Да, опечатался, прямая (line)
Система содержит 2 ур-я пересекающихся плоскостей. Z произвольный. Координат "спины" камеры не имею.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 08, 2017, 09:01
Система содержит 2 ур-я пересекающихся плоскостей.
Как же имея только одну 2D точку Вы получаете систему из 2 ур-й? Неужели с "современными технологиями" и так можно?  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 08, 2017, 09:08
Попробуйте как-нибудь переосилить себя и взять учебник по математике не для школы и познакомиться со способами задания прямой ;)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 08, 2017, 09:31
Попробуйте как-нибудь переосилить себя и взять учебник по математике не для школы и познакомиться со способами задания прямой ;)
А Вы уверены что здесь вообще нужен какой-то учебник?  :) Ладно, то уже пошли чисто понты. Подождем денек-другой, может еще кто-то хочет высказаться


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 08, 2017, 09:40
А Вы уверены что здесь вообще нужен какой-то учебник?
Нет, учебники вообще не нужны. Они для лохов :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 08, 2017, 12:27
Возможно Вы имели ввиду параметрическое или каноническое ур-е прямой, но они не популярны в 3D, обычно прямая задается "точка+вектор" или просто "2 точки". Однако это всего лишь "в какой форме ответ" (в любой как Вам удобно), самого ответа в упор не вижу  :)


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 08, 2017, 13:57
Цитировать
"точка+вектор" или просто "2 точки"
Так прямая задаётся у всяких "OpenGL извращенцев" :)

{x, y} есть проекция прямой {x, y, 0}, {x, y, 1} если так будет проще :)


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Июнь 08, 2017, 16:10
{x, y} есть проекция прямой {x, y, 0}, {x, y, 1}

{x, y} : {x, y} скорее, не? {x, y}  - это просто точко...


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 08, 2017, 16:15
Если на линию смотреть с торца, то видим точку.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 09, 2017, 09:58
{x, y} есть проекция прямой {x, y, 0}, {x, y, 1} если так будет проще :)
Если {x, y, 0}, {x, y, 1} - искомые точки прямой в пр-ве камеры, то {x, y} - это проекция в изометрии на плоскость XOY в пр-ве камеры, а вовсе не на экран. Выходит что рез-т никак не зависит ни от размеров изображения, ни от параметров камеры?

{x, y} : {x, y} скорее, не? {x, y}  - это просто точко...
Ну ответ-то уже оглашен в предыдущей задачке, нужно просто сделать обратное преобразование. Увы, срабатывает рефлекс "взять готовое и не париться"  :'(


Название: Re: Геометрия (задачки)
Отправлено: __Heaven__ от Июнь 09, 2017, 10:42
Цитировать
Выходит что рез-т никак не зависит ни от размеров изображения, ни от параметров камеры?
А они известны?

http://doc.qt.io/qt-5/qvector3d.html#unproject
Ахтунг, "богомерзкий OpenGL"


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 10, 2017, 12:05
Ладно, делаем обратное преобразование, получаем
Код
C++ (Qt)
inline QVector3D Screen2CameraPoint( const QVector2D & screen, float scale, bool perspectiveFlag )
{
 if (perspectiveFlag)
  return QVector3D(screen.x(), screen.y(), -scale);
 else  
  return screen / scale;
}
 
Оказывается для перспективной проекции ничего и считать не пришлось, точка-то была готовая. Оказывается существует такое magic расстояние на котором x и у в 3D равны пикселям. Именно это число и задает 3D камеру, единственный ее принципиальный параметр которого не может не быть, остальные используются довольно редко. Так откуда же оно берется ?

Намекну: ну это я назвал его "scale" (что тоже верно), в действительности это широко известный/популярный термин, причем не только в 3D.



Название: Re: Геометрия (задачки)
Отправлено: Igors от Август 15, 2017, 12:28
25) Нужно нарисовать случайные пятна на модели, напр на чайнике (аттач). Требования "лояльные", никто не будет придираться типа "ото пятно должно быть именно здесь!", на то они и случайные - но должна чувствоваться/соблюдаться "фактура". При всей простоте задачки отделаться плоской картинкой и стандартным наложением текстуры не удается - форма чайника не такая уж простая.

A для любознательных доп вопрос: а как этот чайник освещен? (хотя любознательных здесь пока не видкл - ну может появятся  :))


Название: Re: Геометрия (задачки)
Отправлено: sergek от Август 16, 2017, 11:44
A для любознательных доп вопрос: а как этот чайник освещен? (хотя любознательных здесь пока не видкл - ну может появятся  :))
да фигово освещен - пока ручку взглядом поставишь на место, напрягаешься ;)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 19, 2017, 12:00
26) Нарисовать треугольник как в учебном примере Qt (аттач), но не прибегая к OpenGL и др "современным технологиям". То есть просто закрашивая пыксели
Код
C++ (Qt)
void DrawTriangleRGB( QPainter & painter, const QPointF pt[3] )
{
???
}


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 08, 2018, 10:01
Давненько мы не брали в руки шашек :) С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 08, 2018, 11:55
Давненько мы не брали в руки шашек :) С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Без кода). Три точки (A,B,C), не лежащие на одной прямой, образуют плоскость. Векторное произведение AB x AC даст перпендикулярный вектор n к плоскости.
Матрицу поворота можно найти путем решения системы уравнений

M*n = v,
|n| = |v|.

где v - любой вектор, в данном случае с нулевой компонентой z.
для удобства можно добавить условие, что компоненты v пропорциональны n.


Название: Re: Геометрия (задачки)
Отправлено: ssoft от Февраль 08, 2018, 12:00
Тут можно прикрутить и кватернионы, но сразу не вспомню, как ими манипулировать)).


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Февраль 08, 2018, 12:36
Давненько мы не брали в руки шашек :) С шейдингом (по-простому "рисованием") как-то упорно не идет, уж не знаю почему. Ладно зайдем с др стороны

27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Здесь бесконечное множество вариантов. Смотри аттач.

ЗЫ там опечатка: вначале нужно сделать буст вдоль оси z, а потом, получившийся вектор подвергать повороту..


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 08, 2018, 14:31
Три точки (A,B,C), не лежащие на одной прямой, образуют плоскость. Векторное произведение AB x AC даст перпендикулярный вектор n к плоскости.
Все так, но те же 3 точки образуют еще и СК
Матрицу поворота можно найти
Просили найти матрицу что сделает тр-к плоским сохраняя размеры, это необязательно матрица поворота
Смотри аттач.
С понтом посмотрел аттач - и все ясно! Так запутать простейшие вещи умеют только научные работники. Кстати что у Вас с предыдущей задачкой (закраска тр-ка). Неужели и это студентам не дается ??? Безобразие!

Кстати, "метод троглодита" здесь проходит. Ну вот не знаю ни хрена, понятия не имею. НО! у меня есть букварь! И вот смотрю методы - какой из них подходит? В конце-концов ведь нужен рез-т и.т.п.


Название: Re: Геометрия (задачки)
Отправлено: ViTech от Февраль 08, 2018, 16:48
27) Есть треугольник заданный 3-мя точками ABC (QVector3D). Найти матрицу которая делает его плоским, т.е. после домножения на нее координаты Z всех точек становятся = 0, но длины сторон те же. Использовать QMatrix4x4 (и любые др Qt классы) можно, без всяких ограничений

Код:
   0.970676  -0.240318 -0.00594735  0.258948         
   0.240287   0.969228   0.0534803  -2.32853         
-0.00708795 -0.0533411    0.998551  -43.4769         
          0          0           0         1


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Февраль 09, 2018, 09:35
Цитировать
(закраска тр-ка). Неужели и это студентам не дается  ??? Безобразие!
Нет, раскрашивание треугольников и пр. обычно на уроках ИЗО даётся, в начальных классах  :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 09, 2018, 12:50
Код:
   0.970676  -0.240318 -0.00594735  0.258948         
   0.240287   0.969228   0.0534803  -2.32853         
-0.00708795 -0.0533411    0.998551  -43.4769         
          0          0           0         1
Нет, раскрашивание треугольников и пр. обычно на уроках ИЗО даётся, в начальных классах  :)
Значица так и запишем: оба научных работника от ответов уклонились, намекая, дескать, для них это очевидно и неинтересно. Не могу с ними согласиться - задачки хоть и простые, но интересные и полезные. И вообще - зачем человека пичкать "тензорным анализом" если не умеет тр-к закрасить?

Здесь по меньшей мере 3 решения

1) Можно домучить матрицу поворота, пусть это безумно нерационально
2) Можно чисто на уровне "учи матчасть", есть в QMatrix4x4 метод для построения такой матрицы.
3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко


Название: Re: Геометрия (задачки)
Отправлено: ViTech от Февраль 09, 2018, 14:10
1) Можно домучить матрицу поворота, пусть это безумно нерационально
Т.е. без QMatrix4x4 задача рационально не решается? :)

2) Можно чисто на уровне "учи матчасть", есть в QMatrix4x4 метод для построения такой матрицы.
Проучите научных сотрудников конкретным кодом.

3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко
Это уже классика: 1. Рисуем кружочки. 2. Рисуем остаток совы.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 10, 2018, 16:29
3) Просто записать содержимое матрицы, с помощью QMatrix4x4::setColumn это не так уж громоздко
Это уже классика: 1. Рисуем кружочки. 2. Рисуем остаток совы.
Как ни странно, это часто правда. Если идея/смысл понятны, то реализация (аттач) не очень интересна. Однако объяснить идею (т.е. почему так происходит) не так уж просто. Ладно, попробую, см картинку

Жила-была точка "a" на плоскости, как полагается, имела координаты a.x и a.y. Теперь кто-то взял и повернул оси координат, вместо обычных X и Y они вот стали axisX и axisY, причем их напр-я известны в начальных. При этом точка  "a" осталась на месте - какими будут ее координаты для новых осей?  Очевидно это скалярные произведения исходных a.x и a.y на напр-я новых осей, т.е.

a.x_new = a.x * axisX.x + a.y * axisX.y;   // проекция "a" на axisX   
a.y_new = a.x * axisY.x + a.y * axisY.y;   // проекция "a" на axisY

Записав это в матричном виде мы обнаруживаем что матрица... это просто-напросто новые оси записанные по строкам! Рассуждения для 3 осей (x, y, z) совершенно аналогичны

Вернемся к задачке 27. Имея планарный тр-к мы легко можем построить тройку единичных взаимо-перпендикулярных осей и вписать их в матрицу - готово! Эту тройку можно выбирать всяко-разно, нужно лишь чтобы ось Z была нормалью к тр-ку, т.к требуется Z= 0 для точек в плоскости тр-ка. А оси X и Y могут боптаться как угодно, лишь бы были перпендикулярны.

Ну вот и все? Нет - есть еще мелкая пакость смещение, ведь центр новой СК необязательно в (0, 0, 0). Конечно можно назначить его напр в точке A отняв ее от всех точек ABC, но хотелось бы чисто, одной матрицей. Но чего это я тут "разумничался"?  Есть люди с академическим образованием (куда там моему политеху), вот им и карты в руки..


Название: Re: Геометрия (задачки)
Отправлено: Igors от Февраль 12, 2018, 08:00
Затихли товарищи.. Ну наверное думают, анализируют. Хорошее дело, а пока разберем вариант с матрицей вращения

Есть тр-к, повернем его с помощью QMatrix4x4::rotate так чтобы он "лег" в плоскость XOY. Дело сводится к довороту одного вектора (нормали к тр-ку) до второго (0, 0, 1).
Код
C++ (Qt)
QMatrix4x4 GetTransform2D( const QVector3D & a, const QVector3D & b, const QVector3D & c )
{
// находим ось поворота
QVector3D normal = QVector3D::normal(a, b, c);
QVector3D axis = QVector3D::crossProduct(normal, QVector3D(0, 0, 1));
 
// находим угол поворота
// cos(angle) = dot(normal, QVector3D(0, 0, 1)) = normal.z
float angle = acos(normal.z) * 180 / M_PI;
 
// получаем матрицу поворота
QMatrix4x4 M;
M.rotate(angle, axis);
 
// учтем смещение
M.translate(-a);
 
return M;
}
Это решение проигрывает предыдущему по всем статьям, но тем не менее оно тоже корректно


Название: Re: Геометрия (задачки)
Отправлено: deMax от Февраль 12, 2018, 08:27
Если бы нужно было только треугольник построить, то достаточно найти длину трех сторон и построить этот треугольник на плоскости. (самый быстрый способ для нахождения треугольника и для восстановления треугольника достаточно хранить 3 стороны, а не 3 вектора и матрицу)
А вот для нахождения матрицы придется решать систему уравнений.


Название: Re: Геометрия (задачки)
Отправлено: ViTech от Февраль 12, 2018, 12:04
Жила-была точка "a" на плоскости, как полагается, имела координаты a.x и a.y. Теперь кто-то взял и повернул оси координат, вместо обычных X и Y они вот стали axisX и axisY, причем их напр-я известны в начальных.
...

Чем этот подход отличается от того, что предложил (http://www.prog.org.ru/index.php?topic=27072.msg235440#msg235440) m_ax?

Код
C++ (Qt)
// build 3 normalized axes
QVector3D axisZ = QVector3D::normal(a, b, c);
QVector3D axisX = (b - a).normalized();
QVector3D axisY = QVector3D::crossProduct(axisZ, axisX);
 
// save the axes into matrix
QMatrix4x4 M;
M.setRow(0, axisX);
M.setRow(1, axisY);
M.setRow(2, axisZ);

Сформировали Вы матрицу поворота одним из способов, исходя из своих соображений, и ... хорошо :).


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 17, 2018, 10:10
Извиняюсь за задержку, почему-то(?) не увидел Ваших ответов, обнаружил их только когда хотел запостить новую задачку.

А вот для нахождения матрицы придется решать систему уравнений.
Нет, матрица выписывается напрямую, и даже есть готовый метод для этого  :)

Чем этот подход отличается от того, что предложил (http://www.prog.org.ru/index.php?topic=27072.msg235440#msg235440) m_ax?
См нижнюю матрицу - это поворот вокруг одной из координатных осей, а для производного тр-ка и ось поворота произвольна. Возможно m_ax уточняет это в своем ЗЫ, но с таким наукообразным стилем изложения понять мудрено.

Сформировали Вы матрицу поворота одним из способов, исходя из своих соображений, и ... хорошо :).
Так я ж смещение оставил на закуску!
есть еще мелкая пакость смещение, ведь центр новой СК необязательно в (0, 0, 0). Конечно можно назначить его напр в точке A отняв ее от всех точек ABC, но хотелось бы чисто, одной матрицей.
Ну что, покажем как это делается - или опять отмолчимся до оглашения ответа, а потом будем иронизировать?  :)

Update: хотя эту задачку и можно свести к "матрице поворота" - такой подход, на мой взгляд, неверен. Рассматривать ее как "построение СК" гораздо лучше - и для понимания, и для реализации


Название: Re: Геометрия (задачки)
Отправлено: Igors от Март 20, 2018, 11:17
Ладно, поехали дальше

28) Нарисовать (т.е. "визуализировать") QMatrix4x4. А то табличка чисел (что выдает qDebug()) мало информативна


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 23, 2018, 09:30
28) Нарисовать (т.е. "визуализировать") QMatrix4x4.
И глухо (как в танке) :). А ведь визуальное изображение матриц каждый видел сотни раз (если не больше). Да-да, это просто тройка осей обычно рисуемая RGB цветами (аттач).

Вернемся к предыдущей задаче. Не надо там ничего "поворачивать", решать "системы уравнений" и.т.п. Просто представить картинку, вот же она, матрица, "живьем". Это локальная СК (система координат) с центром в точке A. Синяя ось Z - нормаль к тр-ку. Красная ось X - любой вектор в плоскости тр-ка, хотя бы AB, Зеленую Y вычисляем из Z и X. Если мы множим точку на эту матрицу, то мы переводим ее в локальную СК, а в ней все что лежит в плоскости тр-ка имеет z = 0, что и требовалось. Вписываем эти оси в строки матрицы (column-mаjor) - и вся любовь. Др словами если мы матрицу "видим", то можем ее просто "записать". Это самый простой (и самый лучший) способ создания матрицы, поэтому такой вызов есть в любом API.

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

А вот где взять центр? Последний столбец матрицы работать не будет, самой точки A в матрице нет. Опять "прильнем к основам". Нам нужна точка которая в локальной СК имеет координаты (0, 0. 0). Значит помножим ее на обратную и получим точку A (центр в исходной СК)
Код
C++ (Qt)
QVector3D center = matrix.inverted() * QVector3D();

Возможно все это кажется ну очень простым, "элементарным" и.т.п.  Это не совсем так, такая простота обманчива  :)


Название: Re: Геометрия (задачки)
Отправлено: Авварон от Май 22, 2018, 16:59
И глухо (как в танке) :). А ведь визуальное изображение матриц каждый видел сотни раз (если не больше). Да-да, это просто тройка осей обычно рисуемая RGB цветами (аттач).

Я туповат... А почему тройка, а не 4ка? Верно я понимаю, что строки - это вектора - 3 координаты + длина? Или нет?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 23, 2018, 09:32
А почему тройка, а не 4ка?
Потому что в 3D пр-ве 3 оси. Последняя строка - не ось, это дополнение необходимое для некоторых операций (напр транспонирование - поменять местами строки/столбцы). Обычно она (0, 0, 0, 1)

Верно я понимаю, что строки - это вектора - 3 координаты + длина? Или нет?
Не совсем, длина явно не хранится. Если мы хотим вытянуть объект напр по X, то первые 3 числа множим на масштаб, т.е. красный вектор станет больше/меньше. А в последнем столбце - смещение, т.е. центр тройки. Причем в локальной СК (а не в исходной). Напр если мы хотим нарисовать ту же картинку, но с красной осью длиннее - в матрице должно сидеть уже др смещение (хотя на рисунке центр останется там же).

Ну и не стоит "слишком твердо" запоминать "строки". Красный вектор - это то на что множится (скалярно) исходная точка/координата и получается локальный X. QMatrix4x4 следует column-major соглашению, для него умножение точки на матрицу (перевод в локальную СК) определено как
Код
C++ (Qt)
local_point = matrix * source_point
Т.е. строка матрицы множится на столбец исходной точки, поэтому вектора на картинке - строки. Но при др соглашении это уже не так.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 28, 2018, 13:53
Еще матрицы? (они так милы). Вот задачка чуть-чуть сложнее предыдущей

29) Жил-был треугольник ABC, и юзер его как-то крутил и двигал много раз. В результате известны только 3 конечные точки (A2, B2, C2). Для простоты полагаем что длины сторон остались теми же.

Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)



Название: Re: Геометрия (задачки)
Отправлено: deMax от Май 28, 2018, 16:14
Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)
берем матрицу сдвига, чтобы А стал в центре системы координат,
потом вращаем чтобы AB стал A2 B2 (QQuaternion::rotationTo(AB, A2B2) -> получаем угол -> матрица поворота).
потом аналогично QQuaternion::rotationTo(AC', A2C2) -> еще матрица поворота.
и потом двигаем точку A в координаты A2
перемножаем матрицы, профит!

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


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 29, 2018, 04:29
берем матрицу сдвига, чтобы А стал в центре системы координат,
потом вращаем чтобы AB стал A2 B2 (QQuaternion::rotationTo(AB, A2B2) -> получаем угол -> матрица поворота).
потом аналогично QQuaternion::rotationTo(AC', A2C2) -> еще матрица поворота.
и потом двигаем точку A в координаты A2
перемножаем матрицы, профит!
Да, и здесь можно действовать через повороты, но их уже 2 и выходит совсем коряво. Зачем? Есть же красивое решение в 1 строку.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 30, 2018, 08:25
Есть детская книжка, про хоббитов. Называется "Туда и обратно".  Здесь этот прием в чистом виде, причем выше подробно разжевали как "туда". Ну это я уже изо всех сил подсказываю  :)

Возможно некоторые ребята думают что нужно чего-то там "почитать", знать какую-то "фишку", "открыть книги" и.т.п. Ничего подобного, нужно только понять как работает СК матрица - и все.

 


Название: Re: Геометрия (задачки)
Отправлено: Old от Май 30, 2018, 08:57
Возможно некоторые ребята думают что нужно чего-то там "почитать", знать какую-то "фишку", "открыть книги" и.т.п. Ничего подобного, нужно только понять как работает СК матрица - и все.
А это понимание приходит во сне, если позвонить на короткий номер...? :)
Или книгу все таки открыть придется?

P.S. Как все таки жалко выглядят потуги оправдать свою безграмотность. И главное вся "гениальность" проявляется в одной узенькой области, которую чудом удалось освоить по книгам. :(


Название: Re: Геометрия (задачки)
Отправлено: deMax от Май 30, 2018, 09:02
предположу, засунуть координаты треугольника в матрицу 3х3. тогда M1 * Mтрансформации = M2. 
;D Mтрансформации = M2 / M1

Только для перемножения матриц придется размер до 4ей наростить, ну и не деление а умножение на обратную матрицу.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Май 30, 2018, 10:42
предположу, засунуть координаты треугольника в матрицу 3х3. тогда M1 * Mтрансформации = M2. 
;D Mтрансформации = M2 / M1

Только для перемножения матриц придется размер до 4ей наростить, ну и не деление а умножение на обратную матрицу.
А можно внятнее? Как "засунуть тр-к в матрицу"? И какой засовывать (их здесь 2)?

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

- мы строим матрицу для перевода в локальную СК тр-ка. Правила перевода мы выбираем таким образом чтобы все точки в плоскости тр-ка имели z = 0 в локальной СК.

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


Название: Re: Геометрия (задачки)
Отправлено: Igors от Июнь 05, 2018, 10:57
Ну вот.. и парнишка затих (из второго батальона). Не вышло на готовых классах - и усе. Ладно, попробуем чуть иначе
Цитировать
Жил-был треугольник ABC, и юзер его как-то крутил и двигал много раз. В результате известны только 3 конечные точки (A2, B2, C2). Для простоты полагаем что длины сторон остались теми же.

Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)
Вот эта "неизменность длин" фактически означает: в локальной СК все точки (local_A, local_B, local_C) будут получаться одни т те же для разных тр-ков т.е.

- исходные тр-ки имеют разные точки, напр (A, B, C) и (A2, B2, C2)
- соответственно и матрицы перевода в локальные СК разные
- а вот после умножения на матрицы
local_A, = local_A2
local_B = local_B2
local_C = local_C2

В какой же вумной книге я это прочитал? Та ни в какой :) Представим наблюдателя в точке A тр-ка - он смотрит на точку B (или С). Пусть тр-к несется с огромной скоростью и вращается в космосе подобно планете Земля. Но для наблюдателя точка B где была - там и осталась, сам-то тр-к никто не вытягивал и не сжимал.

Да, но это "художественное" объяснение, а в геометрии все положено доказывать. Хорошо, давайте так. Ось малюнок (аттач). Точку A(A2) мы выбирали центром локальной СК, там ее координаты (0, 0, 0). по-любому одинаковы. Локальную ось X мы вычислили как нормированный вектор стороны AB, стало быть  local_X(X2) = ((B - A).length(), 0, 0) - тоже одинаковы, ведь длина AB у тр-ков одинакова. С точкой С(C2)  чуть сложнее, ее координаты - проекции на локальные оси. Но поскольку угол A у тр-ков тот же самый (и длина AB та же) - то и проекции те же

Значит, что получается? Из (A, B. C) в локаль - имеем матрицу. Из (A2, B2. C2) в локаль - тоже имеем. И в локали одно и то же... Ну и..... 




Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 19, 2018, 12:38
30) Обратная задачка - вот есть чайник и матрица его (аттач). Что делает эта матрица?

Ну ясно, матрица - формальный аппарат, может использоваться для чего угодно. Но мы рассматриваем лишь самый простой (и самый популярный) случай - перевод из одной СК в другую. Поэтому вопрос можно ставить и так: из какой СК в какую эта матрица переводит? Или: какие координаты должны на нее умножаться и какие ожидаются после умножения?


Название: Re: Геометрия (задачки)
Отправлено: kambala от Сентябрь 21, 2018, 10:03
это задача для первокурсников на понимание матрицы перехода между базисами? :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 21, 2018, 15:25
это задача для первокурсников на понимание матрицы перехода между базисами? :)
Базис - это "как направлены оси мировой СК" причем формулируется это словами. Напр
Цитировать
ось X идет слева направо, Y - снизу вверх и Z - на нас
пожалуй самый популярный, но возможны и другие. Напр AutoDesk направляет вверх Z - и отлично себя чувствует. Часто просто предъяаляют рисунок - но это же не значит что нарисованные оси - обязательно базис :) Здесь просто визуализированы оси матрицы, что Вы можете о ней сказать?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Сентябрь 26, 2018, 04:59
Используем базовые знания/понятия. Мы знаем что умножение точки/координаты на матрицу СК сводится к проецированию на записанные в ней оси, Здесь эти оси нарисованы - ну так проецируем. Возьмем точку A на носике чайника и опустим из нее перпендикуляр на красную ось (X). Длина (знаковая) красного отрезка от упавшей точки до пересечения осей и есть новая координата X что получается в рез-те умножения на матрицу. Точно так же спроецируем точку A на зеленую и синюю оси, получим новые Y и Z. Вот они, "суть косинусы" (так сейчас учат в ВУЗе). Попробуем сделать то же самое для чайника на картинке предыдущего поста. Для точки A получим те хе самые X>0, Y>0, Z = 0. Точка пересечения осей всегда будет иметь координаты (0, 0, 0) после умножения.

Отсюда вывод - мы видим локальную СК чайника, эта матрица переводит в... локальную СК (да, масло масляное :)) где точки (вертексы) остаются неизменными как бы чайник ни крутили и как бы ни облетали камерой.

Примечание: хотя термин "локальная СК" вполне корректен, чаще говорят "модельные координаты", а то и просто "в модель". При этом часто имеется ввиду что это те самые координаты что записаны в файле модели, напр в .obj файле, хотя это и не всегда так.

Ну вот, с "куда" ясно, осталось разобраться с "откуда". Или: какие координаты должны множиться на эту матрицу?

А чтобы лучше понять/прочувствовать полезно поиграть в "почемучку", позадавать самому себе вопросы, пусть они и звучат наивно. Ну например
Цитировать
А чего это "X = длине красного отрезка"? Разве точка пересечения осей нулевая в исходной СК ?
Или
Цитировать
А откуда взялась эта "локальная СК"? Почему у нее центр на донышке чайника, а не, скажем, в его центре или на крышке или еще где? "Кто так сказал?" :)
или совсем уж глуповатый(?) вопрос
Цитировать
А откуда я возьму "точку A на носике", т.е. 3 конкретных x, y, z ?


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 20, 2018, 15:38
31) Дано то же что и в предыдущей задачке: объект и его матрица (QMatrix4x4). Нужно написать простенький драг: юзер может (интерактивно) двигать объект вдоль одной из осей. Напр тыкнул он на синюю ось и тащит, а мы пересчитываем матрицу так чтобы объект "скользил" вдоль этой оси как по рельсу.

Как решать - дело вкуса, я бы разбил на 2 подзадачки:

a) получить нужное смещение (QVector3D), а то с мыши мы имеем только пыксели
b) как-то присобачить это смещение к матрице, ну ясно что просто вызовом translate здесь не отделаться


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 18, 2019, 16:09
Поехали дальше, потренируемся  в алгебре

32) Даны 2 прямые в пр-ве, каждая задана точкой (p) и направлением (dir), пусть нормированным. Требуется

a) Определить что прямые
   a1) параллельны
   a2) пересекаются
   a3) скрещиваются

b) Найти минимальное расстояние между прямыми

с) Найти точки минимального отрезка (напр A и B) соединяющего эти прямые.

Возможная ностальгия
Цитировать
Ах, вот когда я был студентом, я так эти задачки щелкал! А сейчас... ничего уже не помню! и.т.п.
А помнить ничего и не надо, весь инструментарий есть в любом классе "вектор", напр QVector3D.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 21, 2020, 12:46
Да, с математикой совсем мрачно. Ну ладно, попробуем так

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

Насколько трудна была задача снайпера? Какую поправку он должен был сделать? Параметры, напр толщина и число стекол придумайте сами, просто чтобы были разумные


Название: Re: Геометрия (задачки)
Отправлено: tux от Ноябрь 21, 2020, 12:56
т.к. он стрелял через стеклопакет и должен был это учесть.
Эта задача корректного решение не имеет. В случае одного выстрела. Причём тут мало учитывания преломления, нужно ещё брать во внимание, что стеклопакет - это несколько стёкол. Пуля, при пробивании пакета, наверняка сместится.
В реальности, если снайпер всё-таки высокого класса и хочет ушатать жертву, то он будет стрелять 2 раза с короткими интервалами. Первая пуля пробъёт стеклопакет, вторая - ушатает жертву.


Название: Re: Геометрия (задачки)
Отправлено: Old от Ноябрь 21, 2020, 12:58
В реальности, если снайпер всё-таки высокого класса и хочет ушатать жертву, то он будет стрелять 2 раза с короткими интервалами. Первая пуля пробъёт стеклопакет, вторая - ушатает жертву.
Один раз он будет стрелать, когда жертва выйдет на открытое место. :)
Не один профи не будет так рисковать, вдруг стекла пуленепробиваемые. :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 21, 2020, 13:57
Эта задача корректного решение не имеет. В случае одного выстрела. Причём тут мало ...
Довольно типичная реакция которую я называю "лапки кверху". Мол, это настолько сложно что нечего и пытаться, даже не дергайся. Справедливости ради заметим что основания для этого имеются - увы, обращение к "фундаментальной" обычно ничем хорошим не кончается, научные работники охотно тычут в нос интегралы и дифуры (мутить воду они мастера).

Но для всех задачек в этой теме это не так. А здесь расчет преломлений очень прост, можно даже в уме посчитать, без бумажки. Главное преодолеть барьер "это так сложно" :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 21, 2020, 14:21
Цитировать
Но для всех задачек в этой теме это не так. А здесь расчет преломлений очень прост, можно даже в уме посчитать, без бумажки. Главное преодолеть барьер "это так сложно"  ;)
Ну дык берите Monte Carlo (за основу), и вперёд и с песней.. Если качественно что-то оценить - неплохой метод.
Да, есть исключения, но они весьма специфические (типа Грассмановские переменные)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 21, 2020, 14:32
Ну дык берите Monte Carlo (за основу), и вперёд и с песней.. Если качественно что-то оценить - неплохой метод.
Да, есть исключения, но они весьма специфические (типа Грассмановские переменные)
Вот живое подтверждение моих слов выше. Вместо того чтобы ободрить человека (у которого моск и так покалечен "собирать"), Вы напротив, сразу стремитесь его запугать незнакомыми ему вумными словами. Ну какой нафиг здесь Monte Carlo? Какой Грассман? Тут одно арифметическое действие - и все  :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Ноябрь 21, 2020, 14:47
Ой, если человеку нужно, или он в этом вопросе заинтересован - то он в этом разберётся!
Это совершенно нормально!
Я лишь высказываю различные подходы//т. зрения, что тоже нормально!
Представьте себе - так устроен прогресс И жизнь.


Название: Re: Геометрия (задачки)
Отправлено: tux от Ноябрь 21, 2020, 20:04
Довольно типичная реакция которую я называю "лапки кверху".
А вы попробуйте решить. Там проблема ведь не в коэффициентах преломления (которые, как раз посчитать не сложно).
Кстати, если уж совсем заморачиваться - простая школьная задача о двух трубах м бассейне не такая уж и простая. Хотя, в идеальных условиях вполне себе решается. В учебнике. :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 22, 2020, 13:32
Кстати, если уж совсем заморачиваться - простая школьная задача о двух трубах м бассейне не такая уж и простая. Хотя, в идеальных условиях вполне себе решается. В учебнике. :)
Да, там красивая заморочка - ведь вода вытекает с разной скоростью под разным давлением

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

Поэтому давайте решать вместе. Разумеется вооружимся знаниями, возьмем хотя бы викусю (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). Формула там есть, причем до боли простая, и ей уже 400 лет, искать какую-то другую - ну не видно смысла. Итак, мы "прошли по ссылке", и, стало быть, решение у нас в кармане? Так какую поправку должен сделать снайпер?

Ой, если человеку нужно, или он в этом вопросе заинтересован - то он в этом разберётся!
Ой ли? А если "точка невозврата" уже давно пройдена (с помощью <T>), и остается только делать вид, что, мол, "не заинтересован"? :)


Название: Re: Геометрия (задачки)
Отправлено: Old от Ноябрь 22, 2020, 14:02
Ой ли? А если "точка невозврата" уже давно пройдена (с помощью <T>), и остается только делать вид, что, мол, "не заинтересован"? :)
Да конечно не сможет. Человек, разобравшийся в такой эпохальной теме как шаблоны C++, уже больше не в чем разобраться не сможет. Это уже потерянный человек для программирования, да что там, вообще для любой другой деятельности.
А вот человек, который умеет только финдреплейсики делать, он легко с такими вопросами разбирается. Потому что это его максимум, а если ему нужно что-то посложней, то он сразу ищет его у первых. Как это было с попытками выдергиванием подсистем из Unity. :)



Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 23, 2020, 13:32
Вот картинка из вики (первый аттач). Не то чтобы она "неверная", но для нашей задачи не подходит. Вот если бы мы смотрели на поверхность воды и видели сквозь воду дно - тогда все так. Но со стеклопакетом дело иначе - там  стекла имеют лишь небольшую толщину, а главное - заднюю стенку которая тоже преломляет. Это хорошо показано на второй картинке (наше образование не так уж плохо)

Да, ну и что мне с тех картинок? Где "готовое проверенное" решение? Та здесь оно, здесь. Нужно лишь применить теорему Пифагора. Если в уме не выходит - не беда, нужно нарисовать чертеж на бумаге, и побольше, и аккуратно, под линеечку. Расставить на чертеже точки, расписать формулки. Все прекрасно получится, и это гораздо лучше и полезнее чем лазание по всяким тьюбам и видео-тьюториалам


Название: Re: Геометрия (задачки)
Отправлено: tux от Ноябрь 23, 2020, 14:55
А вы уверены, что стёкла в стеклопакете одинаковые? Как по составу, так и по толщине. Ну и за газ в самом стеклопакете не забудьте. У него ведь тоже есть состав и температура.
Ну и сама пуля ведь тоже деформируется и изменит направление на границе сред.
Тогда уж лучше целеуказателем воспользоваться. Или сразу - Barrett M82A1. :)
Может лучше какие нибудь другие интересные задачи по геометрии есть? В рамках темы.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 25, 2020, 12:39
А вы уверены, что стёкла в стеклопакете одинаковые? Как по составу, так и по толщине. Ну и за газ в самом стеклопакете не забудьте. У него ведь тоже есть состав и температура.
Ну и сама пуля ведь тоже деформируется и изменит направление на границе сред.
Сколько аргументов, и зачем? Только для того чтобы доказать что это "слишком сложно", не решается вообще, и, стало быть, "я этого делать НЕ БУДУ" :) Может лучше направить усилия на то чтобы сделать, ведь здесь это намного проще :)

Возьмем параметры с хорошим "запасом", посчитаем и оценим рез-т, может никакой поправки и не требуется, нам просто фуфло парят. Ну напр

- Стеклопакет имеет 2 стекла толщиной 1 cм (10 мм) каждое (вряд ли в жизни будет толще). Коэффициент преломления сткела, ну пусть 2.0 (хотя это уже драгоценный камень, у стекла меньше). Насколько пуля отклонится от цели?

По ходу дела маленькая под-задачка: между стеклами есть какое-то расстояние, нужно ли его учитывать?


Название: Re: Геометрия (задачки)
Отправлено: tux от Ноябрь 25, 2020, 18:39
По ходу дела маленькая под-задачка: между стеклами есть какое-то расстояние, нужно ли его учитывать?
Конечно.
И я не говорил, что задача не решаемая. Просто, вы тут говорите, за пролёт фотонов, а я  - за пролёт механического объекта. Фотоны вполне можно посчитать. А вот с механикой будет чистая эмпирика.
Хотя, тут этот форум уже можно будет закрывать за подготовку убийства неограниченного круга лиц с использованием стрекового оружия. :)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 26, 2020, 10:21
По ходу дела маленькая под-задачка: между стеклами есть какое-то расстояние, нужно ли его учитывать?
Конечно.
Обоснуйте

И я не говорил, что задача не решаемая. Просто, вы тут говорите, за пролёт фотонов, а я  - за пролёт механического объекта. Фотоны вполне можно посчитать. А вот с механикой будет чистая эмпирика.
Хорошо, будь по-вашему, "считаем фотоны", т.е. только ошибку/поправку связанную с преломлением стекла. Какова она? (ну хотя бы порядок для данных выше)

Там есть еще с десяток факторов влияющих на рез-т? Может быть, но здесь не школа снайперов :), в детективе речь шла только о стеклопакете


Название: Re: Геометрия (задачки)
Отправлено: Igors от Ноябрь 30, 2020, 10:24
Посмотрим еще разок на тот же примитивный школьный чертеж (аттач) и попробуем его "осмыслить"

1. Эффект преломления "view-dependent", т.е. зависит от положения камеры/наблюдателя.  Напр если мы смотрим по нормали к стеклу, то вообще "ничего не происходит", при любых коэффициентах преломления и любой толщине стекла. Ну может стекло поглотит часть света - но это др тема.

2. Стекло "сдвигает" видимое изображение, хорошо видно что напр-е луча не меняется, то же выходит и по формуле Снеллиуса если применить ее дважды. Очевидно что чем толще стекло (и чем больше индекс преломления) - тем больше сдвиг. Что будет в случае стеклопакета с 2 и более стеклами? Ну просто первое стекло сместит луч, а потом второе, рез-т  тот же что с одним стеклом суммарной толщины. Расстояние между стеклами не имеет значения.

Правда "вот так все просто" только при одном условии: стекло "прямое", т.е. выходная нормаль строго противоположна выходной. Иначе начнутся дикие пляски (святого Витта). Тогда и расстояние между стеклами имело бы значение, и расстояние от последнего стекла до мишени.
Цитировать
Ну вот, я же говорил! Полного решения нет!
Ну через такое кривое стекло стрелок бы просто не увидел "нормальной" мишени :)

Итак, надо всего лишь рассчитать сдвиг что вносит стекло. Для этого нужно нарисовать чертеж получше, и решение станет очевидным. Конечно возможен и др путь: гуглить до посинения пока не наткнемся на "совсем уж готовое". Какими умными и активными становятся люди когда знают "ссилочку" (и какими робкими и застенчивыми без). Все-таки др путь (включить мозг) мне нравится больше.

Да. и такой вопросик: ведь дело явно происходит в 3D (ну там лучи всякие), но это здесь как бь не играет роли, даже векторов нет (не говоря уж об этих противных матрицах). Как же так?


Название: Re: Геометрия (задачки)
Отправлено: deMax от Декабрь 22, 2020, 14:19
Для ровных стёкол сдвиг будет в сторону окна меньше чем толщина стекла, думаю это можно даже не учитывать, глваное чтоб пулю не сильно повело. для кривых стёкол есть лазер или рпг.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Декабрь 22, 2020, 15:39
Для ровных стёкол сдвиг будет в сторону окна меньше чем толщина стекла
Обоснуйте


Название: Re: Геометрия (задачки)
Отправлено: Igors от Январь 27, 2021, 14:16
И опять дальше слов дело не пошло. Ну хорошо, попробуем еще так: нет никаких "задачек" (для малолетних - те решают), а есть конкретный баг который надо пофиксить, и чем быстрее - тем лучше

34) Бьют фасетки на raytrace shadow (аттач)

Прынцып работы такой тени до боли прост: из каждой точки (где считаем тень) выбрасываем луч на источник света. Луч уперся в объект - тень есть, дошел до источника - тени нет. Ну эта инфа так, "для полноты картины"


Название: Re: Геометрия (задачки)
Отправлено: qtkoder777 от Апрель 04, 2021, 23:40
В треугольник вписано 3 квадрата площадями 4,36,9. Найти площадь треугольника. Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.
(https://avatars.mds.yandex.net/get-zen_doc/4055632/pub_6042594b58285736dd07d8d1_60426b4ab8613c1dbb9d07ee/scale_1200)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 05, 2021, 10:13
Бум называть внутренние тр-ки как "нижние", "средние" и "верхний" (он один).
Считаем основание (a) и высоту (h) каждого

Средний Левый: a = 2, h = 4
Средний Правый: a = 3, h = 3

"Нижние" подобны "средним"

Нижний Левый: a = 1, h = 2
Нижний Правый: a = 3, h = 3

Из подобия тр-ков (им пользоваться не запрещено) следует что отношение основание / высота = 1/2 для всех левых и = 1 для всех правых. "Верхний" состоит их 2 тр-ков,  тоже левого и правого с тем же отношением основание / высота. Значит его высота = 4, она делит его основание на 2 и 4

Верхний: a = 6, h = 4

Основание красного: 1 + 2 + 6 + 3 + 3 = 15
Высота красного: 6 + 4 = 10

Итого: S = (15 * 10) / 2 = 75

Возможно есть и более элегантное/короткое решение, поделитесь

Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.
Ну а было бы разрешено, так что?  :)



Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 05, 2021, 10:28
В треугольник вписано 3 квадрата площадями 4,36,9. Найти площадь треугольника. Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.

S = 15 * 10 /2 = 75 )

Ай, опередили уже)


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 05, 2021, 10:35
S = 15 * 10 /2 = 75 )

Ай, опередили уже)
Интересен ход мысли, а не голый ответ "75" :)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 05, 2021, 22:08
S = 15 * 10 /2 = 75 )

Ай, опередили уже)
Интересен ход мысли, а не голый ответ "75" :)
Ой, да ладно..  :) Слишком много букв..)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 05, 2021, 22:54
У меня есть задачка  на теорию игр) Я сам не знаю аналитического  её решения, но всё же..
Есть физ.фак. с его 14 этажами и 6-ю лифтами..
Первый случай: Студенты встречаются в фае (0-вой этаж)
Никто из студентов не знает кому на какой этаж ехать.. (Все лифты останавливаются на каждом этаже по требованию студента..)

Второй случай: лифты распределены  на чётные и не чётные. И студенты знают об этом (т.е. они знают какой лифт останавливается на чётных или на не чётных этажах ).
Вопрос: в каком случае это будет наиболее эффективно?  На сколько эффективно такое разделение лифтов на чётные и не чётные этажи?
  


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 05, 2021, 23:18
Я понимаю, задача не совсем поставлена, но это в духе товарища igors) Так что спрашивайте, томите и беспокойте меня) 


Название: Re: Геометрия (задачки)
Отправлено: qtkoder777 от Апрель 05, 2021, 23:52

Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.
Ну а было бы разрешено, так что?  :)
Можно от обратного пойти. Подобие треугольников применять запрещено.


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 06, 2021, 09:42
Я понимаю, задача не совсем поставлена, но это в духе товарища igors)
Не, ну моим постановкам до Вашей ой далеко (обратное тоже верно  :)).

Нужно "формализоваться", и в данном случае это не такое уж легкое/приятное занятие. Наверно "эффективность" значит "среднее время доставки студента на нужный (ему) этаж", это время и нужно оптимизировать за счет расписания лифтов. Далее, время доставки состоит из напр T1 (время прохода лифта от одного этажа до следующего) и T2 (время останова/выгрузки). Игры с чет/нечет уменьшают T2, очевидно эффект имеется. И конечно неизбежна масса "волевых решений", напр остается только предположить что все этажи одинаково востребованы, если вся толпа ломится на один этаж, то любая оптимизация в минус. Ну и дальше надо сочинять формулу среднего времени доставки.

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

Вообще комбинаторные задачки выглядят интересно, но в моей работе встречаются редко, поэтому не фанат.



Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 06, 2021, 09:48
Можно от обратного пойти. Подобие треугольников применять запрещено.
Ну как-то должен быть "диалог". А то Вам дали 2 ответа (один довольно подробный), а от Вас ничего. Ну и нафиг мне решать еще каким-то способом? :)


Название: Re: Геометрия (задачки)
Отправлено: Авварон от Апрель 06, 2021, 14:29
В треугольник вписано 3 квадрата площадями 4,36,9. Найти площадь треугольника. Запрещено применять тригонометрию и теорему Пифагора, векторную алгебру, аналитическую геометрию.

Ну не очень ясно, мне кажется я все равно пользуюсь подобием.
Можно достроить аналогичный треугольник, скажем, справа, получим параллелограмм.
Дальше можно заметить, что если перекинуть "правый" кусок (треугольник) параллелогамма налево, то получим прямоугольник размера вдвое больше исходного треугольника.
А дальше вопрос, чем можно пользоваться - то есть как вычислить высоту и ширину.
С высотой просто - это 6 + 4 (высота левого большого треугольника).
С шириной хуже - надо понять что правые треугольники равнобедренные, а значит ширина правого куска тоже 3. Слева надо учесть что катеты относятся как 2 к 1 (но это же подобие?) и что ширина левого кусочка - 1.
Итого (6 + 4) * (1 + 2 + 6 + 3 + 3) / 2 = 75

upd: игнорируйте, фигню написал


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 06, 2021, 15:34
Нужно "формализоваться", и в данном случае это не такое уж легкое/приятное занятие. Наверно "эффективность" значит "среднее время доставки студента на нужный (ему) этаж", это время и нужно оптимизировать за счет расписания лифтов. Далее, время доставки состоит из напр T1 (время прохода лифта от одного этажа до следующего) и T2 (время останова/выгрузки). Игры с чет/нечет уменьшают T2, очевидно эффект имеется. И конечно неизбежна масса "волевых решений", напр остается только предположить что все этажи одинаково востребованы, если вся толпа ломится на один этаж, то любая оптимизация в минус. Ну и дальше надо сочинять формулу среднего времени доставки.

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

Вообще комбинаторные задачки выглядят интересно, но в моей работе встречаются редко, поэтому не фанат.


Да, совершенно верно. Если формализовать задачу то она будет звучать примерно так: Есть N студентов в фае. Никто не знает кому на какой этаж нужно. Все этажи равновероятны. Есть время подъёма лифта на этаж t1, есть время "выгрузки" t2 (опыт показывает, что t2 > t1).
Игра начинается: В первом случае N студентов равновероятно расселяются по лифтам. Игра заканчивается, когда последний студент покинет лифт.

Второй случай: Студенты распределяются по лифтам, согласно тому, на чётный или на нечётный этаж им нужно. И опять игра заканчивается, когда последний студент покинет лифт.

После этого считаем суммарное время в первом (T1) и во втором случае (T2).

Цитировать
В то же время "численным моделированием" задача решается прекрасно, и в гораздо большем объеме, напр легко учесть любые "популярности" этажей, число доставляемых и.т.п. Я бы так и делал
Да, у меня в этом семестре как раз курс по мат. моделированию и методам мат. физики) (на плюсах пишем  :))  
Вот я им эту задачку задаю)

Разумеется T2 < T1. Но во сколько? Студенты сходу, не подумав, говорят T1/T2 = 2) Но это очень оптимистический прогноз)  


Название: Re: Геометрия (задачки)
Отправлено: Old от Апрель 06, 2021, 15:44
Студенты распределяются по лифтам, согласно тому, на чётный или на нечётный этаж им нужно.
А случай когда студенту надо на четный этаж, но в этих лифтах нет мест и он садится в лифт, идущий по нечетным этажам, выбрав в качестве целевого этажа "НУЖНЫЙ + 1", а потом спустится на один этаж вниз? :)))))


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 06, 2021, 15:49
Студенты распределяются по лифтам, согласно тому, на чётный или на нечётный этаж им нужно.
А случай когда студенту надо на четный этаж, но в этих лифтах нет мест и он садится в лифт, идущий по нечетным этажам, выбрав в качестве целевого этажа "НУЖНЫЙ + 1", а потом спустится на один этаж вниз? :)))))
Такое очень часто встречается)) Причём, как правило, жмут кнопку на этаж выше, а не ниже) Ну понятно почему - спускаться легче, чем подниматься)
Нет, для качественного рассмотрения мы этим пренебрегаем  :) (Приближение "резиновых" лифтов  :))


Название: Re: Геометрия (задачки)
Отправлено: Igors от Апрель 06, 2021, 16:39
Игра заканчивается, когда последний студент покинет лифт.
Ну привет, так не годится. Хотя бы потому что необходимо учесть время ожидания лифта для подошедших позднее.

В упор не вижу какое отношение это имеет к физике :) Чистой воды симулятор/движок, который кстати не так уж просто сбацать (если на совесть)


Название: Re: Геометрия (задачки)
Отправлено: m_ax от Апрель 06, 2021, 17:26
Цитировать
Ну привет, так не годится. Хотя бы потому что необходимо учесть время ожидания лифта для подошедших позднее.
Нет.. Тут расчёт на то, что бы студенты качественно прочувствовали ситуацию. Мы выкидываем всё лишнее и оставляем только самое определяющее..
Как, казалось бы, таким простым правилом (разделить лифты на чётные и нечётные) можно повысить производительность. Теория игр в действии)

Цитировать
В упор не вижу какое отношение это имеет к физике

А никакого.. Суть этого курса - поделиться различными методами, подходами и т.п., которые в последствии помогут для решения реальных физических проблем.
И потом, не я сижу в министерстве образования) Это сверху приходит: такой курс должен быть и точка.

Но это лишь одна из задач.. Вот сегодня рассматривали проблему синхронизации маятников) https://www.youtube.com/watch?v=HmmYtopGx7Y  (https://www.youtube.com/watch?v=HmmYtopGx7Y)
Лагранжева механика, ODE, и всё такое)  


Название: Re: Геометрия (задачки)
Отправлено: Racheengel от Июнь 22, 2021, 12:15
помогите определиться с бк, выбирал по бонусам - https://betonmobile.kz/mobile-freebets-bonuses (https://betonmobile.kz/mobile-freebets-bonuses)

Сейчас админ подойдёт, баном поможет)