Russian Qt Forum
Ноябрь 22, 2024, 20:11
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Расстояние до поверхности
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Расстояние до поверхности (Прочитано 10149 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Расстояние до поверхности
«
:
Январь 04, 2013, 18:50 »
Добрый день
Поверхность задана полигонами, для простоты все полигоны - треугольники, т.е. по 3 индекса в массиве вершин (вертексов). Считается что модель solid (т.е. тело имеет объем, дыр нет) и корректна (нет самопересечений). Однако модель необязательно выпуклая.
Нужно: для заданной внутренней точки p уметь находить кратчайшее расстояние до поверхности модели с заданной точностью.
Погуглив "деньков несколько" я ничего выдающегося не нашел. Конечно "плохо искал" - всегда возможно, но не видно чего-то "авторитетного" чтобы это было признанным и вошло в MatLab и др. обиход. Вообще на форуме преобладают темы в которых есть "правильный ответ" - но в жизни все намного сложнее, часто неизвестно есть ли такой вообще и хз кто назначил его правильным. Поэтому прошу не стесняться "велосипедить"
Спасибо
Записан
Dancing_on_water
Гость
Re: Расстояние до поверхности
«
Ответ #1 :
Январь 04, 2013, 19:33 »
Невыпуклость модели суровое условие.
Для выпуклой велосипед на пробу следующий: опускаем перпендикуляры на плоскость заданные гранями, проверяем принадлежит ли точка падения грани, из оставшихся выбираем наименьший.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Расстояние до поверхности
«
Ответ #2 :
Январь 04, 2013, 19:48 »
Цитата: Dancing_on_water от Январь 04, 2013, 19:33
Невыпуклость модели суровое условие.
Для выпуклой велосипед на пробу следующий: опускаем перпендикуляры на плоскость заданные гранями, проверяем принадлежит ли точка падения грани, из оставшихся выбираем наименьший.
Я велосипедю "примерно в том же направлении"
Однако "заданные гранями" явно не годится, модель может иметь приличное число полигонов, нужно как-то использовать быстрый спуск по дереву (пока не знаю как). Плюс еще одна противная проблема
------
|
|
|
------------
*(p) |
|
Здесь проекции дадут гораздо бОльшее расстояние
Записан
Dancing_on_water
Гость
Re: Расстояние до поверхности
«
Ответ #3 :
Январь 04, 2013, 19:55 »
Указанный случай это уже не выпуклый многогранник. Посему и сказал, что это суровое условие.
Стоп. У меня была подобная задача, по идее должно пойти многомерное R-дерево!
«
Последнее редактирование: Январь 04, 2013, 19:58 от Dancing_on_water
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Расстояние до поверхности
«
Ответ #4 :
Январь 05, 2013, 13:59 »
Цитата: Dancing_on_water от Январь 04, 2013, 19:55
Стоп. У меня была подобная задача, по идее должно пойти многомерное R-дерево!
Оказывается достаточно знать "волшебное слово" (напр R-tree) - и все, задача решена! Хорошо бы если так, но у меня что-то не получается
Что хранить в таком дереве? Вертексы явно не то, значит полигоны. Хорошо, разбили пр-во на иерархию кубов, каждый знает какие полигоны пересекает. Ну и дальше что?
Я склоняюсь к мысли "попробывать" незатейливый регулярный буфер (точнее 3 буфера по каждой из осей). Каждый просто 2-мерный массив, элемент - пара(ы) float - расстояния по оси где луч протыкает поверхность
Записан
Dancing_on_water
Гость
Re: Расстояние до поверхности
«
Ответ #5 :
Январь 05, 2013, 18:26 »
Цитировать
Хорошо бы если так, но у меня что-то не получается
Помниться кто-то жаловался на разжеванность доки Qt
Разжевываю. В довольно экзотических условиях ближайший вертекс не принадлежит ближайшей грани. Поэтому на первом этапе ищется ближайшая вершина. Задаем какой-то радиус D, с помощью R-дерева выбираем все вершины в кубе с центром в заданной точке и шириной грани D, если вершин много, сокращаем раза в два радиус, и так до тех пор, пока прямой перебор не станет эффективным. После того как нашли ближайший вертекс, проверяем грани, к которым он принадлежит.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Расстояние до поверхности
«
Ответ #6 :
Январь 05, 2013, 19:20 »
Цитата: Dancing_on_water от Январь 05, 2013, 18:26
В довольно экзотических условиях ближайший вертекс не принадлежит ближайшей грани.
Это ситуация самая рядовая. Пример: размер полигона напр 100x100. Точка находится на расстоянии 50 от одного вертекса и еще большем от других. Однако расстояние до полигона (поверхности) может быть сколь угодно малым, напр 0.1.
Цитата: Dancing_on_water от Январь 05, 2013, 18:26
Поэтому на первом этапе ищется ближайшая вершина. Задаем какой-то радиус D, с помощью R-дерева выбираем все вершины в кубе с центром в заданной точке и шириной грани D, если вершин много, сокращаем раза в два радиус, и так до тех пор, пока прямой перебор не станет эффективным. После того как нашли ближайший вертекс, проверяем грани, к которым он принадлежит.
Продолжая пример выше - мы должны искать с D = 50. Возможно сотни и более др вертексов попадут в этот радиус захвата. Что-то Ваш поиск сильно похож на прямой перебор
Записан
Dancing_on_water
Гость
Re: Расстояние до поверхности
«
Ответ #7 :
Январь 07, 2013, 21:16 »
Форум по-ходу подглюкивает, в новых сообщениях он мне не тему не показал.
Цитировать
Это ситуация самая рядовая. Пример: размер полигона напр 100x100. Точка находится на расстоянии 50 от одного вертекса и еще большем от других. Однако расстояние до полигона (поверхности) может быть сколь угодно малым, напр 0.1.
Еще раз, я не говорю о том, что расстояние до ближайшего вертекса = расстоянию до поверхности. Ближайшая вершина не принадлежит ближайшей грани только в случае близкому к самопересечению
Цитировать
Продолжая пример выше - мы должны искать с D = 50. Возможно сотни и более др вертексов попадут в этот радиус захвата. Что-то Ваш поиск сильно похож на прямой перебор
Если до ближайшего вертекса 50 попугаев, то в радиусе 50 попугаев не может быть сотни вертексов, если это не круг и не шар! (Да, срочно вышлите меня косяк употребляемой травы),
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Расстояние до поверхности
«
Ответ #8 :
Январь 08, 2013, 15:03 »
Цитата: Dancing_on_water от Январь 07, 2013, 21:16
я не говорю о том, что расстояние до ближайшего вертекса = расстоянию до поверхности. Ближайшая вершина не принадлежит ближайшей грани только в случае близкому к самопересечению
См аттач. Красный шарик ближе всего к левой стенке, однако ближайший вертекс принадлежит нижней.
Вообще "найти вертекс/точку ближайшую к данной" есть "плохой" поиск, его трудоемкость гораздо хуже пресловутого логарифма, какое бы дерево ни использовалось. Вот если добавить ограничение напр "ближайший на расстоянии не большем R" - тогда да.
Также не следует питать иллюзий что если мы уж нашли ближайший, то перебрать все его полигоны = достаточно быстро, ведь их немного. К сожалению это не всегда так, см. второй аттач. Эта проблема возникает и в др случаях (напр при построении дерева)
Цитата: Dancing_on_water от Январь 07, 2013, 21:16
(Да, срочно вышлите меня косяк употребляемой травы),
Я ценю что Вы предложили свое решение (очень немногие способны на это). Но вот зазнайство лучше все-таки выключить
Записан
ssoft
Гость
Re: Расстояние до поверхности
«
Ответ #9 :
Январь 09, 2013, 11:04 »
Есть библиотеки, специализирующиеся на геометрических вычислениях или ядра CAD систем.
Например,
http://www.cgal.org
или
http://www.opencascade.org/
.
Может там что-то есть полезное.
Записан
xop
Гость
Re: Расстояние до поверхности
«
Ответ #10 :
Январь 09, 2013, 16:09 »
А много поликов? А то может тупо перебором можно, тем более он хорошо параллелится?
Записан
Dancing_on_water
Гость
Re: Расстояние до поверхности
«
Ответ #11 :
Январь 09, 2013, 18:37 »
Цитата: Igors от Январь 08, 2013, 15:03
См аттач. Красный шарик ближе всего к левой стенке, однако ближайший вертекс принадлежит нижней.
По-моему он принадлежит как левой, нижней и задней стенке, не? (если конечно понимаем одно и тоже под вертексом)
Цитировать
Также не следует питать иллюзий что если мы уж нашли ближайший, то перебрать все его полигоны = достаточно быстро, ведь их немного. К сожалению это не всегда так, см. второй аттач. Эта проблема возникает и в др случаях (напр при построении дерева)
Практически у каждого алгоритма есть худший случай, есть лучший и есть среднее. Если у вас доминируют тела вращения, то в условиях задачи так надо и писать. Если же у вас большинство фигур не тела вращения, то предложенная логика вполне работает.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Расстояние до поверхности
«
Ответ #12 :
Январь 10, 2013, 10:07 »
Цитата: xop от Январь 09, 2013, 16:09
А много поликов? А то может тупо перебором можно, тем более он хорошо параллелится?
"поликов" - ну что за босяцкий жаргон?
Ну как пользователь сделает, он задает модель. Ожидается немного, обычно 2-5K, однако кратность вызова очень велика, трассируется по глубине (объему) и для каждой точки сначала надо найти расстояние до края. Конечно есть упрощенные режимы (spherpoid, box) но их возможности ограничены. Аттач показывает что будет без учета расстояния (слева)
Цитата: ssoft от Январь 09, 2013, 11:04
Есть библиотеки, специализирующиеся на геометрических вычислениях или ядра CAD систем.
Например,
http://www.cgal.org
или
http://www.opencascade.org/
.
Может там что-то есть полезное.
Да, есть. Ведь знал же про CGAL но не догадался там посмотреть, спасибо! Есть там такое, откомпилировал пример и прошел по шагам. Дерево (ноды содержат полигоны), начинаем с первого попавшегося, потом подсекаем. К сожалению, это не та скорость что хотелось бы. Ну тоже результат, значит лучшего видимо нет. Придется удовлетвориться проекциями, хотя они и дают значительную ошибку.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...