Команда which
может быть полезна. человек, который
Возвращает 0, если исполняемый файл найден, 1, если он не найден или не исполняемый:
NAME
which - locate a command
SYNOPSIS
which [-a] filename ...
DESCRIPTION
which returns the pathnames of the files which would be executed in the
current environment, had its arguments been given as commands in a
strictly POSIX-conformant shell. It does this by searching the PATH
for executable files matching the names of the arguments.
OPTIONS
-a print all matching pathnames of each argument
EXIT STATUS
0 if all specified commands are found and executable
1 if one or more specified commands is nonexistent or not exe-
cutable
2 if an invalid option is specified
Приятно то, что он вычисляет если исполняемый файл доступен в той среде, в которой он запущен, - это избавляет от нескольких проблем ...
-Adam
Если у вас есть плоскость, у вас есть вектор нормали и начало координат. Я бы вообще не стал делать никаких «вращений». Вы всего в нескольких векторных операциях от ответа.
Если у вас уже есть функции скрещивания и скалярного произведения, это всего лишь несколько строк кода. Я знаю, что это работает, потому что большинство трехмерных видеоигр, которые я написал, работали именно так.
Уловки:
Как насчет:
Разложите вектор нормали на вектор в плоскости XY и вектор Z. Затем примените поворот вокруг оси Z, чтобы выровнять вектор XY с одной из осей. Затем найдите скалярное произведение нормали с осью Z и поверните вдоль любого из X, Y, с которым вы выровнялись.
Идея состоит в том, чтобы выровнять вектор нормали с Z, и, таким образом, ваша плоскость теперь плоскость XY.
Хотя были и другие интересные ответы, это решение, которое мы нашли, ожидая ответов:
function roti = magic_cosini(n)
b = acos(n(2) / sqrt(n(1)*n(1) + n(2)*n(2)));
bwinkel = b * 360 / 2 / pi;
if (n(1) >= 0)
rotb = [cos(-b) -sin(-b) 0; sin(-b) cos(-b) 0; 0 0 1];
else
rotb = [cos(-b) sin(-b) 0; -sin(-b) cos(-b) 0; 0 0 1];
end
n2 = n * rotb;
a = acos(n2(3) / sqrt(n2(2)*n2(2) + n2(3)*n2(3)));
awinkel = a * 360 / 2 / pi;
rota = [1 0 0; 0 cos(-a) -sin(-a); 0 sin(-a) cos(-a)];
roti = rotb * rota;
(Он возвращает, надеюсь, правильную матрицу двойного вращения)
Недостаток, который у нас был раньше и исправлено здесь было особенно. имеют дело со знаком компонента X, который не был учтен в вычислениях косинуса. Это заставило нас однажды повернуться не в том направлении (поворот на угол 180 °).
Надеюсь, я тоже найду время, чтобы попробовать решение Носредны! Всегда лучше избегать тригонометрии.