class Vector2d
{
template <typename T> void mul ( const T & t, ... )
{
*this = t ( *this );
}
template <typename T> void mul ( const T & t, double d )
{
x *= d; y *= d;
}
public :
double x, y;
Vector2d () {}
Vector2d ( double a, double b ) : x ( a ), y ( b ) {}
Vector2d & operator += ( const Vector2d & u )
{
x += u.x; y += u.y; return * this;
}
Vector2d & operator -= ( const Vector2d & u )
{
x -= u.x; y -= u.y; return * this;
}
Vector2d & operator *= ( const Vector2d & u )
{
x *= u.x; y *= u.y; return * this;
}
Vector2d & operator /= ( const Vector2d & u )
{
x /= u.x; y /= u.y; return * this;
}
template <typename T> Vector2d & operator *= ( const T & t )
{
mul ( t, t ); return * this;
}
Vector2d & operator /= ( const double d )
{
x /= d; y /= d; return * this;
}
Vector2d & fill ( double d = 0 )
{
x = y = d; return * this;
}
bool operator ! () const
{
return !x && !y;
}
Vector2d operator - () const
{
return Vector2d ( -x, -y );
}
Vector2d leftPerpendicular () const
{
return Vector2d ( -y, x );
}
Vector2d rightPerpendicular () const
{
return Vector2d ( y, -x );
}
// Задание векторных норм
Vector2d & setNorm1 ( double p = 1 ); // единичная норма
Vector2d & setNorm2 ( double p = 1 ); // квадратичная норма
Vector2d & setNormU ( double p = 1 ); // бесконечная норма
};
Класс Vector2d имеет два конструктора, а также несколько арифметических и логических операторов.
Для *= есть функция с параметром типа Vector2d и шаблонная функция.
Если параметр функции может быть преобразован к типу double, то тогда вектор умножается на это число.
Иначе считается, что параметр - это функтор и вектор преобразуется им.
Для /= есть две функции - с параметром типа Vector2d и double.
Функция-член fill заполняет вектор заданным значением ( нулевым по умолчанию ).
Оператор ! возвращает значение true для нулевого вектора.
Унарный минус возвращает противоположный вектор.
Функции-члены leftPerpendicular и rightPerpendicular возвращают векторы перпендикулярные данному и имеющие ту же длину.
Функции-члены setNorm... в случае, когда вектор ненулевой, делают соответсвующую норму вектора
равной значению | p | ( по умолчанию 1 ). Если параметр p - отрицательный, то вектор меняет направление на противоположное.
В случае, когда вектор нулевой - он остаётся нулевым.
const Vector2d null2d ( 0, 0 );
inline Vector2d operator + ( const Vector2d & a, const Vector2d & b )
{
return Vector2d ( a.x + b.x, a.y + b.y );
}
inline Vector2d operator - ( const Vector2d & a, const Vector2d & b )
{
return Vector2d ( a.x - b.x, a.y - b.y );
}
inline Vector2d operator * ( const Vector2d & a, const double & d )
{
return Vector2d ( a.x * d, a.y * d );
}
inline Vector2d operator * ( const double & d, const Vector2d & a )
{
return Vector2d ( a.x * d, a.y * d );
}
inline Vector2d operator / ( const Vector2d & a, const double & d )
{
return Vector2d ( a.x / d, a.y / d );
}
inline double operator * ( const Vector2d & a, const Vector2d & b )
{
return a.x * b.x + a.y * b.y;
}
inline double qmod ( const Vector2d & a )
{
return a.x * a.x + a.y * a.y;
}
inline double operator % ( const Vector2d & a, const Vector2d & b )
{
return a.x * b.y - a.y * b.x;
}
inline bool operator != ( const Vector2d & a, const Vector2d & b )
{
return a.x != b.x || a.y != b.y;
}
inline bool operator == ( const Vector2d & a, const Vector2d & b )
{
return a.x == b.x && a.y == b.y;
}
double norm1 ( const Vector2d & v ); // единичная норма
double norm2 ( const Vector2d & v ); // квадратичная норма
double normU ( const Vector2d & v ); // бесконечная норма
Примеры использования этого класса можно посмотреть в приложении DEMO. Исходники находятся в файлах vector2d.h, vector2d.cpp. Наверх
|