|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|
Нахождение точки внутри фигуры (нестандартные решения)09.09.2015, 20:47. Показов 15294. Ответов 20
Метки нет (Все метки)
Всем привет!
Мне нужно узнать принадлежит ли точка данной фигуре, заданной через координаты вершин. Про четное/нечетное пересечение луча из этой точки со сторонами этой фигуры я знаю, но к сожалению для сложных фигур и большого количества точек, это очень медленный способ. Я решил разбить объём на ячейки(для других нужд) и мне пришло в голову, что можно смотреть позицию точки относительно тех сторон, что попали в эту ячейку, тем самым очень сильно уменьшая объём работы. Способ через луч в таком случае представляется проблематичным, так как нужно найти вершины новой фигуры полученной отсечением ячейкой. А вот через нормали сторон, заключенных в этой ячейке, для выпуклой фигуры всё просто, если нормали сторон направленны наружу, а точка находится внутри фигуры, то скалярное произведение для всех нормалей и вектора полученного из этой точки и любой точки соответствующей стороны должен быть меньше 0. А вот можно ли решить подобным образом для не выпуклой фигуры? Какие условия нужно ещё учесть?
0
|
|
| 09.09.2015, 20:47 | |
|
Ответы с готовыми решениями:
20
Программа вычисления местонахождения точки относительно фигуры (лежит ли точка внутри, на контуре или вне фигуры) Нахождение точек внутри фигуры Нахождение кратчайшего расстояния от точки до фигуры |
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 09.09.2015, 21:41 | |
|
Skaarj, Есть такая штука. Берем уравнение общее прямой. Ax+By+C. Так вот, все точки, лежащие на прямой, обращают это выражение в нуль. Лежащие по одну сторону дают один знак, по другую - другой. И для выпуклой фигуры все просто. Берете каждую сторону и ЛЮБУЮ другую вершину. Если знаки при подставлении вашей точки и вершины совпали - все Ок (для всех сторон надо проверять). Это избавляет от суеты с нормалями, хотя и имеет тот же самый смысл.
Для не выпуклых...Можно разбить на выпуклые (триангулировать, например) и работать уже с ними. Хотя не исключено, что есть и более интересные подходы.
0
|
|
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|
| 09.09.2015, 22:09 [ТС] | |
|
Для выпуклых действительно всё просто, а вот в случае не выпуклых придётся, видимо, заниматься триангуляцией(тетраэдризацией в моём случае), чего хотелось бы избежать. Или же придётся смотреть в сторону двоичного разбиения пространства, если геометрия не даст более изящного решения.
0
|
|
| 10.09.2015, 08:11 | ||
|
Вторая оптимизация - внутри полосы..
0
|
||
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||
| 10.09.2015, 11:47 [ТС] | ||
|
Мне пришёл в голову такой алгоритм. Пробегаем по всем полигонам, находящимся в ячейке и проверяем по какую сторону лежит точка, пока не кончатся полигоны или пока скалярное произведение с соответствующей нормалью не даст >=0. Если скалярное произведение неотрицательное возможны три случая. Нарисовал для наглядности 1) Точка лежит внутри не выпуклой фигуры. 2) Точка лежит снаружи не выпуклой фигуры. 3) Точка лежит снаружи выпуклой фигуры. Прямоугольник - исследуемая ячейка, зеленая стрелка нормаль с которой скалярное произведение вектора NO будет >=0, красный отрезок соответственно проверяет на четность/нечетность пересечений. Проверяется это всё тем же способом через четное/нечетное пересечение отрезка сторон фигуры. Причём второй точкой отрезка можно взять, например, середину стороны. По идее после выполнения одного из этих трех условий, можем точно сказать, что точка находится внутри/снаружи фигуры и тем самым прервать дальнейший поиск. Вот алгоритм: Сложность такого алгоритма в самом худшем случае o(2n), в самом лучшем o(n), если ячеек много и n << N(общее количество сторон в фигуре), то должно очень хорошо ускорить. Если сравнивать с методом через пересечение стороны(треугольника) и луча, то ещё неизвестно, что будет быстрее - в случае выпуклых фигур через скалярное произведение итераций будет столько же и они будут быстрее(меньше вычислений). Ну и не надо рассчитывать вершины новой фигуры, а это ещё надо хорошо обдумать как сделать - триангуляция, обход вершин и т.п. И операция эта будет явно не из быстрых, хоть и на предварительной стадии
0
|
||
| 10.09.2015, 12:11 | ||||
Ну поверьте - проскочить здесь не удастся. Никуда Вы не денетесь, придется проверять все полигоны на пути луча. Думаю Вы сами найдете "опровержение" предложенного. Обычно это бывает через неск дней.
0
|
||||
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||
| 10.09.2015, 13:27 [ТС] | ||
|
Ячейки можно рассматривать как некий массив некоторых подмножеств, где переход к элементу происходит всегда за o(1). И очень сильно уменьшает объём проверяемых полигонов. Способ с лучом и пересечением работает же? Здесь то же самое, просто фигура, рассматриваемая в данной ячейке, не факт, что образует замкнутую фигуру. Поэтому проверка на четность/нечетность пересечений не является достаточной, так как не понятно по какую сторону от этой поверхности находится исследуемый "объём", поэтому предварительно рассматривается позиционирование точки относительно полигона. Сделаю и так и через bsp(тут придётся поразбираться), результаты постараюсь привести ![]() зы Кстати, ячейки в которые не попало ни одного полигона можно считать 100% попаданием в объём(или 100% не попаданием), если предварительно их обработать. Что для однородных фигур, очень хорошее подспорье. Например сфера вписанная в куб из 20х20х20 ячеек будет пересекать своим объёмом собой ~4200 ячеек из них ~3000 ячеек будут полностью лежать в ней. То есть всего в ~1200 ячейках из 8000 надо будет искать попадание. В остальных со сложностью o(1) будет известно попадание/непопадание. Ну, конечно, нужна серьёзная предобработка. В случае с деревом сложность всегда будет o(log(n)).
0
|
||
| 10.09.2015, 13:52 | |
|
Внешняя/внутренняя неприменимо, т.к. полигон может находиться в ноде, но не перекрывать искомую точку. Поэтому надо искать пересечение луча с тр-ком, см Moeller-Tumborn и все такое.
Если Вы строите "просто делить кубик" (вместо дерева), то это конечно проще, но возникают серьезеые проблемы с объемом данных. Напр для неск объектов придется делать "кубик для каждого", а если объект рассредоточен.. Словом, рано или поздно все эти проблемы достанут и переделывать придется. Возьмите сразу нормальное BVH/BSP, пока Вы теряете время.
0
|
|
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|||
| 10.09.2015, 15:22 [ТС] | |||
|
0
|
|||
| 10.09.2015, 16:21 | |||
|
Рассмотрение concave полигонов в 3D лишено смысла. Они могут храниться в данных модели (впрочем достаточно редко), но для рендера они обязательно разбиваются на тр-ки. Максимум 4-угольник может рендериться напрямую, но даже это проблематично, большинство raytracer'ов работают только с тр-ками. И не стоит полагаться на корректный "wind order" (так называют порядок вертексов в полигоне) - да, считается хорошим тоном его соблюдать, но он отнюдь не гарантируется.
0
|
|||
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||||
| 10.09.2015, 17:30 [ТС] | ||||
Насчёт порядка подачи вершин..можно конечно устроить упорядочивание на всякий случай, но судя по тому что модели нормально рендерятся c glCullFace(GL_BACK) то нормали полигонов смотрят в нужную сторону.
0
|
||||
| 10.09.2015, 18:04 | |||
|
А вообще запрягайте raytracer, и чем раньше, тем лучше
0
|
|||
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||
| 10.09.2015, 18:27 [ТС] | ||
|
0
|
||
|
4 / 4 / 0
Регистрация: 14.09.2015
Сообщений: 39
|
|
| 14.09.2015, 13:17 | |
|
Думаю, принципиально точный алгоритм не ускорить, но если надо решать эту задачу практически, то можно для фигур иметь "габарит" - для каждой координаты определить интервал занятый фигурой. И соответственно первым шагом проверять попадание в интервал. Как правило, пространство вне фигуры много больше самой фигуры, и практически это ускорит алгоритмы типа рендеринга.
0
|
|
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
||
| 16.09.2015, 10:31 [ТС] | ||
![]() А вот разбиение "габарита" на ячейки поменьше оказалось не такой уж и простой задачей как я задумывал изначально - нахождение вершины полигона в ячейке/интервале является достаточным, но не необходимым условием. Вот тут как раз и помогло двоичное разбиение пространства, а вот самое интересное это проиндексировать листья этого дерева так чтобы его можно было свести к структуре cell[ind_x][ind_y][ind_z] ради чего это всё и замышлялось собственно
0
|
||
|
Модератор
5285 / 4067 / 1391
Регистрация: 30.07.2012
Сообщений: 12,474
|
||
| 16.09.2015, 11:10 | ||
|
1
|
||
| 16.09.2015, 11:20 | ||
|
Поиск определяет какой из 2 кубов (или оба) пересек луч и повторяет это рекурсивно пока не обнаружен "лист" (нод содержащий полигоны а не дочерние кубы). Если оба куба пересечены, то спуск продолжается по первому, а второй помещается на стек. Вот собственно и все в помощь велосипедисту
0
|
||
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|||
| 16.09.2015, 12:50 [ТС] | |||
. Как индексировать куб(параллелепипед), разбитый на множество мелких понятно, а вот как этим индексам куба сопоставить листья моего дерева не совсем понятно. Плюс ко всему прочему дабы чуточку ускорить этот процесс, дерево будет разбиваться не полностью, а пока в узле существует полигон - дальше нету смысла, там либо полное, либо пустое, но однородное пространство(причём в форме параллелепипеда). То есть за пустым узлом дерева может лежать достаточно большое количество таких вот ячеек и всем им надо сопоставить нужный индекс. Но это решаемо
0
|
|||
| 16.09.2015, 13:11 | ||
|
Вот пробежала неделька... Это время вполне достаточно чтобы найти готовый raytracer и разобраться в нем (ничего сложного нет). А может уже и подключить и "закрыть вопрос". Или может потребуется еще неделька - но это "обозримо". Но велосипедист увлечен своей новой интересной идеей.... И так пройдет еще неделька. И еще. А потом как-то пропадает настроение, все осточертело (сломался спортсмен). Ах как часто все это со мной бывало
0
|
||
| 16.09.2015, 13:11 | |
|
Помогаю со студенческими работами здесь
20
Задача на нахождение точки внутри треугольника Поиск решения, нахождение максимума начиная с точки минимума как создавать нестандартные фигуры в делфи? Интересные задачи, нестандартные решения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
||||
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub
Примеры вызова:
# Указанная валюта 'EUR'
floatrates-rub -Code 'EUR'
# Список имеющихся кодов валют
floatrates-rub -Available
function floatrates-rub {
|
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5
Примеры вызова
Get-WeatherRP5rss
с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
|
|
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr
Примеры вызова:
Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
|
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют
function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) {
$url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js'
$data = Invoke-RestMethod -Uri $url
$esc = 27
. . .
|
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений
Всем привет. А вот мой компьютер, переделанный из ноутбука.
Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
|
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
|
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца:
Хочу еще Симбу взять, очень нравится. . .
|