Найти проекцию вектора на икосаэдр или на его развернутую поверхность - PullRequest
3 голосов
/ 27 января 2011

Рассмотрим сферу с центром в начале координат и вписанный икосаэдр, ориентированный так, что две самые дальние вершины лежат на оси координат Z, а одно из ребер, выходящих из любой из этих вершин, лежит в плоскости XZ. *

Рассмотрим данный вектор x, возникающий в центре сферы. Направление, определяемое этим вектором, пронизывает поверхность икосаэдра в определенной точке.

Существует ли элегантный способ найти проколотый фасет (учитывая, что все фасеты перечислены), а затем найти точку прокола на этом фасете? Эта задача необходима для проецирования точки прокола на плоскую развернутую (развернутую) поверхность икосаэдра.

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Это решение специфично для вашего приложения, где векторы исходят из источника, а икосаэдр центрируется в начале координат.

Определите 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 матричное умножение, чтобы найти барицентрические координаты.

Вы также можете искать пересечение луч-треугольник и читать о барицентрических координатах, но эти решения будут более обобщенными, чем требует эта конкретная задача.

1 голос
/ 28 января 2011

Хорошо, это не совсем мое поле, но никто не ответил, так что я попробую.Вы можете представить икосаэдр в виде 12 вершин - 10 экваториальных вершин, плюс верх и низ (в них нет ничего экваториального, это просто способ классификации для нашей системы координат).

Эти вершины, в свою очередь,может быть представлен в виде сегментов - один конец - начало координат, а другой - вершина.Учитывая это, вы можете получить высоту над экватором.Если вам известна высота вектора (опять же, над экватором), вы можете определить, какой из трех участков икосаэдра пересекает вектор - северный, южный или экваториальный набор.

По вашему вектору вы также можете определить азимут.Если у вас есть соответствующие производные азимуты и высоты от векторов вершин, это довольно простой расчет набора двух граней (и, следовательно, четырех вершин).Вычисляя угловое разделение между данным вектором, каждый сегмент вершины скажет вам, какая из двух граней находится на его поверхности, с меньшей из двух сумм подшипников будет эта грань.

Вот где я застрял... Я не вижу простого способа определить точку пересечения с лицом.Надеюсь, это будет полезно для первой части, по крайней мере.

...