Как рассчитать угол между двумя ребрами в многоугольнике в трехмерном пространстве? - PullRequest
0 голосов
/ 25 августа 2011

Я хочу вычислить угол между двумя гранями лица в трехмерном пространстве.

Я подумал, что мог бы использовать решение в этом вопросе: Угол между двумя трехмерными векторами с одинаковым началом в одной плоскости

Однако, когда я пробую его на прямоугольнике со всеми углами 90 градусов, я получаю один угол, который равен 90 градусам, и три, который равен 270.

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

Так как рассчитать угол между двумя ребрами на грани?

Что я пробовал:

def self.full_angle_between( vector1, vector2, normal )
  angle = vector1.angle_between( vector2 )
  direction = normal % ( vector1 * vector2 )
  angle = 360.degrees - angle if direction < 0.0
  angle
end

normal лицо нормальное vector1 и vector2 оба происходят из одной вершины, и каждый указывает на следующую вершину в любом направлении

vector1.angle_between( vector2 ) см. Метод в SketchUp Rubu API: http://code.google.com/apis/sketchup/docs/ourdoc/vector3d.html#angle_between Возвращает угол от 0 до 180 в радианах.

360.degrees возвращает градусы в радианах. Также метод SketchUp API.

Когда я перебираю все вершины в прямоугольнике, я получаю три угла, о которых сообщается как 270 градусов. Почему?

Ответы [ 3 ]

1 голос
/ 25 августа 2011

Я бы сказал, что ваша проблема заключается в этой строке:

direction = normal % ( vector1 * vector2 )

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

Если вы не совсем разбираетесь в векторной математике, вам может не хватать того, что направление вектора, заданное кросс-произведением vector1 * vector2, зависит от порядка операндов , Если вы поменяете их местами, вы получите тот же вектор, указывающий в противоположном направлении.

Поэтому, когда вы выполняете итерации по вершинам прямоугольника, если вы перепутаете «следующую» и «предыдущую» вершины, вы получите фиктивные 270 градусов, которые вы описываете.

0 голосов
/ 18 февраля 2013

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

0 голосов
/ 25 августа 2011

Вы просто выполняете точечное произведение двух векторов.

Это даст вам угол. Для 3d векторов это:

product = (x1 * x2) + (y1 * y2) + (z1 * z2);

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

Вам нужно будет убедиться, что вы каждый раз выбираете правильную пару ребер:

edge1 * edge2
edge2 * edge3
edge3 * edge4
edge4 * edge1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...