Поверните вектор нормали на плоскость оси

Команда 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

10
задан ypnos 23 October 2015 в 12:01
поделиться

3 ответа

Если у вас есть плоскость, у вас есть вектор нормали и начало координат. Я бы вообще не стал делать никаких «вращений». Вы всего в нескольких векторных операциях от ответа.

  • Давайте назовем вектор нормали вашей плоскости новой осью Z.
  • Вы можете сгенерировать новую ось Y, пересекая старую ось x с новой осью z (нормаль вашей плоскости).
  • Создайте новую ось x с помощью пересечение нового z с новым y.
  • Превратите все ваши новые векторы оси в единичные векторы (длина 1).
  • Для каждой имеющейся у вас точки создайте вектор, который от вашего нового начала до точки (вычитание вектора из точка - plane_origin). Просто поставьте точки новыми единичными векторами x и y, и вы получите пару (x, y), которую вы можете построить!

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

Уловки:

  • Обратите внимание, в каком направлении указывают ваши векторы. Если они указывают неправильную сторону, отмените результирующий вектор или измените порядок перекрестного произведения.
  • У вас проблемы, если нормаль вашей плоскости точно такая же, как и ваша исходная ось x.
12
ответ дан 3 December 2019 в 23:51
поделиться

Как насчет:

Разложите вектор нормали на вектор в плоскости XY и вектор Z. Затем примените поворот вокруг оси Z, чтобы выровнять вектор XY с одной из осей. Затем найдите скалярное произведение нормали с осью Z и поверните вдоль любого из X, Y, с которым вы выровнялись.

Идея состоит в том, чтобы выровнять вектор нормали с Z, и, таким образом, ваша плоскость теперь плоскость XY.

1
ответ дан 3 December 2019 в 23:51
поделиться

Хотя были и другие интересные ответы, это решение, которое мы нашли, ожидая ответов:

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 °).

Надеюсь, я тоже найду время, чтобы попробовать решение Носредны! Всегда лучше избегать тригонометрии.

0
ответ дан 3 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: