Как рассчитать угол рефлекса для двух векторов в трехмерном пространстве? - PullRequest
1 голос
/ 16 марта 2010

Я хочу вычислить угол между двумя векторами a и b. Предположим, что они в начале. Это можно сделать с помощью

theta = arccos(a . b / |a| * |b|)

Однако arccos дает вам угол в [0, pi], то есть он никогда не даст вам угол больше 180 градусов, что я и хочу. Итак, как вы узнаете, когда векторы прошли отметку 180 градусов? В 2D я бы просто позволил знаку y-компонента на одном из векторов определить, в каком квадранте находится вектор. Но как проще всего это сделать в 3D?

РЕДАКТИРОВАТЬ: Я хотел бы сохранить вопрос в целом, но здесь мы идем. Я программирую это на языке c, и код, который я использую для определения угла, равен theta = acos(dot(a, b)/mag(a)*mag(b)), так как бы вы программно определили ориентацию?

Ответы [ 4 ]

2 голосов
/ 16 марта 2010

Это работает в 2D, потому что у вас есть определенная плоскость, в которой вы определяете вращение.

Если вы хотите сделать это в 3D, такой неявной 2D-плоскости не существует.Вы можете преобразовать свои 3D-координаты в 2D-плоскость, проходящую через все три точки, и выполнить вычисления внутри этой плоскости.

Но, конечно, есть две возможные ориентации плоскости, и это повлияет на то, какие углы будут> 180 или меньше.

1 голос
/ 17 марта 2010

Я придумал следующее решение, которое использует изменение направления перекрестного произведения двух векторов:

  1. Создайте вектор n = a X b и нормализуйте его. Этот вектор нормален к плоскости, натянутой на a и b.

  2. Когда рассчитывается новый угол, сравнивайте его со старой нормалью. В сравнении рассматривайте старые и текущие нормали как точки и вычисляйте расстояние между ними. Если это расстояние равно 2, то нормаль (то есть, перекрестное произведение a X b перевернуло).

Возможно, вы захотите установить порог для расстояния, поскольку расстояние после переворота может быть короче 2, в зависимости от того, как ориентированы векторы a и b и как часто вы обновляете угол.

0 голосов
/ 16 марта 2010

Одно решение, которое вы можете использовать:
Что вам действительно нужно сделать, это создать плоскость, к которой один из векторов находится в одной плоскости.

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

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

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

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

Редактировать: уточнение созданных векторов a X b = p. Это перпендикулярно как a, так и b. Затем выполните одно из следующих действий: a X p или b X p для создания другого вектора, который является нормалью к плоскости, созданной двумя векторами. Выбор вектора зависит от того, для чего вы пытаетесь найти угол.

0 голосов
/ 16 марта 2010

Строго говоря, два трехмерных вектора всегда имеют два угла между ними - один ниже или равен 180, другой больше или равен 180. Арккос дает вам один из них, другой вы можете получить, вычитая из 360. Думайте об этом так: представьте, что две линии пересекаются. У вас там 4 угла - 2 из одного значения, 2 из другого. Какой угол между линиями? Нет единого ответа. Тоже самое. Без каких-либо дополнительных критериев вы не можете теоретически определить, какое из двух значений угла следует принять во внимание.

РЕДАКТИРОВАТЬ: Итак, что вам действительно нужно, это произвольный пример определения ориентации. Вот один: мы смотрим с положительного направления Z. Если плоскость между двумя векторами содержит ось Z, мы смотрим с положительного направления Y. Если плоскость YZ, мы смотрим с положительного направления X. Я подумаю, как выразить это в форме координат, а затем отредактирую снова.

...