2011-01-27 2 views
3

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

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

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

+0

Не могли бы вы рассказать нам немного о вашей системе координат? Это может сэкономить некоторое время. –

+0

Это декартовой, 3D. Мы можем свободно трансформироваться в любое другое решение, если это удобно. – mbaitoff

ответ

3

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

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

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

+0

Да, это кажется простым способом найти решение, взломав задачу на более мелкие задачи поиска пересечения лучей и треугольников. Я предпочитаю второй способ, когда нам не нужно умножать все матрицы. Я думал в том же направлении, за исключением того, что мне хотелось рассчитать все точечные произведения данного направления против всех вершин, а не vs нормалей, а затем найти три самых больших, которые могли бы выбрать интересующий треугольник. Хотя вы предоставили надежное и надежное решение, меня также интересовал какой-то изящный (если он существует). – mbaitoff

+0

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

1

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

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

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

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

+0

Да, идея широтных «множеств» тоже пришла мне в голову. Однако он будет работать только в том случае, если экваториальный «пояс» будет отображаться по кругу на сфере, а не по набору зубчатых дуг. – mbaitoff

+0

И, к сожалению, широтный подход не сработает - см. Http://en.wikipedia.org/wiki/File:Uniform_tiling_532-t2.png - экваториальные дуги не образуют линию постоянной широты. – mbaitoff

+0

Хм ... так что, похоже, я аппроксимировал икосаэдр как пару полярных конусов, с экваториальным тором ... рядом, но без сигары. –

Смежные вопросы