оси разделены углами - PullRequest
3 голосов
/ 07 июля 2011

Я пытаюсь сгенерировать несколько осевых векторов из параметров, которые обычно используются для задания кристаллографических элементарных ячеек. Эти параметры состоят из длины трех осей: a, b, c и углов между ними: альфа, бета, гамма. По соглашению альфа - это угол между осями b и c, бета - между a и c, а гамма - между a и b.

Теперь получить векторные представления для первых двух просто. Я могу произвольно установить ось a на ось x, поэтому a_axis = [a, 0,0]. Затем мне нужно повернуть b от a на угол гаммы, чтобы я мог оставаться в плоскости x-y, и b_axis = [b * cos (гамма), b * sin (гамма), 0].

Проблема в третьем векторе. Я не могу придумать хороший чистый способ определить это. Я понял несколько разных интерпретаций, но ни один из них не удался Один представляет, что вокруг осей axis_a и axis_b есть два конуса, размеры которых определяются углами альфа и бета. Пересечение этих конусов создает две линии, одну в положительном направлении z можно использовать как направление для axis_c, длины c.

Кто-нибудь знает, как мне следует определиться с axis_c?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

Угол альфа между двумя векторами u, v известной длины можно найти по их внутреннему (точечному) произведению:

cos (alpha) =/ (|| u || || v ||)

То есть косинус альфа является внутренним произведением двух векторов, деленным на произведение их длин.

Таким образом,z-компонент вашего третьего может иметь любое ненулевое значение.Масштабирование любого или всех векторов осей после правильного определения углов не приведет к изменению углов, поэтому предположим, скажем, Cz = 1.

Теперь первые два вектора также могут быть A = (1, 0,0) и B = (cos (гамма), sin (гамма), 0).Оба имеют длину 1, поэтому при выборе C необходимо выполнить два условия:

cos (alpha) =/ || C ||

cos (бета) =/ || C ||

Теперь у нас есть только два неизвестных, Cx и Cy, для решения которых.Для простоты я буду называть их x и y, то есть C = (x, y, 1).Таким образом:

cos (альфа) = [cos (гамма) * x + sin (гамма) * y] / sqrt (x ^ 2 + y ^ 2 + 1)

cos (бета) = x / (sqrt (x ^ 2 + y ^ 2 + 1)

Разделив первое уравнение на второе (предполагая, что бета не под прямым углом!), мы получим:

cos(альфа) / cos (бета) = cos (гамма) + sin (гамма) * (y / x)

, который представляет собой линейное уравнение для решения отношения r = y / x. Как только вы получите этоподстановка y = rx во втором приведенном выше уравнении и возведение в квадрат дает квадратное уравнение для x:

cos ^ 2 (бета) * ((1 + r ^ 2) x ^ 2 + 1) = x ^ 2

cos ^ 2 (бета) = (1 - cos ^ 2 (бета) * (1 + r ^ 2)) x ^ 2

x ^ 2 = cos ^ 2 (бета)/ [(1 - cos ^ 2 (beta) * (1 + r ^ 2))]

Приведя в квадрат уравнение, мы ввели корень артефакта, соответствующий выбору знака x. Проверьте решения дляx вы получаете из этого во «оригинальном» втором уравнении, чтобы убедиться, что вы получили правильный знак для cos (бета).

Добавлено:

Если бета являетсяПрямой угол, все проще, чем выше. х = 0 дляced, и нам нужно только решить первое уравнение для y:

cos (alpha) = sin (гамма) * y / sqrt (y ^ 2 + 1)

Возведение в квадрат и умножениезнаменатель дает квадратичное значение для y, аналогичное тому, что мы делали раньше.Не забудьте проверить ваш выбор знака для y:

cos ^ 2 (alpha) * (y ^ 2 + 1) = sin ^ 2 (gamma) * y ^ 2

cos ^2 (альфа) = [sin ^ 2 (гамма) - cos ^ 2 (альфа)] * y ^ 2

y ^ 2 = cos ^ 2 (альфа) / [sin ^ 2 (гамма) - cos^ 2 (альфа)]

На самом деле, если один из углов альфа, бета, гамма является прямым углом, лучше всего обозначить эту угловую гамму (между первыми двумя векторами A, B), чтобы упроститьвычисление.

1 голос
/ 07 июля 2011

Вот способ найти все Cx, Cy, Cz (первые два такие же, как в другом ответе), учитывая, что A = (Ax, 0,0), B = (Bx, By, 0),и предполагая, что | C |= 1

1) cos (бета) = AC / (| A || C |) = AxCx / | A |=> Cx = |A|cos(beta)/Ax = cos(beta)

2) cos (alpha) = BC / (| B || C |) = (BxCx + ByCy) / | B |=> Cy = (|B|cos(alpha)-Bx cos(beta))/By

3) Чтобы найти Cz, пусть O будет точкой в ​​(0,0,0), T точкой в ​​(Cx, Cy, Cz), P будет проекцией T на OxyQ - проекция T на Ox.Таким образом, P - это точка в (Cx, Cy, 0), а Q - это точка в (Cx, 0,0).Таким образом, из прямоугольного треугольника OQT получаем

tan (beta) = | QT | / || OQ |= | QT | / Cx

и из правого треугольника TPQ получаем | TP | ^ 2 + | PQ | ^ 2 = | QT | ^ 2.Итак

Cz = |TP| = sqrt(|QT|^2 - |PQ|^2) = sqrt( Cx^2 tan(beta)^2 - Cy^2 )
0 голосов
/ 07 июля 2011

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

Мне лень масштабировать векторы на необходимые суммы, поэтому я предполагаю, что все они нормализованы, чтобы иметь длину 1. ВыМожно сделать несколько простых изменений в расчете для учета различных размеров.Также я буду использовать * для представления точечного произведения.

A = (1, 0, 0)

B = (cos (g), sin (g), 0)

C = (Cx, Cy, Cz)

A * C = cos (бета) // Это просто определение точечного произведения.Я предполагаю, что величины равны 1, поэтому я могу пропустить эту часть, а вы сказали, что бета была углом между A и C.

A * C = Cx // Я сделал это путем умножения каждого соответствующегозначение, а Cy и Cz были проигнорированы, поскольку они умножались на 0

cos (бета) = Cx // Объединяем два предыдущих уравнения

B * C = cos (альфа)

B * C = Cx * cos (г) + Cy * sin (г) = cos (бета) * cos (г) + Cy * sin (г)

(cos (альфа)- cos (бета) * cos (g)) / (sin (g)) = Cy

Если честно, я не уверен, как получить компонент z вектора C, но я ожидал бы этогобыть еще одним относительно легким шагом.Если я смогу это понять, я отредактирую свой пост.

...