Пересечение луча с отрезком в 3d

Луч и сегмент многоугольника лежат в одной плоскости. Нормальный вектор этой плоскости известен. Мне нужно знать, пересекает ли луч этот отрезок


person Community    schedule 14.11.2020    source источник
comment
Привет, CPPser, не могли бы вы предоставить дополнительную информацию? Сегмент определяется как часть линии? или часть самолета? прояснить отношения. В этом случае может пригодиться изображение в качестве наброска.   -  person schetefan24    schedule 14.11.2020
comment
Привет, это сегмент многоугольника)   -  person    schedule 14.11.2020
comment
Как хранится ваш полигон? У вас есть контейнер (вектор, список и т. д.), содержащий края или углы?   -  person schetefan24    schedule 14.11.2020
comment
возможный способ ее решения — поиск пересечений между ребрами многоугольника и луча. Если он пересекает любое ребро, у вас есть попадание (при условии, что они находятся в одной плоскости, иначе это не работает так просто)   -  person schetefan24    schedule 14.11.2020
comment
Пересечение отрезков в 3д как-то ненадежно. Из-за проблем с округлением они могут не пересекаться, даже если должны математически. Более надежным подходом является определение точек с ближайшим расстоянием. (Если эти сегменты находятся на плоскости, расстояние между этими точками должно быть очень маленьким - просто величина, вызванная проблемами округления.) Другой подход может заключаться в проецировании сегментов в 2d с использованием нормали к плоскости в качестве вектора проекции. Затем вы можете сделать (гораздо более надежный) двумерный перекресток.   -  person Scheff's Cat    schedule 14.11.2020
comment
именно вам нужно учитывать ошибки округления... см. столкновение конуса с коробкой и найдите line closest(line l0,axis a0);, он вернет 2 ближайшие точки между линией и лучом в 3D, поэтому просто вычислите расстояние между ними, и если меньше порога, вы нашли свое пересечение)   -  person Spektre    schedule 15.11.2020


Ответы (1)


Выберите наибольшую составляющую нормали к плоскости и сделайте проекцию на соответствующую плоскость OXY, OXZ или OYZ (в общем случае мы можем использовать любую ненулевую составляющую)

Скажем, Z-компонента самая большая, поэтому сделайте проекцию на плоскость OXY. Эта проекция очень проста - просто используйте компоненты X и Y. Теперь у вас есть довольно простая 2d-задача. (Пример пересечения сегментов линии ).

person MBo    schedule 14.11.2020