Я пытаюсь следовать алгебраическому уравнению и преобразовать его в 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’?
Вы, вероятно, ищете евклидову норму, которая является геометрической длиной вектора и скалярным значением.
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};
||dp||
является евклидовой нормой вектора dp. Взгляните на эту ссылку для более полного объяснения:
https://en.wikipedia.org/wiki/Euclidean_distance
Евклидова норма рассчитывается следующим образом: ||dp|| = sqrt(dp.dp)
, где . представляет собой скалярное произведение.
В C ++ это будет соответствовать ||dp|| = std::sqrt(dx*dx + dy*dy)
, Если бы у dp было больше измерений, вам лучше использовать библиотеку линейной алгебры для точечного произведения.
Нормализованный вектор имеет длину 1, это не то, что вам нужно, если вы ищете длину. Расчет длины — это первый шаг для нормализации вектора, но я не думаю, что вам нужен последний шаг!
Для расчета длины вам понадобится теорема Пифагора. Я не буду вдаваться в полное описание, но в основном вы берете квадратный корень из квадрата с обеих сторон.
Другими словами, умножьте dx и dy на себя, сложите их вместе, а затем получите квадратный корень из результата.
r = std::sqrt(dx*dx + dy*dy);
Если вы действительно хотите нормализовать вектор, тогда все, что вы делаете в качестве последнего шага, это делите dx и dy на r. Это дает результирующий единичный вектор длины 1.