60#if defined(__CUDACC__)
61 #define HD __host__ __device__
71#include <initializer_list>
96 template<
typename T,
size_t n>
106 return this->data[i];
111 return this->data[i];
125 template <
typename P>
128 typename std::remove_const<
decltype(this->data[0] * y[0])>::type res = 0;
129 for (
size_t j = 0; j < n; ++j)
130 res += this->data[j] * y[j];
142 template <
typename P>
145 numvector<
typename std::remove_const<
decltype(this->data[1] * y[2])>::type, 3> vec;
146 vec[0] = this->data[1] * y[2] - this->data[2] * y[1];
147 vec[1] = this->data[2] * y[0] - this->data[0] * y[2];
148 vec[2] = this->data[0] * y[1] - this->data[1] * y[0];
160 template <
typename P>
163 return (this->data[0] * y[1] - this->data[1] * y[0]);
174 template <
typename P>
177 for (
size_t i = 0; i < n; ++i)
190 template <
typename P>
193 for (
size_t i = 0; i < n; ++i)
206 template <
typename P>
209 for (
size_t i = 0; i < n; ++i)
210 this->data[i] += y[i];
222 template <
typename P>
225 for (
size_t i = 0; i < n; ++i)
226 this->data[i] -= y[i];
237 template <
typename P>
240 numvector<
typename std::remove_const<
decltype(this->data[0] + y[0])>::type, n> res;
241 for (
size_t i = 0; i < n; ++i)
242 res[i] = this->data[i] + y[i];
253 template <
typename P>
256 numvector<
typename std::remove_const<
decltype(this->data[0] - y[0])>::type, n> res;
257 for (
size_t i = 0; i < n; ++i)
258 res[i] = this->data[i] - y[i];
269 template <
typename P>
270 HD auto operator*(
const P c)
const ->
numvector<
typename std::remove_const<
decltype(this->data[0] * c)>::type, n>
272 numvector<
typename std::remove_const<
decltype(this->data[0] * c)>::type, n> res;
273 for (
size_t i = 0; i < n; ++i)
274 res[i] = c * this->data[i];
287 for (
size_t i = 0; i < n; ++i)
288 res[i] = -this->data[i];
310 template <
typename P>
313 for (
size_t i = 0; i < n; ++i)
314 if (this->data[i] != y[i])
326 template <
typename P>
329 return !(*
this == y);
340 HD auto norm1() const -> typename std::remove_const<typename std::remove_reference<decltype(this->
data[0])>::type>::type
342 typename std::remove_const<
typename std::remove_reference<
decltype(this->data[0])>::type>::type res = 0;
343 for (
size_t i = 0; i < n; ++i)
344 res += abs(this->data[i]);
354 HD auto norminf() const -> typename std::remove_const<typename std::remove_reference<decltype(this->
data[0])>::type>::type
356 typename std::remove_const<
typename std::remove_reference<
decltype(this->data[0])>::type>::type res = 0;
357 for (
size_t i = 0; i < n; ++i)
359 if (abs(this->data[i]) > res)
360 res = abs(this->data[i]);
373 template <
typename P =
double>
376 P res = *
this & *
this;
386 HD auto length2() const -> typename std::remove_const<typename std::remove_reference<decltype(this->
data[0])>::type>::type
388 return (*
this & *
this);
401 template <
typename P =
double>
402 HD auto unit(P newlen = 1) const ->
numvector<typename std::remove_const<decltype(this->
data[0] * newlen)>::type, n>
404 auto ilen =
static_cast<decltype(this-
>data[0] * newlen)>(newlen / std::max(this->
length(), 1e-16));
405 return (*
this * ilen);
418 template <
typename P =
double>
421 auto ilen =
static_cast<decltype(this-
>data[0] * newlen)>(newlen / std::max(this->
length(), 1e-16));
432 template <
typename P>
435 for (
size_t i = 0; i < n; ++i)
436 if (this->data[i] == s)
439 return static_cast<size_t>(-1);
448 template <
typename P>
449 operator std::set<P>()
const
452 for (
size_t i = 0; i < n; ++i)
453 newset.insert(this->data[i]);
462 template <
typename P>
463 operator std::vector<P>()
const
467 for (
size_t i = 0; i < n; ++i)
468 vec.push_back(this->data[i]);
494 for (
size_t i = 0; i < n - k; ++i)
495 res[i] = this->data[i + k];
496 for (
size_t i = n - k; i < n; ++i)
497 res[i] = this->data[i + k - n];
513 res[0] = -this->data[1];
514 res[1] = this->data[0];
526 template <
typename P = T>
529 for (
size_t i = 0; i < n; ++i)
542 template <
typename P = T>
546 res = ((*
this & v) / (v & v))* v;
560 return (*
this - y).length2();
570 template<
typename R =
double,
typename P>
573 R res = (*
this - y) & (*
this - y);
586 template <
typename P>
589 for (
size_t i = 0; i < n; ++i)
604 memcpy(this->data, vec.
data, n *
sizeof(T));
613 template <
typename P>
616 for (
size_t i = 0; i < n; ++i)
617 this->data[i] = vec[i];
630 memcpy(this->data, vec.
data, n *
sizeof(T));
640 template <
typename P>
643 for (
size_t i = 0; i < n; ++i)
644 this->data[i] = vec[i];
655 template <
typename P>
660 for (
size_t i = 0; i < n; ++i)
661 this->data[i] = vec[i];
665#if !defined(__CUDACC__)
676 for (
size_t i = 0; i < n; ++i)
677 this->data[i] = *(z.begin() + i);
688 template <
typename P>
693 for (
size_t i = 0; i < n; ++i)
694 this->data[i] = *(z.begin() + i);
708 template <
typename P,
size_t p>
711 size_t minPN = (p < n) ? p : n;
712 for (
size_t i = 0; i < minPN; ++i)
713 this->data[i] = vec[i];
714 for (
size_t i = minPN; i < n; ++i)
778 template<
typename T,
size_t n>
782 for (
size_t i = 0; i < n; ++i)
796 template<
typename T,
typename P,
size_t n>
799 numvector<
typename std::remove_const<
decltype(x[0] * c)>::type, n> res;
800 for (
size_t i = 0; i < n; ++i)
806#if !defined(__CUDACC__)
818 template<
typename T,
typename P,
typename R>
821 z = { x[1] * y[2] - x[2] * y[1], x[2] * y[0] - x[0] * y[2], x[0] * y[1] - x[1] * y[0] };
834 template<
typename T,
typename P,
size_t n>
837 numvector<
typename std::remove_const<
decltype(x[0] - y[0])>::type, n> p = x - y;
850 template<
typename R =
double,
typename T,
typename P,
size_t n>
867 template<
typename T,
size_t n>
871 for (
size_t j = 0; j < n - 1; ++j)
894 template<
typename T,
typename P,
typename R,
typename S,
size_t n>
895 inline std::pair<numvector<T, n>,
numvector<P, n>>&
operator+=(std::pair<
numvector<T, n>,
numvector<P, n>>& a,
const std::pair<
numvector<R, n>,
numvector<S, n>>& b)
898 a.second += b.second;
913 template<
typename T,
typename P,
typename R,
typename S,
size_t n>
915 std::pair<
numvector<
typename std::remove_const<
decltype(a.first[0] + b.first[0])>::type, n>,
numvector<
typename std::remove_const<
decltype(a.second[0] + b.second[0])>::type, n >>
917 std::pair<
numvector<
typename std::remove_const<
decltype(a.first[0] + b.first[0])>::type, n>,
numvector<
typename std::remove_const<
decltype(a.second[0] + b.second[0])>::type, n >> res;
918 res.first = a.first + b.first;
919 res.second = a.second + b.second;
933 template<
typename T,
typename P,
typename R,
size_t n>
951 template<
typename T,
typename P,
typename R,
size_t n>
953 std::pair<
numvector<
typename std::remove_const<
decltype(c * a.first[0])>::type, n>,
numvector<
typename std::remove_const<
decltype(c * a.second[0])>::type, n >>
955 std::pair<
numvector<
typename std::remove_const<
decltype(c * a.first[0])>::type, n>,
numvector<
typename std::remove_const<
decltype(c * a.second[0])>::type, n >> res;
956 res.first = c * a.first;
957 res.second = c * a.second;
971 template<
typename T,
typename P,
typename R,
size_t n>
973 std::pair<
numvector<
typename std::remove_const<
decltype(a.first[0] * c)>::type, n>,
numvector<
typename std::remove_const<
decltype(a.second[0] * c)>::type, n >>
989 template<
typename T,
typename P,
size_t n>
992 str <<
"{ " << x.first <<
", " << x.second <<
" }";
1110 template<
typename T,
typename P,
size_t n>
1115 return (x[0] * y[1] - x[1] * y[0]);
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
const numvector< T, n > & operator+() const
Оператор "+" унарного плюса
numvector< T, n > rotateLeft(size_t k) const
"Вращение" вектора на несколько позиций влево
R distTo(const numvector< P, n > &y)
Вычисление расстояния между двумя точками
auto operator*(const P c) const -> numvector< typename std::remove_const< decltype(this->data[0] *c)>::type, n >
Оператор "*" умножения вектора на число (вектор слева, число справа)
const T & operator[](size_t i) const
numvector< T, n > & operator-=(const numvector< P, n > &y)
Оператор "-=" вычитания другого вектора
numvector(const numvector< P, n > &vec)
Шаблонный конструктор копирования
numvector(const P c)
Конструктор, инициализирующий весь вектор одной и той же константой
numvector(const numvector< T, n > &vec)
Нешаблонный конструктор копирования
numvector< T, n > proj(const numvector< P, n > &v)
Проекция вектора на вектор v.
auto dist2To(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0] - y[0])>::type
Вычисление квадрата расстояния до другой точки
numvector(const std::vector< P > &vec)
Конструктор инициализации с помощью std::vector.
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
numvector(const std::initializer_list< P > &z)
Шаблонный конструктор инициализации списком
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
auto operator&(const numvector< P, n > &y) const -> typename std::remove_const< decltype(this->data[0] *y[0])>::type
Оператор "&" скалярного умножения
numvector< T, n > & operator+=(const numvector< P, n > &y)
Оператор "+=" прибавления другого вектора
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
numvector(const std::initializer_list< T > &z)
Нешаблонный конструктор инициализации списком
numvector< T, n > operator-() const
Оператор "-" унарного минуса
size_t member(const P &s) const
Проверка вхождения элемента в вектор
auto operator+(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0]+y[0])>::type, n >
Оператор "+" сложения двух векторов
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0] *newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
P length() const
Вычисление 2-нормы (длины) вектора
numvector< T, n > & operator/=(P c)
Оператор "/=" деления вектора на действительное число
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление inf-нормы вектора
numvector(const numvector< P, p > &vec, T add=0)
Явный конструктор инициализации вектором другой размерности
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление 1-нормы вектора
numvector< T, n > & operator=(const numvector< T, n > &vec)
Нешаблонный оператор копирования
numvector< T, n > operator=(const numvector< P, n > &vec)
Шаблонный оператор копирования
numvector()=default
Пустой конструктор
auto operator^(const numvector< P, 3 > &y) const -> numvector< typename std::remove_const< decltype(this->data[1] *y[2])>::type, 3 >
Оператор "^" векторного произведения
void normalize(P newlen=1.0)
Нормирование вектора на заданную длину
auto operator-(const numvector< P, n > &y) const -> numvector< typename std::remove_const< decltype(this->data[0] - y[0])>::type, n >
Оператор "-" вычитания двух векторов
bool operator==(const numvector< P, n > &y) const
Оператор "==" логического равенства
bool operator!=(const numvector< P, n > &y) const
Перегрузка оператора "!=" логического неравенства
numvector< T, n > & operator*=(P c)
Оператор "*=" домножения вектора на действительное число
numvector< T, n > operator*(double c, const numvector< T, n > &x)
Оператор "*" умножения вектора на число (число слева, вектор справа)
std::pair< numvector< T, n >, numvector< P, n > > & operator*=(std::pair< numvector< T, n >, numvector< P, n > > &a, R c)
Оператор домножения "*=" пары векторов на число (пара слева, число справа)
void cross(const numvector< T, 3 > &x, const numvector< P, 3 > &y, numvector< R, 3 > &z)
Быстрое вычисление векторного произведения
R dist(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление расстояния между двумя точками
auto operator+(const std::pair< numvector< T, n >, numvector< P, n > > &a, const std::pair< numvector< R, n >, numvector< S, n > > &b) -> std::pair< numvector< typename std::remove_const< decltype(a.first[0]+b.first[0])>::type, n >, numvector< typename std::remove_const< decltype(a.second[0]+b.second[0])>::type, n > >
Оператор сложения "+" для пар векторов
std::pair< numvector< T, n >, numvector< P, n > > & operator+=(std::pair< numvector< T, n >, numvector< P, n > > &a, const std::pair< numvector< R, n >, numvector< S, n > > &b)
Оператор прибавления "+=" для пар векторов
double cross3(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление третьей компоненты векторного произведения
auto dist2(const numvector< T, n > &x, const numvector< P, n > &y) -> typename std::remove_const< decltype(x[0] - y[0])>::type
Вычисление квадрата расстояния между двумя точками
std::ostream & operator<<(std::ostream &_stream, const std::vector< T > &_vec)
Переопределение оператора "<<" для вывода в поток вектора std::vector.