Проецируйте многогранник в направлении луча, и ваша задача уменьшится до 2D, и найдите, какой треугольник охватывает начало координат. Чтобы проверить один треугольник, подумайте, идет ли данный направленный отрезок (AB) по часовой стрелке или против часовой стрелки относительно начала координат. Это легко определить с помощью простого теста для нескольких продуктов: против часовой стрелки, если A x ( B - A )> 0.
Если все три стороны треугольника имеют одинаковый смысл (по часовой стрелке или против часовой стрелки), тогда треугольник охватывает начало координат, и это то лицо, которое вам нужно.
EDIT:
Поскольку ваш многогранник является оболочкой, он выпуклый, а поскольку он выпуклый, вы можете эффективно обыскивать поверхность. Вы можете пройтись по краям очень простым способом «идти в гору / вниз», чтобы найти две вершины, самые дальние вдоль луча в любом направлении. Затем, после того, как вы спроецируете poyhedron, вы можете начать с этих двух точек и сделать аналогичное восхождение к началу координат. Это будет O (sqrt (n)) .