Как найти угол при вершине векторы

Угол между векторами

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


.

Пример

Найти
угол между векторами 
 и 
,
если известно, что 
.

Решение: Используем
формулу:

На
заключительном этапе вычислений
использован технический приём –
устранение иррациональности в знаменателе.
В целях устранения иррациональности я
домножил числитель и знаменатель на 
.

Итак,
если 
,
то:

Ответ: 

Не
забываем указывать размерность –
радианы и градусы.

Пример

Даны 
 –
длины векторов 

 и
угол между ними 
.
Найти угол между векторами 

.

Алгоритм
решения:

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

2)
Находим скалярное произведение 
.

3)
Находим длину вектора 
 и
длину вектора 
 .

4)
Нам известно число 
,
а значит, легко найти и сам угол: 

Сделайте
самостоятельно и сравните с решением.

Решение: 
Найдём скалярное произведение:

Найдём
длину вектора
 
:

Найдём
длину вектора
 
:

Таким
образом:

Ответ: 

Скалярное произведение векторов, заданных координатами в ортонормированном базисе

В
данном разделе рассматриваются только
ортонормированные базисы
 плоскости
и пространства.

Скалярное
произведение векторов
 
 и 
,
заданных в ортонормированном
базисе 
выражается
формулой
 

Скалярное
произведение векторов
 
,
заданных в ортонормированном
базисе 
выражается
формулой
 

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

Пример

Найти
скалярное произведение
векторов:

а) 
 и 

б) 
 и 
,
если даны точки 

Решение: 

а)
Здесь даны векторы плоскости. По
формуле 
:

б)
Сначала найдём векторы:


 

По
формуле 
 вычислим
скалярное произведение:

Ответ: 

Проверка векторов на ортогональность с помощью скалярного произведения

Векторы 
 и 
 ортогональны
тогда и только тогда, когда 
.
В координатах данный факт запишется
следующим образом:


 (для
векторов плоскости);


 (для
векторов пространства).

Пример

а)
Проверить ортогональность векторов: 
 и  

б)
Выяснить, будут ли перпендикулярными
отрезки 
 и 
,
если 

Решение: 

а)
Вычислим их скалярное произведение:


,
следовательно, 

б)
Найдём векторы:

Вычислим
их скалярное произведение:


,
значит, отрезки 
 и 
 не
перпендикулярны.

Ответ: а) 
,
б) отрезки 
 не
перпендикулярны.

Формула косинуса угла между векторами, которые заданы координатами

Косинус
угла между векторами плоскости
 
 и 
,
заданными в ортонормированном
базисе 
выражается
формулой
:


.

Косинус
угла между векторами пространства
 
,
заданными в ортонормированном
базисе 
выражается
формулой

Пример

Даны
три вершины треугольника 
.
Найти 
 (угол
при вершине 
).

Решение: 

Требуемый
угол 
 помечен
дугой. Угол 
 треугольника
совпадает с углом между векторами 
 и 
,
иными словами: 
.

Найдём
векторы:

Вычислим
скалярное произведение:

И
длины векторов:

Косинус
угла:

Найдём
сам угол:

Ответ: 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Векторэто направленный прямолинейный отрезок, то есть отрезок, имеющий
определенную длину и определенное направление. Пусть точка  А – начало вектора, а точка B – его конец, тогда вектор обозначается символом 
 или . Вектор  называется противоположным
вектору 
 и может быть
обозначен
 .

Сформулируем ряд базовых определений. 

Длиной
или модулем
вектора 
 называется
длина отрезка и обозначается 
. Вектор нулевой длины (его суть — точка) называется нулевым 
 и направления
не имеет. Вектор 
 единичной длины, называется единичным. Единичный вектор, 
направление которого совпадает с направлением вектора 
, называется ортом вектора  .

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

Векторы
называются равными 
, если они коллинеарны, одинаково направлены и имеют
одинаковые длины.

 Три вектора в пространстве называются компланарными,
если они лежат в одной плоскости или на параллельных плоскостях. Если среди
трех векторов хотя бы один нулевой или два любые коллинеарны, то такие векторы
компланарны.

Рассмотрим в
пространстве прямоугольную систему координат 0xyz. Выделим на осях координат 0x, 0y, 0z единичные векторы (орты) и
обозначим их через 
 соответственно.
Выберем произвольный вектор

 пространства и совместим его начало с началом
координат. Спроектируем вектор
 на координатные
оси и обозначим проекции через ax, ay, az 
соответственно. Тогда нетрудно показать, что 

.                                                                                                                                                                     (2.25)

Эта
формула является основной в векторном исчислении и называется разложением
вектора по ортам координатных осей
. Числа ax, ay, az называются координатами вектора 
. Таким образом, координаты вектора являются его
проекциями на оси координат. Векторное равенство (2.25) часто записывают в
виде 

. Мы будем использовать обозначение вектора в фигурных
скобках, чтобы визуально легче различать координаты вектора и координаты точки.
С использованием формулы длины отрезка, известной из школьной геометрии, можно
найти выражение для вычисления модуля вектора 

:

,                                                                                                                                                                               (2.26)

то
есть модуль вектора равен корню квадратному из суммы квадратов его координат.

Обозначим углы между вектором 
 и осями
координат через α, β, γ  соответственно. Косинусы этих углов называются
для вектора 
 направляющими, и для них выполняется соотношение:Верность данного равенства можно показать с помощью
свойства проекции вектора на ось, которое будет рассмотрено в нижеследующем
пункте 4.

Пусть в трехмерном пространстве заданы векторы  своими
координатами.  Имеют место следующие
операции над ними: линейные (сложение, вычитание, умножение на число и
проектирование вектора на ось или другой вектор); не линейные – различные
произведения векторов (скалярное, векторное, смешанное).

1. Сложение  двух векторов производится покоординатно, то
есть если 

.

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

Геометрически
два вектора складываются по двум правилам:

а) правило треугольника
результирующий вектор суммы двух векторов соединяет начало первого из них с
концом второго при условии, что начало второго совпадает с концом первого
вектора; для суммы векторов –
результирующий вектор суммы соединяет начало первого из них с концом последнего
вектора-слагаемого при условии, что начало последующего слагаемого совпадает с
концом предыдущего;

б)
правило
параллелограмма
(для двух
векторов) – параллелограмм строится на векторах-слагаемых как на сторонах,
приведенных к одному началу; диагональ параллелограмма исходящая из  их общего начала, является  суммой 
векторов.

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

.

Геометрически два
вектора складываются по уже упомянутому правилу параллелограмма  с учетом того, что разностью векторов
является диагональ, соединяющая концы векторов, причем результирующий вектор
направлен из конца вычитаемого в конец уменьшаемого вектора.

Важным следствием
вычитания векторов является тот факт, что если известны координаты начала и
конца вектора, то для вычисления координат вектора необходимо из координат его конца
вычесть координаты его начала
. Действительно, любой вектор пространства 
 может быть
представлен в виде разности двух векторов, исходящих из начала координат: 
. Координаты векторов и совпадают с
координатами точек
А и В, так как начало координат О(0;0;0). Таким образом, по правилу
вычитания векторов следует произвести вычитание координат точки
А из координат точки В.

3. Умножение вектора на число λ покоординатно:.

При  λ>0
– вектор
 сонаправлен ; λ<0 – вектор  противоположно направлен ; |λ|>1 –  длина вектора  увеличивается в λ раз; |λ|<1 –  длина вектора   уменьшается в λ раз.

4. Пусть в пространстве задана
направленная прямая (ось l), вектор 
 задан
координатами конца и начала. Обозначим проекции точек A и B на ось l
соответственно через A  и B.

Проекцией вектора  на ось l называется длина вектора ,   взятая со
знаком «+», если вектор 
 и ось  l  сонаправлены,  и  со
знаком «–»,  если 
 и l  противоположно направлены.

 

Если
в качестве оси l взять некоторый другой вектор 
, то получим проекцию вектора  на вектор .

Рассмотрим некоторые
основные свойства проекций:

1)     проекция вектора  на ось l равна произведению модуля
вектора 
 на косинус угла
 между вектором и осью, то есть 
;

2.)     проекция вектора на ось
положительна (отрицательна), если вектор образует с осью острый (тупой) угол, и
равна нулю, если этот угол – прямой; 

3)     проекция суммы нескольких
векторов на одну и ту же ось равна сумме проекций на эту ось.

Сформулируем определения и
теоремы о произведениях векторов, представляющих нелинейные операции над
векторами.

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

 .                                                                                                                                                                                 (2.27)

Очевидно, что скалярный квадрат любого ненулевого вектора равен квадрату его длины, так как в этом случае угол , поэтому его косинус (в 2.27) равен 1.

Теорема 2.2. Необходимым и достаточным условием
перпендикулярности двух векторов является равенство нулю их скалярного
произведения 

Следствие. Попарные скалярные произведения единичных орт равны нулю, то есть 

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

                                                                                                                                                       (2.28)

С помощью скалярного произведения векторов можно
вычислить угол
 между ними. 
Если  заданы два ненулевых вектора
своими координатами 
, то косинус угла φ между ними:

                                                                                                                                            (2.29)

Отсюда
следует условие перпендикулярности ненулевых векторов
 
 и  :

                                                                                                                                                                              (2.30)

Нахождение проекции вектора  на направление,
заданное вектором 
 , может осуществляться по формуле

                                                                                                                       (2.31)

С помощью скалярного произведения векторов находят
работу постоянной  силы 
 на
прямолинейном участке пути.

Предположим, что под действием постоянной силы  материальная точка перемещается прямолинейно из
положения А в положение B. Вектор силы 
образует угол φ с вектором перемещения  (рис. 2.14). Физика утверждает, что работа силы  при перемещении  
равна .

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

       Пример
2.9.
С
помощью скалярного произведения векторов найти угол при вершине
A параллелограмма  ABCD
 построенного на векторах     

Решение. Вычислим модули векторов и их скалярное произведение
по теореме (2.3):

Отсюда согласно формуле (2.29) получим косинус
искомого угла 

Пример 2.10. Затраты сырьевых и материальных ресурсов, используемых
на производство одной тонны творога, заданы в таблице 2.2 (руб.).

Какова общая цена этих ресурсов, затрачиваемых на изготовление одной
тонны творога?

                                                                                                         Таблица 2.2                               

                         

 Решение. Введем в рассмотрение два вектора: вектор затрат
ресурсов на тонну продукции  и вектор цены единицы
соответствующего ресурса  .

Тогда . Общая цена
ресурсов 
, что представляет собой скалярное произведение
векторов 
. Вычислим его по формуле (2.28) согласно теореме 2.3:

 

 Таким образом, общая цена затрат на производство одной
тонны творога составляет 279 541,5 рублей

Примечание. Действия с векторами, осуществленные в примере 2.10,
можно выполнить на персональном компьютере. Для нахождения скалярного
произведения векторов в MS Excel используют функцию СУММПРОИЗВ( ), где в качестве
аргументов указываются адреса диапазонов элементов матриц, сумму произведений
которых необходимо найти. В MathCAD
скалярное произведение двух векторов выполняется при помощи соответствующего
оператора панели инструментов Matrix 

Пример 2.11. Вычислить работу, произведенную силой , если точка ее приложения перемещается прямолинейно
из положения A(2;4;6) в положение A(4;2;7). Под каким углом к AB направлена сила 
?

Решение. Находим вектор перемещения, вычитая из координат его конца координаты
начала

 . По формуле (2.28)  (единиц работы).

Угол φ между  и
 
 находим по
формуле (2.29), то есть 

 

 6. Три некомпланарных вектора , взятые в указанном порядке, образуют правую
тройку
,
если при наблюдении из конца третьего вектора  кратчайший
поворот от первого вектора 
 ко второму
вектору 
совершается против часовой стрелки, и левую,
если по часовой стрелке.

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

–  перпендикулярен  векторам   и ;

– имеет длину, равную , где φ – угол, образованный векторами
 
 и ;

– векторы  образуют правую
тройку (рис. 2.15).

        Теорема 2.4. Необходимым и достаточным
условием коллинеарности двух векторов является равенство нулю их векторного
произведения 
  

Теорема 2.5. Векторное произведение векторов , заданных своими координатами, равно определителю
третьего порядка вида

                                                                                                                                                                    (2.32)  

Примечание.  Определитель (2.25) 
раскладывается по свойству 7  определителей 

 Следствие 1. Необходимым и достаточным условием коллинеарности двух
векторов является пропорциональность их соответствующих координат

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

Следствие 3. Векторный квадрат любого вектора равен нулю 

Геометрическая
интерпретация векторного произведения
состоит в том, что длина результирующего
вектора численно равна площади S
параллелограмма, построенного на векторах–сомножителях как на сторонах,
приведенных к одному началу. Действительно, согласно определению,  модуль
векторного произведения векторов равен  
. С другой стороны, площадь параллелограмма,
построенного на векторах 
 и , также равна    

. Следовательно,

 .                                                                                                                                                                         (2.33)

         Также с помощью векторного произведения можно
определить момент  силы относительно точки и  линейную  скорость вращения.

      
Пусть в точке A приложена
сила 
 и пусть O
некоторая точка пространства (рис. 2.16). Из курса физики известно, что моментом
силы 
 относительно
точки
O называется вектор 
, который проходит через точку  O и удовлетворяет следующим условиям:

— перпендикулярен плоскости, проходящей через точки OAB;

его модуль численно равен произведению силы на плечо .

—  образует правую тройку с векторами  и  .

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

       .                                                                                                                                                                                        (2.34)

  

Линейная скорость  точки М твердого тела, вращающегося с
угловой скоростью 
 вокруг
неподвижной оси, определяется формулой
 Эйлера  , O – некоторая неподвижная

точка оси (рис. 2.17).

Пример 2.12. С помощью
векторного произведения найти площадь треугольника ABC, построенного на векторах
 
 , приведенных к одному началу.

Решение. Найдем векторное произведение заданных векторов по
формуле (2.32).

.  Согласно формуле (2.33) модуль векторного
произведения двух неколлинеарных векторов численно равен площади
параллелограмма, построенного на данных векторах как на сторонах, приведенных к
общему началу, то есть 
. Тогда площадь треугольника   
. Следовательно, искомая площадь равна  (единиц
площади)

7. Рассмотрим произведение трех векторов , составленное следующим образом: . Здесь первые два вектора перемножаются векторно, а
результирующий вектор скалярно на третий. Такое произведение 
 называется смешанным
произведением
трех векторов
(векторно–скалярным произведением).

Теорема 2.6. Необходимым и достаточным условием компланарности
трех векторов является равенство нулю их смешанного произведения 

Теорема 2.7. Если три вектора  заданы своими координатами, то их смешанное
произведение представляет собой определитель третьего порядка, составленный из
координат векторов- сомножителей соответственно, то есть

                                                                                                                                                                                 (2.35)

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

Объем треугольной пирамиды, построенной на этих же
векторах, равен

                                                                                                                                                                                       (2.36)

Пример 2.13. Вершинами пирамиды служат точки . Вычислить объем пирамиды.

Решение. Найдем
координаты векторов

 . Вычислим смешанное произведение этих векторов: 

По формуле (2.36) объем пирамиды, построенной на
векторах 
 равен
 
(единиц объема)  

Рассмотрим очень важный вопрос о
разложении вектора по базису. Приведем 
следующие определения.

Система векторов  называется
линейно зависимой, если существуют такие числа 
, хотя бы одно из которых отлично от нуля, что имеет
место равенство

                                                                                                                                                                   (2.37) 

Отсюда всегда можно один из линейно
зависимых векторов выразить через линейную комбинацию остальных. Действительно,
допустим для определенности, что 
. Тогда на это число разделим равенство (2.37), имеем: 

получим выражение вектора  через
остальные векторы 

Линейно независимыми называют векторы, если равенство
(2.37)  выполняется только тогда, когда
все

  В системе векторов  число линейно
независимых векторов равняется рангу матрицы, которая составлена из координат
этих векторов (смотри
  раздел  I.5).

Базисом n – мерного
пространства
En называют любую совокупность  линейно независимых векторов         n – мерного пространства.

Произвольный вектор  n
– мерного пространства можно представить
в виде линейной комбинации векторов базиса 

 таким образом: 

Числа
 
называются координатами
вектора 
 в базисе
векторов 
.

Линейное пространство называется
конечномерным
и имеет размерность n, если в этом
пространстве существует система из n линейно независимых векторов (базис) такая,
что каждое ее расширение приводит к линейной зависимости системы.

Например, в трехмерном пространстве
существует базис единичных орт 
 такой, что любое расширение этой системы
линейно независимых векторов, то есть каждый вектор 
 трехмерного
пространства, приводит к линейной зависимости векторов (является линейной
комбинацией
орт ): Коэффициенты {x1, x2, x3} такого разложения вектора
 по ортам  являются координатами вектора  в трехмерном 
пространстве.

Вопросы для самопроверки 

Угол между векторами

Определение

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

Угол между векторами

 

На изображении это α, который также можно обозначить следующим образом:

(left(widehat{overrightarrow a;overrightarrow b}right))

Осторожно! Если преподаватель обнаружит плагиат в работе, не избежать крупных проблем (вплоть до отчисления). Если нет возможности написать самому, закажите тут.

Как и любой другой угол, векторный может быть представлен в нескольких вариациях.

Острый:

Острый угол между векторами

 

Тупой:

Тупой угол между векторами

 

Прямой:

Прямой угол

 

С величиной (0^circ) (то есть, векторы сонаправлены):

0 градусов

 

С величиной (180^circ) (векторы направлены в противоположные стороны):

180 градусов

 

Нахождение угла между векторами

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

Определение

Скалярное произведение — это число, которое равно произведению двух направляющих на косинус угла между ними.

Формула скалярного произведения:

(left(overrightarrow a;overrightarrow bright)=left|overrightarrow aright|timesleft|overrightarrow bright|timescosleft(widehat{overrightarrow a;overrightarrow b}right))

  1. Если α — острый, то СП (скалярное произведение) будет положительным числом (cos острого угла — положительное число).
  2. Если векторы имеют общую направленность, то есть угол между ними равен (0^circ), а косинус — 1, то СП будет тоже положительным.
  3. Если α — тупой, то скалярное произведение будет отрицательным (cos тупого угла — отрицательное число).
  4. Если α равен (180^circ), то есть векторы противоположно направлены, то СП тоже отрицательно, потому что cos данного угла равен 1.
  5. Если α — прямой, то СП равно 0, так как косинус (90^circ) равен 0.

В случае, если overrightarrow a и overrightarrow b не нулевые, можно найти косинус α между ними, опираясь на формулу:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|})

Расчет угла, если вектор задан координатами

В случае, когда направляющие расположены на двухмерной плоскости с заданными координатами в виде (overrightarrow a=left(a_x;a_yright)) и (overrightarrow b=left(b_x;b_yright)), то угол между ними можно найти следующим образом:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}})

Если же координаты находятся в трехмерном пространстве и заданы в виде:

(overrightarrow a=left(a_x;a_y;a_zright))

( overrightarrow b=left(b_x;b_y;b_zright))

то формула принимает такой вид:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y+a_zcdot b_z}{sqrt{a_x^2+a_y^2+a_z^2}cdotsqrt{b_x^2+b_y^2+b_z^2}})

Расчет угла, если заданы три точки в прямоугольной системе координат

В этом случае проще будет разобраться с объяснениями сразу на примере.

Допустим, нам известны три точки и их координаты: A(3,-2), B(2,1), C (6,-1). Нужно найти косинус угла между (overrightarrow{AC}) и (overrightarrow{BC}).

Решение

Для начала найдем их координаты по известным координатам заданных точек:

(overrightarrow{AC}=(6-3, -1-(-2))=(3,1))

(overrightarrow{BC}=(6-2, -1-1)=(4,-2))

После этого уже можем применить формулу для определения косинуса угла на плоскости и подставить известные значения:

(cosleft(widehat{overrightarrow{AC};overrightarrow{BC}}right)=frac{(overrightarrow{AC};;overrightarrow{BC})}{left|overrightarrow{AC}right|cdotleft|overrightarrow{BC}right|}=frac{3cdot4+1cdot(-2)}{sqrt{3^2+1^2}cdotsqrt{4^2+{(-2)}^2}}=frac{10}{sqrt{10}cdot2sqrt5}=frac{10}{10sqrt2}=frac1{sqrt2})

Ответ: (cosleft(widehat{overrightarrow{AC};overrightarrow{BC}}right)=frac1{sqrt2}.)

Примеры решения задач

Для наглядности, взглянем на примеры решения задач по данной теме.

Задача 1

Известно, что (overrightarrow a) и (overrightarrow b). Их длины равны 3 и 6 соответственно, а скалярное произведение равно -9. Нужно найти cos угла между векторами и его величину.

Решение

Применим формулу:

( cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|})

Подставим известные значения:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{-9}{3cdot6}=-frac12)

Далее найдем угол между данными векторами:

(arccosleft(-frac12right)=frac{3pi}4)

Ответ: (left(widehat{overrightarrow a;overrightarrow b}right)=-frac12,;left(widehat{overrightarrow a;overrightarrow b}right)=frac{3pi}4.)

Задача 2

В пространстве даны координаты (overrightarrow a=(8; -11; 7)) и (overrightarrow b=(-2; -7; 8)). Вычислить угол α между ними.

Решение

Используем формулу для нахождения косинуса угла между направляющими в трехмерной системе координат:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y+a_zcdot b_z}{sqrt{a_x^2+a_y^2+a_z^2}cdotsqrt{b_x^2+b_y^2+b_z^2}})

Подставляем значения и получаем:

(cosleft(alpharight)=frac{8cdot(-2)+(-11)cdot(-7)+7cdot8}{sqrt{8^2+{(-11)}^2+7^2}cdotsqrt{{(-2)}^2+{(-7)}^2+8^2}}=frac{117}{sqrt{234}cdotsqrt{117}}=frac{sqrt{117}}{sqrt{234}}=frac1{sqrt2}=frac2{sqrt2})

Теперь находим угол α:

(alpha=arccosleft(frac2{sqrt2}right)=45^circ)

Ответ: (45^circ).

Задача 3

Известны (overrightarrow a=(3; 4)) и (overrightarrow b=(2; 5)). Найти угол между ними.

Решение

Для расчета используем формулу:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}})

Подставим известные значения и получим:

(cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{left(overrightarrow a;overrightarrow bright)}{left|overrightarrow aright|timesleft|overrightarrow bright|}=frac{a_xcdot b_x+a_ycdot b_y}{sqrt{a_x^2+a_y^2}cdotsqrt{b_x^2+b_y^2}}=frac{3cdot2+4cdot5}{sqrt{3^2+4^2}cdotsqrt{2^2+5^2}}=frac{26}{sqrt{25}cdotsqrt{29}}=frac{26}{5sqrt{29}})

Ответ: (cosleft(widehat{overrightarrow a;overrightarrow b}right)=frac{26}{5sqrt{29}})

Угол между векторами.

Формула вычисления угла между векторами

cos α = a · b
| a |·| b |

Примеры задач на вычисление угла между векторами

Примеры вычисления угла между векторами для плоских задачи

Решение: Найдем скалярное произведение векторов:

a · b = 3 · 4 + 4 · 3 = 12 + 12 = 24.

Найдем модули векторов:

| a | = √ 3 2 + 4 2 = √ 9 + 16 = √ 25 = 5
| b | = √ 4 2 + 3 2 = √ 16 + 9 = √ 25 = 5

Найдем угол между векторами:

cos α = a · b = 24 = 24 = 0.96
| a | · | b | 5 · 5 25

Решение: Найдем скалярное произведение векторов:

a · b = 5 · 7 + 1 · 5 = 35 + 5 = 40.

Найдем модули векторов:

| a | = √ 7 2 + 1 2 = √ 49 + 1 = √ 50 = 5√ 2
| b | = √ 5 2 + 5 2 = √ 25 + 25 = √ 50 = 5√ 2

Найдем угол между векторами:

cos α = a · b = 40 = 40 = 4 = 0.8
| a | · | b | 5√ 2 · 5√ 2 50 5

Примеры вычисления угла между векторами для пространственных задач

Решение: Найдем скалярное произведение векторов:

a · b = 3 · 4 + 4 · 4 + 0 · 2 = 12 + 16 + 0 = 28.

Найдем модули векторов:

| a | = √ 3 2 + 4 2 + 0 2 = √ 9 + 16 = √ 25 = 5
| b | = √ 4 2 + 4 2 + 2 2 = √ 16 + 16 + 4 = √ 36 = 6

Найдем угол между векторами:

cos α = a · b = 28 = 14
| a | · | b | 5 · 6 15

Решение: Найдем скалярное произведение векторов:

a · b = 1 · 5 + 0 · 5 + 3 · 0 = 5.

Найдем модули векторов:

| a | = √ 1 2 + 0 2 + 3 2 = √ 1 + 9 = √ 10
| b | = √ 5 2 + 5 2 + 0 2 = √ 25 + 25 = √ 50 = 5√ 2

Найдем угол между векторами:

cos α = a · b | a | · | b | = 5 √ 10 · 5√ 2 = 1 2√ 5 = √ 5 10 = 0.1√ 5

Любые нецензурные комментарии будут удалены, а их авторы занесены в черный список!

Добро пожаловать на OnlineMSchool.
Меня зовут Довжик Михаил Викторович. Я владелец и автор этого сайта, мною написан весь теоретический материал, а также разработаны онлайн упражнения и калькуляторы, которыми Вы можете воспользоваться для изучения математики.

Нахождение угла между векторами

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

Для рассмотрения понятия угла между векторами обратимся к графической иллюстрации: зададим на плоскости или в трехмерном пространстве два вектора a → и b → , являющиеся ненулевыми. Зададим также произвольную точку O и отложим от нее векторы O A → = b → и O B → = b →

Углом между векторами a → и b → называется угол между лучами О А и О В .

Полученный угол будем обозначать следующим образом: a → , b → ^

Очевидно, что угол имеет возможность принимать значения от 0 до π или от 0 до 180 градусов.

a → , b → ^ = 0 , когда векторы являются сонаправленными и a → , b → ^ = π , когда векторы противоположнонаправлены.

Векторы называются перпендикулярными, если угол между ними равен 90 градусов или π 2 радиан.

Если хотя бы один из векторов является нулевым, то угол a → , b → ^ не определен.

Нахождение угла между векторами

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

Согласно определению скалярное произведение есть a → , b → = a → · b → · cos a → , b → ^ .

Если заданные векторы a → и b → ненулевые, то можем разделить правую и левую части равенства на произведение длин этих векторов, получая, таким образом, формулу для нахождения косинуса угла между ненулевыми векторами:

cos a → , b → ^ = a → , b → a → · b →

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

Исходные данные: векторы a → и b → . Длины их равны 3 и 6 соответственно, а их скалярное произведение равно — 9 . Необходимо вычислить косинус угла между векторами и найти сам угол.

Решение

Исходных данных достаточно, чтобы применить полученную выше формулу, тогда cos a → , b → ^ = — 9 3 · 6 = — 1 2 ,

Теперь определим угол между векторами: a → , b → ^ = a r c cos ( — 1 2 ) = 3 π 4

Ответ: cos a → , b → ^ = — 1 2 , a → , b → ^ = 3 π 4

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

Длина вектора определяется как корень квадратный из суммы квадратов его координат, а скалярное произведение векторов равно сумме произведений соответствующих координат. Тогда формула для нахождения косинуса угла между векторами на плоскости a → = ( a x , a y ) , b → = ( b x , b y ) выглядит так:

cos a → , b → ^ = a x · b x + a y · b y a x 2 + a y 2 · b x 2 + b y 2

А формула для нахождения косинуса угла между векторами в трехмерном пространстве a → = ( a x , a y , a z ) , b → = ( b x , b y , b z ) будет иметь вид: cos a → , b → ^ = a x · b x + a y · b y + a z · b z a x 2 + a y 2 + a z 2 · b x 2 + b y 2 + b z 2

Исходные данные: векторы a → = ( 2 , 0 , — 1 ) , b → = ( 1 , 2 , 3 ) в прямоугольной системе координат. Необходимо определить угол между ними.

Решение

  1. Для решения задачи можем сразу применить формулу:

cos a → , b → ^ = 2 · 1 + 0 · 2 + ( — 1 ) · 3 2 2 + 0 2 + ( — 1 ) 2 · 1 2 + 2 2 + 3 2 = — 1 70 ⇒ a → , b → ^ = a r c cos ( — 1 70 ) = — a r c cos 1 70

  1. Также можно определить угол по формуле:

cos a → , b → ^ = ( a → , b → ) a → · b → ,

но предварительно рассчитать длины векторов и скалярное произведение по координатам: a → = 2 2 + 0 2 + ( — 1 ) 2 = 5 b → = 1 2 + 2 2 + 3 2 = 14 a → , b → ^ = 2 · 1 + 0 · 2 + ( — 1 ) · 3 = — 1 cos a → , b → ^ = a → , b → ^ a → · b → = — 1 5 · 14 = — 1 70 ⇒ a → , b → ^ = — a r c cos 1 70

Ответ: a → , b → ^ = — a r c cos 1 70

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

Исходные данные: на плоскости в прямоугольной системе координат заданы точки A ( 2 , — 1 ) , B ( 3 , 2 ) , C ( 7 , — 2 ) . Необходимо определить косинус угла между векторами A C → и B C → .

Решение

Найдем координаты векторов по координатам заданных точек A C → = ( 7 — 2 , — 2 — ( — 1 ) ) = ( 5 , — 1 ) B C → = ( 7 — 3 , — 2 — 2 ) = ( 4 , — 4 )

Теперь используем формулу для определения косинуса угла между векторами на плоскости в координатах: cos A C → , B C → ^ = ( A C → , B C → ) A C → · B C → = 5 · 4 + ( — 1 ) · ( — 4 ) 5 2 + ( — 1 ) 2 · 4 2 + ( — 4 ) 2 = 24 26 · 32 = 3 13

Ответ: cos A C → , B C → ^ = 3 13

Угол между векторами можно определить по теореме косинусов. Отложим от точки O векторы O A → = a → и O B → = b → , тогда, согласно теореме косинусов в треугольнике О А В , будет верным равенство:

A B 2 = O A 2 + O B 2 — 2 · O A · O B · cos ( ∠ A O B ) ,

b → — a → 2 = a → + b → — 2 · a → · b → · cos ( a → , b → ) ^

и отсюда выведем формулу косинуса угла:

cos ( a → , b → ) ^ = 1 2 · a → 2 + b → 2 — b → — a → 2 a → · b →

Для применения полученной формулы нам нужны длины векторов, которые несложно определяются по их координатам.

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

Линейная алгебра для разработчиков игр

Эта статья является переводом цикла из четырёх статей «Linear algebra for game developers», написанных David Rosen и посвящённых линейной алгебре и её применению в разработке игр. С оригинальными статьями можно ознакомиться тут: часть 1, часть 2, часть 3 и часть 4. Я не стал публиковать переводы отдельными топиками, а объединил все статьи в одну. Думаю, что так будет удобнее воспринимать материал и работать с ним. Итак приступим.

Зачем нам линейная алгебра?

Одним из направлений в линейной алгебре является изучение векторов. Если в вашей игре применяется позиционирование экранных кнопок, работа с камерой и её направлением, скоростями объектов, то вам придётся иметь дело с векторами. Чем лучше вы понимаете линейную алгебру, тем больший контроль вы получаете над поведением векторов и, следовательно, над вашей игрой.

Что такое вектор?

В играх вектора используются для хранения местоположений, направлений и скоростей. Ниже приведён пример двухмерного вектора:

Вектор местоположения (также называемый «радиус-вектором») показывает, что человек стоит в двух метрах восточнее и в одном метре к северу от исходной точки. Вектор скорости показывает, что за единицу времени самолёт перемещается на три километра вверх и на два — влево. Вектор направления говорит нам о том, что пистолет направлен вправо.

Как вы можете заметить, вектор сам по себе всего лишь набор цифр, который обретает тот или иной смысл в зависимости от контекста. К примеру, вектор (1, 0) может быть как направлением для оружия, как показано на картинке, так и координатами строения в одну милю к востоку от вашей текущей позиции. Или скоростью улитки, которая двигается вправо со скоростью в 1 милю в час (прим. переводчика: довольно быстро для улитки, 44 сантиметра в секунду).

Важно отслеживать единицы измерения. Допустим у нас есть вектор V (3,5,2). Это мало что говорит нам. Три чего, пять чего? В нашей игре Overgrowth расстояния указываются в метрах, а скорости в метрах в секунду. Первое число в этом векторе — это направление на восток, второе — направление вверх, третье — направление на север. Отрицательные числа обозначают противоположные направления, на запад, вниз и на юг. Местоположение, определяемое вектором V (3,5,2), находится в трёх метрах к востоку, в пяти метрах вверху и в двух метрах к северу, как показано на картинке ниже.

Итак, мы изучили основы работы с векторами. Теперь узнаем как вектора использовать.

Сложение векторов

Чтобы сложить вектора, нам надо просто сложить каждую их составляющую друг с другом. Например:

(0, 1, 4) + (3, -2, 5) = (0+3, 1-2, 4+5) = (3, -1, 9)

Зачем нам нужно складывать вектора? Наиболее часто сложение векторов в играх применяется для физического интегрирования. Любой физический объект будет иметь вектора для местоположения, скорости и ускорения. Для каждого кадра (обычно это одна шестидесятая часть секунды), мы должны интегрировать два вектора: добавить скорость к местоположению и ускорение к скорости.

Давайте рассмотрим пример с прыжками Марио. Он начинает с позиции (0, 0). В момент начала прыжка его скорость (1, 3), он быстро двигается вверх и вправо. Его ускорение равно (0, -1), так как гравитация тянет его вниз. На картинке показано, как выглядит его прыжок, разбитый на семь кадров. Чёрным текстом показана его скорость в каждом фрейме.

Давайте рассмотрим первые кадры поподробнее, чтобы понять как всё происходит.

Для первого кадра, мы добавляем скорость Марио (1, 3) к его местоположению (0, 0) и получаем его новые координаты (1, 3). Затем мы складываем ускорение (0, -1) с его скоростью (1, 3) и получаем новое значение скорости Марио (1, 2).

Делаем то-же самое для второго кадра. Добавляем скорость (1, 2) к местоположению (1, 3) и получаем координаты (2, 5). Затем добавляем ускорение (0, -1) к его скорости (1, 2) и получаем новую скорость (1, 1).

Обычно игрок контролирует ускорение игрового персонажа с помощью клавиатуры или геймпада, а игра, в свою очередь, рассчитывает новые значения для скоростей и местоположения, используя физическое сложение (через сложение векторов). Это та-же задача, которая решается в интегральном исчислении, просто мы его сильно упрощаем для нашей игры. Я заметил, что мне намного проще внимательно слушать лекции по интегральному исчислению, думая о практическом его применении, которое мы только что описали.

Вычитание векторов

Вычитание рассчитывается по тому-же принципу что и сложение — вычитаем соответствующие компоненты векторов. Вычитание векторов удобно для получения вектора, который показывает из одного местоположения на другое. Например, пусть игрок находится по координатам (1, 2) с лазерным ружьём, а вражеский робот находится по координатам (4, 3). Чтобы определить вектор движения лазерного луча, который поразит робота, нам надо вычесть местоположение игрока из местоположения робота. Получаем:

(4, 3) — (1, 2) = (4-1, 3-2) = (3, 1).

Умножение вектора на скаляр

Когда мы говорим о векторах, мы называем отдельные числа скалярами. Например (3, 4) — вектор, а 5 — это скаляр. В играх, часто бывает нужно умножить вектор на число (скаляр). Например, моделируя простое сопротивление воздуха путём умножения скорости игрока на 0.9 в каждом кадре. Чтобы сделать это, нам надо умножить каждый компонент вектора на скаляр. Если скорость игрока (10, 20), то новая скорость будет:

0.9*(10, 20) = (0.9 * 10, 0.9 * 20) = (9, 18).

Длина вектора

Если у нас есть корабль с вектором скорости V (4, 3), нам также понадобится узнать как быстро он двигается, чтобы посчитать потребность в экранном пространстве или сколько потребуется топлива. Чтобы сделать это, нам понадобится найти длину (модуль) вектора V. Длина вектора обозначается вертикальными линиями, в нашем случае длина вектора V будет обозначаться как |V|.

Мы можем представить V как прямоугольный треугольник со сторонами 4 и 3 и, применяя теорему Пифагора, получить гипотенузу из выражения: x 2 + y 2 = h 2

В нашем случае — длину вектора H с компонентами (x, y) мы получаем из квадратного корня: sqrt(x 2 + y 2 ).

Итак, скорость нашего корабля равна:

|V| = sqrt(4 2 + 3 2 ) = sqrt(25) = 5

Этот подход используется и для трёхмерных векторов. Длина вектора с компонентами (x, y, z) рассчитывается как sqrt(x 2 + y 2 + z 2 )

Расстояние

Если игрок P находится в точке (3, 3), а взрыв произошёл в точке E по координатам (1, 2), нам надо определить расстояние между игроком и взрывом, чтобы рассчитать степень ущерба, нанесённого игроку. Это легко сделать, комбинируя две вышеописанных операции: вычитание векторов и их длину.
Мы вычитаем P — E, чтобы получить вектор между ними. А затем определяем длину этого вектора, что и даёт нам искомое расстояние. Порядок следования операндов тут не имеет значения, |E — P| даст тот-же самый результат.

Расстояние = |P — E| = |(3, 3) — (1, 2)| = |(2, 1)| = sqrt(2 2 +1 2 ) = sqrt(5) = 2.23

Нормализация

Когда мы имеем дело с направлениями (в отличие от местоположений и скоростей), важно, чтобы вектор направления имел длину, равную единице. Это сильно упрощает нам жизнь. Например, допустим орудие развёрнуто в направлении (1, 0) и выстреливает снаряд со скоростью 20 метров в секунду. Каков в данном случае вектор скорости для выпущенного снаряда?

Так как вектор направления имеет длину равную единице, мы умножаем направление на скорость снаряда и получаем вектор скорости (20, 0). Если-же вектор направления имеет отличную от единицы длину, мы не сможем сделать этого. Снаряд будет либо слишком быстрым, либо слишком медленным.

Вектор с длиной равной единице называется «нормализованным». Как сделать вектор нормализованным? Довольно просто. Мы делим каждый компонент вектора на его длину. Если, к примеру, мы хотим нормализовать вектор V с компонентами (3, 4), мы просто делим каждый компонент на его длину, то есть на 5, и получаем (3/5, 4/5). Теперь, с помощью теоремы Пифагора, мы убедимся в том, что его длина равна единице:

(3/5) 2 + (4/5) 2 = 9/25 + 16/25 = 25/25 = 1

Скалярное произведение векторов

Что такое скалярное произведение (записывается как •)? Чтобы рассчитать скалярное произведение двух векторов, мы должны умножить их компоненты, а затем сложить полученные результаты вместе

(a1, a2) • (b1, b2) = a1b1 + a2b2

Например: (3, 2) • (1, 4) = 3*1 + 2*4 = 11. На первый взгляд это кажется бесполезным, но посмотрим внимательнее на это:

Здесь мы можем увидеть, что если вектора указывают в одном направлении, то их скалярное произведение больше нуля. Когда они перпендикулярны друг другу, то скалярное произведение равно нулю. И когда они указывают в противоположных направлениях, их скалярное произведение меньше нуля.
В основном, с помощью скалярного произведения векторов можно рассчитать, сколько их указывает в одном направлении. И хоть это лишь малая часть возможностей скалярного произведения, но уже очень для нас полезная.

Допустим у нас есть стражник, расположенный в G(1, 3) смотрящий в направлении D(1,1), с углом обзора 180 градусов. Главный герой игры подсматривает за ним с позиции H(3, 2). Как определить, находится-ли главный герой в поле зрения стражника или нет? Сделаем это путём скалярного произведения векторов D и V (вектора, направленного от стражника к главному герою). Мы получим следующее:

V = H — G = (3, 2) — (1, 3) = (3-1, 2-3) = (2, -1)
D•V = (1, 1) • (2, -1) = 1*2 + 1*-1 = 2-1 = 1

Так как единица больше нуля, то главный герой находится в поле зрения стражника.

Мы уже знаем, что скалярное произведение имеет отношение к определению направления векторов. А каково его более точное определение? Математическое выражение скалярного произведения векторов выглядит так:

Где Θ (произносится как «theta») — угол между векторами A и B.

Это позволяет нам найти Θ (угол) с помощью выражения:

Как я говорил ранее, нормализация векторов упрощает нашу жизнь. И если A и B нормализованы, то выражение упрощается следующим образом:

Давайте опять рассмотрим сценарий со стражником. Пусть теперь угол обзора стражника будет равен 120 градусам. Получим нормализованные вектора для направления взгляда стражника (D’) и для направления от стражника к главному герою (V’). Затем определим угол между ними. Если угол более 60 градусов (половина от угла обзора), то главный герой находится вне поля зрения стражника.

D’ = D / |D| = (1, 1) / sqrt(1 2 + 1 2 ) = (1, 1) / sqrt(2) = (0.71, 0.71)
V’ = V / |V| = (2, -1) / sqrt(2 2 + (-1) 2 ) = (2,-1) / sqrt(5) = (0.89, -0.45)

Θ = acos(D’V’) = acos(0.71*0.89 + 0.71*(-0.45)) = acos(0.31) = 72

Угол между центром поля зрения стражника и местоположением главного героя составляет 72 градуса, следовательно стражник его не видит.

Понимаю, что это выглядит довольно сложно, но это потому, что мы всё делаем вручную. В программе это всё довольно просто. Ниже показано как я сделал это в нашей игре Overgrowth с помощью написанных мной С++ библиотек для работы с векторами:

Векторное произведение

Допустим у нас есть корабль с пушками, которые стреляют в правую и в левую стороны по курсу. Допустим, что лодка расположена вдоль вектора направления (2, 1). В каких направлениях теперь стреляют пушки?

Это довольно просто в двухмерной графике. Чтобы повернуть направление на 90 градусов по часовой стрелке, достаточно поменять местами компоненты вектора, а затем поменять знак второму компоненту.
(a, b) превращается в (b, -a). Следовательно у корабля, расположенного вдоль вектора (2, 1), пушки справа по борту будут стрелять в направлении (1, -2), а пушки с левого борта, будут стрелять в противоположном направлении. Меняем знаки у компонент вектора и получаем (-1, 2).

А что если мы хотим рассчитать это всё для трехмерной графики? Рассмотрим пример с кораблём.
У нас есть вектор мачты M, направленной прямо вверх (0, 1, 0) и направление ветра: север-северо-восток W (1, 0, 2). И мы хотим вычислить вектор направления паруса S, чтобы наилучшим образом «поймать ветер».

Для решения этой задачи мы используем векторное произведение: S = M x W.

Подставим теперь нужные нам значения:

S = MxW = (0, 1, 0) x (1, 0, 2) = ([1*2 — 0*0], [0*1 — 0*2], [0*0 — 1*1]) = (2, 0, -1)

Для расчётов вручную довольно сложно, но для графических и игровых приложений я рекомендую написать функцию, подобную той, что указана ниже и не вдаваться более в детали подобных расчётов.

Векторное произведение часто используется в играх, чтобы рассчитать нормали к поверхностям. Направления, в которых «смотрит» та или иная поверхность. Например, рассмотрим треугольник с векторами вершин A, B и С. Как мы найдем направление в котором «смотрит» треугольник, то есть направление перпендикулярное его плоскости? Это кажется сложным, но у нас есть инструмент для решения этой задачи.

Используем вычитание, для определения направления из A в С (C — A), пусть это будет «грань 1» (Edge 1) и направление из A в B (B — A), пусть это будет «грань 2» (Edge 2). А затем применим векторное произведение, чтобы найти вектор, перпендикулярный им обоим, то есть перпендикулярный плоскости треугольника, также называемый «нормалью к плоскости».

Вот так это выглядит в коде:

В играх основное выражение освещённости записывается как N • L, где N — это нормаль к освещаемой поверхности, а L — это нормализованный вектор направления света. В результате поверхность выглядит яркой, когда на неё прямо падает свет, и тёмной, когда этого не происходит.

Теперь перейдем к рассмотрению такого важного для разработчиков игр понятия, как «матрица преобразований» (transformation matrix).

Для начала изучим «строительные блоки» матрицы преобразований.

Базисный вектор

Допустим мы пишем игру Asteroids на очень старом «железе» и нам нужен простой двухмерный космический корабль, который может свободно вращаться в своей плоскости. Модель корабля выглядит так:

Как нам рисовать корабль, когда игрок поворачивает его на произвольный градус, скажем 49 градусов против часовой стрелки. Используя тригонометрию, мы можем написать функцию двухмерного поворота, которая принимает координаты точки и угол поворота, и возвращает координаты смещённой точки:

Применяя эту функцию ко всем трём точкам, мы получим следующую картину:

Операции с синусами и косинусами работают довольно медленно, но так как мы делаем расчёты лишь для трёх точек, это будет нормально работать даже на старом «железе» (прим. переводчика: в случаях, когда предполагается интенсивное использование тригонометрических функций, для ускорения вычислений, в памяти организуют таблицы значений для каждой функции и рассчитывают их во время запуска приложения. Затем при вычислении той или иной тригонометрической функции просто производится обращение к таблице).

Пусть теперь наш корабль выглядит вот так:

Теперь старый подход будет слишком медленным, так как надо будет поворачивать довольно большое количество точек. Одно из элегантных решений данной проблемы будет звучать так — «Что если вместо поворота каждой точки модели корабля, мы повернём координатную решётку нашей модели?»

Как это работает? Давайте посмотрим внимательнее, что собой представляют координаты.
Когда мы говорим о точке с координатами (3, 2), мы говорим, что её местоположение находится в трех шагах от точки отсчёта по координатной оси X, и двух шагах от точки отсчёта по координатной оси Y.

По-умолчанию координатные оси расположены так: вектор координатной оси X (1, 0), вектор координатной оси Y (0, 1). И мы получим расположение: 3(1, 0) + 2(0, 1). Но координатные оси не обязательно должны быть в таком положении. Если мы повернём координатные оси, в это-же время мы повернём все точки в координатной решётке.

Чтобы получить повернутые оси X и Y мы применим тригонометрические функции, о которых говорили выше. Если мы поворачиваем на 49 градусов, то новая координатная ось X будет получена путём поворота вектора (0, 1) на 49 градусов, а новая координатная ось Y будет получена путём поворота вектора (0, 1) на 49 градусов. Итак вектор новой оси X у нас будет равен (0.66, 0.75), а вектор новой оси Y будет (-0.75, 0.66). Сделаем это вручную для нашей простой модели из трёх точек, чтобы убедиться, что это работает так, как нужно:

Координаты верхней точки (0, 2), что означает, что её новое местоположение находится в 0 на новой (повёрнутой) оси X и 2 на новой оси Y:

0*(0.66,0.75) + 2*(-0.75, 0.66) = (-1.5, 1.3)

Нижняя левая точка (-1, -1), что означает, что её новое местоположение находится в -1 на повернутой оси X, и -1 на повернутой оси Y:

-1*(0.66,0.75) + -1*(-0.75, 0.66) = (0.1, -1.4)

Нижняя правая точка (1, -1), что означает её новое местоположение находится в 1 на повернутой оси X, и -1 на повернутой оси Y

1*(0.66,0.75) + -1*(-0.75, 0.66) = (1.4, 0.1)

Мы показали, как координаты корабля отображаются в другой координатной сетке с повернутыми осями (или «базисными векторами»). Это удобно в нашем случае, так как избавляет нас от необходимости применять тригонометрические преобразования к каждой из точек модели корабля.

Каждый раз, когда мы изменяем базисные вектора (1, 0) и (0, 1) на (a, b) и (c, d), то новая координата точки (x, y) может быть найдена с помощью выражения:

Обычно базисные вектора равны (1, 0) и (0, 1) и мы просто получаем x(1, 0) + y(0, 1) = (x, y), и нет необходимости заботиться об этом дальше. Однако, важно помнить, что мы можем использовать и другие базисные вектора, когда нам это нужно.

Матрицы

Матрицы похожи на двухмерные вектора. Например, типичная 2×2 матрица, может выглядеть так:

Когда вы умножаете матрицу на вектор, вы суммируете скалярное произведение каждой строки с вектором, на который происходит умножение. Например, если мы умножаем вышеприведённую матрицу на вектор (x, y), то мы получаем:

Будучи записанным по-другому, это выражение выглядит так:

Выглядит знакомо, не так-ли? Это в точности такое-же выражение, которые мы использовали для смены базисных векторов. Это означает, что умножая 2×2 матрицу на двухмерный вектор, мы тем самым меняем базисные вектора. Например, если мы вставим стандартные базисные вектора в (1, 0) и (0, 1) в колонки матрицы, то мы получим:

Это единичная матрица, которая не даёт эффекта, который мы можем ожидать от нейтральных базисных векторов, которые мы указали. Если-же мы повернём базисные вектора на 49-градусов, то мы получим:

Эта матрица будет поворачивать двухмерный вектор на 49 градусов против часовой стрелки. Мы можем сделать код нашей игры Asteriods более элегантным, используя матрицы вроде этой. Например, функция поворота нашего корабля может выглядеть так:

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

К счастью есть способ добиться этого, хоть это и выглядит не очень элегантно. Если мы хотим переместиться с помощью вектора (e, f), мы лишь включаем его в нашу матрицу преобразования:

И добавляем дополнительную единицу в конец каждого вектора, определяющего местоположение объекта, например так:

Теперь, когда мы перемножаем их, мы получаем:

(a, c, e) • (x, y, 1) + (b, d, f) • (x, y, 1) + (0, 0, 1) • (x, y, 1)

Что, в свою очередь, может быть записано как:

x(a, b) + y(c, d) + (e, f)

Теперь у нас есть полный механизм трансформации, заключённый в одной матрице. Это важно, если не принимать в расчёт элегантность кода, так как с ней мы теперь можем использовать все стандартные манипуляции с матрицами. Например перемножить матрицы, чтобы добавить нужный эффект, или мы можем инвертировать матрицу, чтобы получить прямо противоположное положение объекта.

Трехмерные матрицы

Матрицы в трехмерном пространстве работают так-же как и в двухмерном. Я приводил примеры с двухмерными векторами и матрицами, так как их просто отобразить с помощью дисплея, показывающего двухмерную картинку. Нам просто надо определить три колонки для базисных векторов, вместо двух. Если базисные вектора это (a,b,c), (d,e,f) and (g,h,i) то наша матрица будет выглядеть так:

Если нам нужно перемещение (j,k,l), то мы добавляем дополнительную колонку и строку, как говорили раньше:

И добавляем единицу [1] в вектор, как здесь:

Вращение в двухмерном пространстве

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

Более элегантно это можно выразить в матричной форме. Чтобы определить матрицу, мы можем применить эту функцию к осям (1, 0) и (0, 1) для угла Θ, а затем включить полученные оси в колонки нашей матрицы. Итак, начнём с координатной оси X (1, 0). Если мы применим к ней нашу функцию, мы получим:

(1*cos(Θ) — 0*sin(Θ), 1*sin(Θ) + 0*cos(Θ)) = (cos(Θ), sin(Θ))

Затем, мы включаем координатную ось Y (0, 1). Получим:

(0*cos(Θ) — 1*sin(Θ), 0*sin(Θ) + 1*cos(Θ)) = (-sin(Θ), cos(Θ))

Включаем полученные координатные оси в матрицу, и получаем двухмерную матрицу вращения:

Применим эту матрицу к Сюзанне, мартышке из графического пакета Blender. Угол поворота Θ равен 45 градусов по часовой стрелке.

Как видите — это работает. Но что если нам надо осуществить вращение вокруг точки, отличной от (0, 0)?
Например, мы хотим вращать голову мартышки вокруг точки, расположенной в её ухе:

Чтобы сделать это, мы можем начать с создания матрицы перемещения (translation matrix) T, которая перемещает объект из начальной точки в точку вращения в ухе мартышки, и матрицу вращения R, для вращения объекта вокруг начальной точки. Теперь для вращения вокруг точки, расположенной в ухе, мы можем сперва переместить точку в ухе на место начальной точки, с помощью инвертирования матрицы T, записанной как T -1 . Затем, мы вращаем объект вокруг начальной точки, с помощью матрицы R, а затем применяем матрицу T для перемещения точки вращения назад, к своему исходному положению.
Ниже дана иллюстрация к каждому из описанных шагов:

Это важный шаблон, который мы будем применять позднее — применение вращения для двух противоположных трансформаций позволяет нам вращать объект в другом «пространстве». Что очень удобно и полезно.

Теперь рассмотрим трёхмерное вращение.

Трёхмерное вращение

Вращение вокруг оси Z работает по тому-же принципу, что и вращение в двухмерном пространстве. Нам лишь нужно изменить нашу старую матрицу, добавив к ней дополнительную колонку и строку:

Применим эту матрицу к трехмерной версии Сюзанны, мартышки из пакета Blender. Угол поворота Θ пусть будет равен 45 градусов по часовой стрелке.

То-же самое. Вращение только вокруг оси Z ограничивает нас, как насчёт вращения вокруг произвольной оси?

Вращение, определяемое осью и углом (Axis-angle rotation)

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

Итак, вращение задаётся двумя параметрами (axis, angle), где axis — вектор оси вращения, а angle — угол вращения. Этот приём довольно прост и являет собой отправную точку для множества других операций вращения, с которыми я работаю. Как практически применить вращение, определяемое осью и углом?

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

Мы знаем как вращать объект вокруг оси Z, и мы знаем как вращать объект в других пространствах. Итак, нам лишь надо создать пространство, где наша ось вращения будет являться осью Z. И если эта ось будет осью Z, то что будет являться осями X и Y? Займемся вычислениями сейчас.

Чтобы создать новые оси X и Y нам нужно лишь выбрать два вектора, которые перпендикулярны новой оси Z и перпендикулярны друг другу. Мы уже говорили ранее о векторном умножении, которое берёт два вектора и даёт в итоге перпендикулярный им вектор.

У нас есть один вектор сейчас, это ось вращения, назовём его A. Возьмём теперь случайный другой вектор B, который находится не в том-же направлении, что и вектор A. Пусть это будет (0, 0, 1) к примеру.

Теперь мы имеем ось вращения A и случайный вектор B, мы можем получить нормаль C, через векторное произведение A и B. С перпендикулярен векторам A и B. Теперь мы делаем вектор B перпендикулярным векторам A и C через их векторное произведение. И всё, у нас есть все нужные нам оси координат.

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

Тут показана иллюстрация для каждого шага:

Теперь, имея информацию о новых координатных осях, мы можем составить матрицу M, включив каждую ось как колонку в эту матрицу. Нам надо убедиться, что вектор A является третьей колонкой, чтобы он был нашей новой осью координат Z.

Теперь это похоже на то, что мы делали для поворота в двухмерном пространстве. Мы можем применить инвертированную матрицу M, чтобы переместиться в новую систему координат, затем произвести вращение, согласно матрице R, чтобы повернуть объект вокруг оси Z, затем применить матрицу M, чтобы вернуться в исходное координатное пространство.

Теперь мы можем вращать объект вокруг произвольной оси. В конце концов мы можем просто создать матрицу T = T = M -1 RM и использовать её много раз, без дополнительных усилий с нашей стороны. Есть более эффективные способы конвертирования вращений, определяемых осью и углом во вращения, определяемые матрицами. Просто описанный нами подход показывает многое из того, о чём мы говорили ранее.

Вращение, определяемое осью и углом, возможно, самый интуитивно понятный способ. Применяя его, очень легко инвертировать поворот, поменяв знак у угла, и легко интерполировать, путём интерполяции угла. Однако тут есть серьёзное ограничение, и заключается оно в том, что такое вращение не является суммирующим. То есть вы не можете комбинировать два вращения, определяемых осью и углом в третье.
Вращение, определяемое осью и углом — хороший способ для начала, но оно должно быть преобразовано во что-то другое, чтобы использоваться в более сложных случаях.

Эйлеровские углы

Эйлеровские углы представляют собой другой способ вращения, заключающийся в трёх вложенных вращениях относительно осей X, Y и Z. Вы, возможно, сталкивались с их применением в играх, где камера показывает действие от первого лица, либо от третьего лица.

Допустим вы играете в шутер от первого лица и вы повернулись на 30 градусов влево, а затем посмотрели на 40 градусов вверх. В конце-концов в вас стреляют, попадают, и, в результате удара, камера поворачивается вокруг своей оси на 45 градусов. Ниже показано вращение с помощью углов Эйлера (30, 40, 45).

Углы Эйлера — удобное и простое в управлении средство. Но у этого способа есть два недостатка.

Первый, это вероятность возникновения ситуации под названием «блокировка оси» или «шарнирный замок» (gimbal lock). Представьте, что вы играете в шутер от первого лица, где вы можете посмотреть влево, вправо, вверх и вниз или повернуть камеру вокруг зрительной оси. Теперь представьте, что вы смотрите прямо вверх. В этой ситуации попытка взглянуть налево или направо будет аналогична попытке вращения камеры. Всё что мы можем вы этом случае, это вращать камеру вокруг своей оси, либо посмотреть вниз. Как вы можете представить, это ограничение делает непрактичным применение углов Эйлера в лётных симуляторах.

Второе — интерполяция между двумя эйлеровскими углами вращения не даёт кратчайшего пути между ними.
Например, у вас две интерполяции между двумя одинаковыми вращениями. Первая использует интерполяцию эйлеровского угла, вторая использует сферическую линейную интерполяцию (spherical linear interpolation (SLERP)), чтобы найти кратчайший путь.

Итак, что-же больше подойдет для интерполяции вращений? Может быть матрицы?

Вращение с помощью матриц

Как мы уже говорили ранее, матрицы вращения хранят в себе информацию о трёх осях. Это означает, что интерполяция между двумя матрицами лишь линейно интерполирует каждую ось. В результате это даёт нам эффективный путь, то так-же привносит новые проблемы. Например, тут показаны два вращения и одно интерполированное полу-вращение:

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

Это в свою очередь порождает известный «эффект фантика» (candy wrapper effect), при применении скелетной анимации. Ниже показана демонстрация этого эффекта на примере кролика из нашей игры Overgrowth (прим. переводчика: обратите внимание на середину туловища кролика).

Вращение, основанное на матричных операциях, очень полезно, так как они могут аккумулировать вращения без всяких проблем, вроде блокировки оси (gimbal lock), и может очень эффективно применяться к точкам сцены. Вот почему поддержка вращения на матрицах встроена в графические карты. Для любого типа трёхмерной графики матричный формат вращения — это всегда итоговый применяемый способ.

Однако, как мы уже знаем, матрицы не очень хорошо интерполируются, и они не столь интуитивно понятны.

Итак, остался только один главный формат вращения. Последний, но тем не менее, важный.

Кватернионы

Что-же такое кватернионы? Если очень кратко, то это альтернативный вариант вращения, основанный на оси и угле (axis-angle rotation), который существует в пространстве.

Подобно матрицам они могут аккумулировать вращения, то есть вы можете составлять из них цепочку вращений, без опаски получить блокировку оси (gimbal lock). И в то-же время, в отличие от матриц, они могут хорошо интерполироваться из одного положения в другое.

Являются-ли кватернионы лучшим решением, нежели остальные способы вращений (rotation formats)?
На сегодняшний день они комбинируют все сильные стороны других способов вращений. Но у них есть два слабых места, рассмотрев которые, мы придём к выводу, что кватернионы лучше использовать для промежуточных вращений. Итак, каковы недостатки кватернионов.

Во-первых кватернионы непросто отобразить на трёхмерном пространстве. И мы вынуждены всегда реализовывать вращение более простым способом, а затем конвертировать его. Во-вторых, кватернионы не могут эффективно вращать точки, и мы вынуждены конвертировать их в матрицы, чтобы повернуть значительное количество точек.

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

«Внутренняя кухня» механизма кватернионов не очень понятна и не интересна мне. И, возможно, не будет интересна и вам, если только вы не математик. И я советую вам найти библиотеки, которые работают с кватернионами, чтобы облегчить вам решение ваших задач с их помощью.

Математические библиотеки «Bullet» или «Blender» будут хорошим вариантом для начала.

источники:

http://zaochnik.com/spravochnik/matematika/vektory/nahozhdenie-ugla-mezhdu-vektorami-primery-i-reshen/

http://habr.com/ru/post/131931/

Угол между векторами

Иногда студенты при решении задач аналитической геометрии сталкиваются с вопросом: «Как найти угол между векторами?». Чтобы решить такую задачу нужно сначала найти косинус угла между ними, а затем и сам угол. Для этого применяется такая формула: $$ phi = arccos(cos phi) $$

Если воспользоваться данной формулой, то сначала нужно найти угол между векторами $ cos phi $. Затем находим арккосинус от косинуса угла $ phi $. А чему равен $ cos phi $? Для его нахождения необходимо воспользоваться следующими формулами.

Формула

Если векторы расположены на плоскости и координаты их заданы в виде: $ overline{a} = (a_x; a_y) $ и $ overline{b} = (b_x; b_y) $, то найти угол между ними можно так:

$$ cos phi = frac{(overline{a},overline{b})}{|overline{a}| cdot |overline{b}|} = frac{a_xcdot b_x + a_y cdot b_y}{sqrt{a_x ^2 + a_y ^2}cdot sqrt{b_x ^2 + b_y ^2}} $$

Если вектора находятся в пространстве и координаты каждого из них заданы в виде: $ overline{a} = (a_x; a_y; a_z) $ и $ overline{b} = (b_x; b_y; b_z) $, то вычислить косинус угла следует по формуле:

$$ cos phi = frac{(overline{a},overline{b})}{|overline{a}| cdot |overline{b}|} = frac{a_xcdot b_x + a_y cdot b_y + a_z cdot b_z}{sqrt{a_x ^2 + a_y ^2 + a_z ^2}cdot sqrt{b_x ^2 + b_y ^2 + b_z ^2}} $$

Пояснение. В числителе расположено скалярное произведение векторов $ overline{a} $ и $ overline{b} $. Оно равно сумме произведений соответствующих координат. В знаменателе перемножаются модули (длины) векторов.

Примеры решений

Пример 1
Найти угол между векторами $ overline{a} = (2;4) $ и $ overline{b} = (3;1) $
Решение

Сначала находим косинус угла между векторами по формуле:

$$ cos phi = frac{(overline{a},overline{b})}{|overline{a}| cdot |overline{b}|} = frac{2cdot 3 + 4 cdot 1}{sqrt{2^2 + 4^2} cdot sqrt{3^2 + 1^2} } = frac{10}{sqrt{20} cdot sqrt{10}} = $$

$$ = frac{10}{sqrt{200}} = frac{1}{sqrt{2}} = frac{sqrt{2}}{2} $$

Теперь искомый угол $ phi $ находим по другой формуле:

$$ phi = arccos (cos phi) = arccos (cos frac{sqrt{2}}{2}) = 45^0 $$

Если не получается решить свою задачу, то присылайте её к нам. Мы предоставим подробное решение онлайн. Вы сможете ознакомиться с ходом вычисления и почерпнуть информацию. Это поможет своевременно получить зачёт у преподавателя!

Ответ
Угол между двумя векторами равен $ phi = 45^0 $
Пример 2
Найти угол $ phi $ между двумя векторами $ overline{a} = (8;-11;7) $ и $ overline{b} = (-2;-7;8) $
Решение

Подставляем координаты в формулу и вычисляем:

$$ cos phi = frac{8cdot (-2) + (-11)cdot (-7) + 7cdot 8}{sqrt{8^2+(-11)^2+7^2} cdot sqrt{(-2)^2+(-7)^2+8^2} } = $$

$$ = frac{-16+77+56}{sqrt{234} cdot sqrt{117}} = frac{117}{sqrt{234} cdot sqrt{117}} = $$

$$ = frac{sqrt{117}}{sqrt{234}} = frac{1}{sqrt{2}} = frac{sqrt{2}}{2} $$

Далее находим сам угол $ phi $ с помощью арккосинуса:

$$ phi = arccos frac{sqrt{2}}{2} = 45^0 $$

Ответ
Угол $ phi = 45^0 $

Понравилась статья? Поделить с друзьями:
  • Как составить недорогой свадебный букет
  • Нашел часы ксиаоми как
  • 220 12 как найти обмотки
  • Как можно найти парня корейца
  • Найди такой же предмет как в рамке