Как проверить попадает точка в сложную трехмерную фигуру? Интересует сам алгоритм

darkowlom, хм, действительно, есть такое. Но тут надо действительно разбивать на баунд боксы
и это поможет, а потом уже уточнять
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
24
darkowlom, можешь немного уточнить задачу? тебе мауспик нужен (точка на экране монитора) или точка в трехмерном пространстве? в зависимости от этого нужны различные алгоритмы.
24
тебе мауспик нужен
Трехмерное пространство, у меня даже визуализации нету.
Метод предложенный алекспреем я пока не опробовал,но не будет ли такого бага, когда у сложной фигуры, напрмер человека прикрывшего лицо рукой, точка находится как раз внутри руки, и получается относительно лица и тела она вне фигуры, а результатом проверки должно быть попадание в фигуру, может я ошибаюсь, но по моему точка не будет сразу под всеми полигонами. Интересует проверка цельного объекта не деленного на баунд боксы. Или без деления на них не обойтись? делается для интереса, так что оптимизация нагрузки на систему не важна
29
darkowlom, хм, действительно, есть такое. Но тут надо действительно разбивать на баунд боксы
и это поможет, а потом уже уточнять
Принятый ответ
34
если тебе нужно попадание только в грудь, но не учитывая руки или лицо то делить нужно на баунд боксы. С другой стороны если нужно учитывать точку внутри руки когда она находится "по швам", и на уровне торса, но при этом не учиывать её когда она напротив лица, то стоит проверить модель на bbox и попадание этой точки просто в квадрат модели, а потом уже проверять по полигонам.
28
точка неподвижна?
или она движется по прямой
или она движется по кривой?
допустима ли погрешность?
24
H, я не это имел ввиду, просто по формуле алекса выходит что точка внутри руки у лица не будут учитываться , так они не внутри фигуры. Буду пользоваться баундбоксами значит. Спасибо
9
Оптимизация не важна? ок, есть один драконовский способ )
Строим паралелипипед , чтобы он полностью вмещал модель(можно по самым далеким от центра фигуры точкам).
Затем "пускаем луч" от нашей точки(которая внутри или снаружи) , скажем, в направлении Ох и каждую точку луча(кроме первой) проверяем на нахождение в составе поверхности хотя-бы одного полигона, увелечиваем переменную кол-ва пересечений луча с фигурой . Перебираем точки, пока очередная не окажется вне параллелипипеда .
Если число пересечений четно - снаружи , нечетно - внутри.
Проблема может быть, когда луч скрещивается с поверхностью, а не пронзает её, тогда надо проверять очередную точку и если она не принадлежит той же поверхности, то луч скрещивается и увеличивать переменную не надо.
Совершенно неоптимизированный , но 100% работающий метод.
9
Его можно оптимизировать - вначале сопоставить каждому полигону его самую большую по координате Х точку(из точек, которыми он задается).
А затем при проверке вхождения очередной точки в поверхность полигона перед этим
проверить, меньше ли Х крайней точки дальнего полигона координаты Х точки луча.
Если так, то полигон остался сзади точки по оси Ох и нет нужды вызывать функцию для проверки вхождения в поверхность данного полигона. А лучше вообще его вышвырнуть из коллекции.
26
Можно выпускать с точки луч в сторону центра фигуры. Если количество пересечений будет четное - точка вне фигуры, если нечетное - внутри.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.