Что нужно для нормализации вектора?

пытаясь понять векторы немного больше.

какова необходимость нормализации вектора?

Если у меня есть вектор, N = (x, y, z)

Что вы на самом деле получаете, когда нормализуете его - я понимаю, что вы должны разделить x/|N| y/|N| & z/|N|. Мой вопрос в том, почему мы делаем это, я имею в виду, что мы получаем из этого уравнения?

в чем смысл или "внутренняя" цель этого.

немного математический вопрос, я извините, но я действительно не совсем понимаю в этой теме.

6 ответов


это немного похоже на вопрос, почему мы умножаем числа. Это всплывает все время.

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

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

в конце концов, мы не нужно нормализованные векторы (так же, как мы не нужно гамбургеры, мы могли бы жить без них, но кто-то собирается?), но аналогичная картина v / |v| появляется так часто, что люди решили дать ему имя и специальную нотацию (a ^ над вектором означает, что это нормализованный вектор) как ярлык.

нормализованные векторы (также известные как единичные векторы) в основном являются фактом жизни.


для любого вектора V = (x, y, z), |V| = sqrt(x*x + y*y + z*z) дает длину вектора.

когда мы нормализуем вектор, мы фактически вычисляем V/|V| = (x/|V|, y/|V|, z/|V|).

легко видеть, что нормированный Вектор имеет длину 1. Это потому, что:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|))
          = sqrt(x*x + y*y + z*z) / |V|
          = |V| / |V|
          = 1

следовательно, мы можем называть нормализованные векторы единичными векторами (т. е. векторами с единичной длиной).

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

обратите внимание, однако, что все вышеизложенное обсуждение было для 3-мерных декартовых координат (x, y, z). Но что мы на самом деле подразумеваем под Декартовыми координатами?

оказывается, чтобы определить вектор в 3D-пространстве, нам нужны некоторые опорные направления. Эти справочные направления канонически называются я, j, k (или i, j, k с маленькими колпачками на них - называемые "I cap", "J cap" и "k cap"). Любой вектор, который мы думаем как V = (x, y, z) может быть записано как V = xi + yj + zk. (Примечание: Я больше не буду называть их шапками, я просто назову их i, j, k). i, j и k-единичные векторы в направлениях X, Y и Z, образующие множество взаимно ортогональных единичных векторов. Они являются основой всей декартовой координатной геометрии.

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

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

потому что иногда имеет значение только величина. Это когда вы используете "обычное" число (что - то вроде 4 или 1/3 или 3.141592653 - нет, для всех вас, уродов ОКР, я не собираюсь ставить Pi там-это останется завершающим десятичным, только потому, что я воплощение зла). Вы же не хотите, чтобы бросить в досадном направлении, не так ли? Я имею в виду, действительно ли имеет смысл говорить, что я хочу 4 килограмма арбузов, обращенных на Запад? Если, конечно, вы не сумасшедший фанатик.

в других случаях имеет значение только направление. Тебе просто все равно. ибо величина, или величина просто слишком велика, чтобы постичь (что - то вроде бесконечности, только никто не знает, что такое бесконечность на самом деле-все приветствуют Великую бесконечность, ибо у него бесконечные Бесконечности... Извините, немного увлекся). В таких случаях мы используем нормализацию векторов. Например, это ничего не значит, что у нас есть линия, обращенная на 4 км к северу. Имеет смысл сказать, что у нас есть линия, обращенная на север. Так что же вы делаете? Вы избавляетесь от 4 км. Вы разрушаете значимость. Все, что у вас осталось, - это север (и приближается зима). Делайте это достаточно часто, и вам придется дать имя и обозначение тому, что вы делаете. Вы не можете просто назвать это "игнорированием величины". Это слишком грубо. Вы математик, и поэтому вы называете это "нормализацией", и вы даете ему обозначение "cap" (вероятно, потому, что вы хотели пойти на вечеринку, а не застрять с векторами).

кстати, поскольку я упомянул Декартовые координаты, вот обязательным XKCD: XKCD


чтение Godot Игровой Движок
документация о единичном векторе, нормализация и точечный продукт действительно имеют большой смысл. Вот статья:

единичные векторы Итак, мы знаем, что такое вектор. Она имеет направление и величину. Мы также знаем, как использовать их в Годо. Следующий шаг-изучение единичных векторов. Любой вектор с величиной длины 1 является единичным вектором. В 2D, представьте себе, рисуя круг радиус один. Этот круг содержит все единичные векторы, существующие для 2 измерений:

enter image description here Итак, что такого особенного в единичных векторах? Единичные векторы потрясающие. Другими словами, единичные векторы имеют несколько очень полезных свойств.

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

нормализация Принимая любые вектор и уменьшение его величины до 1,0 при сохранении его направления называется нормализацией. Нормализация выполняется путем деления X и y (и z в 3D) компонент вектора на его величину:

var a = Vector2(2,4)
var m = sqrt(a.x*a.x + a.y*a.y)

a.x / = m a.y / = m Как вы могли догадаться, если вектор имеет величину 0 (это означает, что это не вектор, а начало координат, также называемое нулевым вектором), происходит деление на ноль, и Вселенная проходит через второй Большой взрыв, за исключением обратной полярности, а затем обратно. Как в результате человечество в безопасности, но Годо напечатает ошибку. Помни! Вектор(0,0) не может быть нормированным!.

конечно, Vector2 и Vector3 уже предоставляют метод для этого:

a = a.normalized()

скалярное произведение Хорошо, точечный продукт является самой важной частью векторной математики. Без точечного продукта Quake никогда бы не был сделан. Это самый важный раздел учебника, поэтому обязательно поймите его правильно. Большинство людей, пытающихся понять векторную математику, сдаются здесь потому что, несмотря на то, как это просто, они не могут сделать голову или хвост из него. Почему? Вот почему, это так...

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

var s = a.x*b.x + a.y*b.y

да, в значительной степени. Умножьте x из вектора a на x из вектора b. Сделайте то же самое с y и добавьте его вместе. В 3D это почти то же:

var s = a.x*b.x + a.y*b.y + a.z*b.z

Я знаю, это совершенно бессмысленно! Вы даже можете сделать это со встроенной функцией:

var s = a.точка (b) Этот порядок двух векторов не имеет значения, a.dot (b) возвращает то же значение, что и b.точка (а).

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

enter image description here И вы понимаете, что пришло время отказаться от создания 3D игр или сложных 2D игр. Как такое простое может быть таким сложным? Кто-то другой должен будет сделать следующую Zelda или Call of Duty. Сверху вниз РПГ выглядят не так уж плохо. Да, я слышал, кто-то сделал это с одним из них. на пару...

Итак, это ваш момент, это ваше время сиять. НЕ СДАВАЙСЯ! На этом этапе этот учебник сделает резкий поворот и сосредоточится на том, что делает продукт dot полезным. Вот почему это полезно. Мы сфокусируем по-одному в случаях пользы для продукта многоточия, с применениями реальной жизни. Больше никаких бессмысленных формул. Формулы будут иметь смысл, как только вы узнаете, для чего они полезны.

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

var s = a.точка (b) Операция вернет одно число с плавающей запятой (но поскольку мы находимся в векторном мире, мы называем их скалярными, будем продолжать использовать этот термин с этого момента). Этот номер скажет нам следующее:

если число больше нуля, оба смотрят в одном направлении (угол между ними составляет 90° градусов). Если число равно нулю, то векторы формируются в L (угол между ними составляет 90 градусов). enter image description here Так что давайте подумаем о реальном сценарии использования. Представьте, что змея идет через лес, а затем есть враг поблизости. Как мы можем быстро сказать, если враг видел обнаруженную змею? Чтобы обнаружить его, враг должен уметь видеть змею. Скажем, тогда что:

змея в положении А. Враг на позиции Б. Противник смотрит в направлении вектора F.

enter image description here Итак, давайте создадим новый вектор BA, который идет от guard (B) к Snake (A), вычитая два:

var BA = A-B enter image description here В идеале, если охранник смотрел прямо на змея, чтобы установить зрительный контакт, будет делать это в том же направлении, что и вектор БА.

если точечный продукт между F и BA больше 0, то змея будет обнаружена. Это происходит потому, что мы сможем сказать, что охранник смотрит в его сторону:

if (BA.dot(F) > 0):
    print("!")

кажется, змея пока в безопасности.

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

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

если оба вектора направлены в одном и том же направлении (параллельно друг другу, угол между ними равен 0°), результирующий скаляр равен 1. Если оба вектора обращены к прямо противоположному направление (параллельное друг другу, но угол между ними равен 180°), результирующий скаляр равен -1. Это означает, что точечное произведение между единичными векторами всегда находится между диапазонами 1 и -1. Итак, Еще Раз...

если их угол 0°, то продукт многоточия 1. Если их угол равен 90°, то точечный продукт равен 0. Если их угол равен 180°, то точечное произведение равно -1. Э.. это странно знакомо... видел такое раньше... куда?

давайте возьмем два единичных вектора. Первый указывает вверх, второй тоже. но мы будем вращать его полностью от вверх (0°) до вниз (180° градусов)...

enter image description here При построении результирующего скаляра!

enter image description here Ага! Теперь все понятно, это Косинуса!

так можно сказать, как правило...

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

var angle_in_radians = acos( a.dot(b) )

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

путем сравнения нормали точки столкновения с ранее вычисленным углом.

красота этого в том, что тот же код работает точно так же и без изменений в 3D. Векторная математика во многом независима от размера, поэтому добавление или удаление оси добавляет очень мало сложности.


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


вы делаете его длину 1-нахождение единичного вектора, который указывает в том же направлении.

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


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