с ++ нормализует вектор до двойного?

Я пытаюсь следовать алгебраическому уравнению и преобразовать его в c ++.

Я застрял на:

Calculate the radius as r = ||dp||

где dp — вектор, и:

 dp = (dx,dy)

Согласно моему поиску в Google, вертикальные полосы в r = || dp || значит, мне нужно нормализовать вектор.

Я имею:

std::vector<double> dpVector;
dpVector.push_back(dx);
dpVector.push_back(dy);

Как я должен нормализовать это так, чтобы он возвращал двойное число как ‘r’?

1

Решение

Вы, вероятно, ищете евклидову норму, которая является геометрической длиной вектора и скалярным значением.

double r = std::sqrt(dx*dx + dy*dy);

В отличие от этого, нормализация вектора представляет собой то же направление, когда его длина (его евклидова норма;)) установлена ​​в 1. Это снова вектор.

Векторные объекты фиксированной размерности (особенно с низкой размерностью) могут быть представлены как тип класса.

Простой пример:

namespace wse
{
struct v2d { double x, y; };
inline double dot(v2d const &a, v2d const &b)
{
return a.x*b.x + a.y*b.y;
}
inline double len(v2d const &v) { return std::sqrt(dot(v,v)); }
}

// ...

wse::v2d dp{2.4, 3.4};
// ... Euclidean norm:
auto r = len(dp);
// Normalized vector
wse::v2d normalized_dp{dp.x/r, dp.y/r};
1

Другие решения

||dp|| является евклидовой нормой вектора dp. Взгляните на эту ссылку для более полного объяснения:

https://en.wikipedia.org/wiki/Euclidean_distance

Евклидова норма рассчитывается следующим образом: ||dp|| = sqrt(dp.dp), где . представляет собой скалярное произведение.

В C ++ это будет соответствовать ||dp|| = std::sqrt(dx*dx + dy*dy), Если бы у dp было больше измерений, вам лучше использовать библиотеку линейной алгебры для точечного произведения.

4

Нормализованный вектор имеет длину 1, это не то, что вам нужно, если вы ищете длину. Расчет длины — это первый шаг для нормализации вектора, но я не думаю, что вам нужен последний шаг!

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

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

r = std::sqrt(dx*dx + dy*dy);

Если вы действительно хотите нормализовать вектор, тогда все, что вы делаете в качестве последнего шага, это делите dx и dy на r. Это дает результирующий единичный вектор длины 1.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector