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