Это решение специфично для вашего приложения, где векторы исходят из источника, а икосаэдр центрируется в начале координат.
Определите 20 треугольников, используя 12 вершин икосаэдра.Расположите 3 так, чтобы они находились в направлении против часовой стрелки, если смотреть снаружи икосаэдра.Таким образом, для каждого треугольника у вас будет список из 3 вершин.Для каждого треугольника создайте матрицу 3x3, где столбцы - это вершины треугольника:
[ x1 x2 x3 ]
T = [ y1 y2 y3 ]
[ z1 z2 z3 ]
Вам понадобится обратное значение этой матрицы (поищите SO или google, чтобы получить быстрый обратный 3x3 на языке вашеговыбор).Теперь для каждого вектора вы хотите умножить его на все 20 матриц.Итак, для каждого треугольника вычислите:
B = V * T (обратный)
Если все 3 элемента B положительны (отрицательны?), Это пересекающийся треугольник.
Далее нормализуем B - разделим его на длину, чтобы он имел единичную длину.Это сделает B барицентрическими координатами точки пересечения в этом треугольнике.Вы также можете вычислить фактическую точку пересечения I, умножив барицентрические координаты на исходную матрицу точек:
I = B * T
Это также работает для нахождения 2D координат точки пересечения наразвернутый треугольник.Так что используйте матрицу 2D координат 2x3 вместо T.
Последняя оптимизация.Если вы сложите 3 вершины каждого треугольника, это даст вам нормальный вектор для этого треугольника.Если вы вычислите произведение вектора вашего вектора на каждую из нормалей, то треугольник с наибольшим произведением будет пересечен.Этот факт характерен для правильных многогранников, центрированных в начале координат, при этом рассматриваемые лучи исходят из начала координат.Это быстрее, чем умножение всей матрицы, чтобы определить, какая из них поражена.Вам все равно нужно будет сделать 1 матричное умножение, чтобы найти барицентрические координаты.
Вы также можете искать пересечение луч-треугольник и читать о барицентрических координатах, но эти решения будут более обобщенными, чем требует эта конкретная задача.