Четырёхмерные вектора

• Интерфейс класса Vector4d аналогичен интерфейсу класса Vector3d:

class Vector4d
{
public:
    double x1, x2, x3, x4;
    Vector4d () {}
    Vector4d ( double a, double b, double c, double d ) : x1(a), x2(b), x3(c), x4(d) {}
 
    Vector4d operator - () const
    {
        return Vector4d ( - x1, - x2, - x3, - x4 );
    }

    Vector4d & operator += ( const Vector4d & v )
    {
        x1 += v.x1;
        x2 += v.x2;
        x3 += v.x3;
        x4 += v.x4;
        return * this;
    }

    Vector4d & operator -= ( const Vector4d & v )
    {
        x1 -= v.x1;
        x2 -= v.x2;
        x3 -= v.x3;
        x4 -= v.x4;
        return * this;
    }

    Vector4d & operator *= ( const double d )
    {
        x1 *= d;
        x2 *= d;
        x3 *= d;
        x4 *= d;
        return * this;
    }

    Vector4d & operator /= ( const double d )
    {
        x1 /= d;
        x2 /= d;
        x3 /= d;
        x4 /= d;
        return * this;
    }

    Vector4d & fill ( double d = 0 )
    {
        x1 = x2 = x3 = x4 = d;
        return * this;
    }

    bool operator ! () const
    {
        return !x1 && !x2 && !x3 && !x4;
    }

// Задание векторных норм
    Vector4d & setNorm1 ( double p = 1 ); // единичная норма
    Vector4d & setNorm2 ( double p = 1 ); // квадратичная норма
    Vector4d & setNormU ( double p = 1 ); // бесконечная норма
};

inline Vector4d operator + ( const Vector4d & a, const Vector4d & b )
{
    return Vector4d ( a.x1 + b.x1, a.x2 + b.x2, a.x3 + b.x3, a.x4 + b.x4 );
}

inline Vector4d operator - ( const Vector4d & a, const Vector4d & b )
{
    return Vector4d ( a.x1 - b.x1, a.x2 - b.x2, a.x3 - b.x3, a.x4 - b.x4 );
}
 
inline Vector4d operator * ( const Vector4d & a, const double d )
{
    return Vector4d ( a.x1 * d, a.x2 * d, a.x3 * d, a.x4 * d );
}
 
inline Vector4d operator / ( const Vector4d & a, const double d )
{
    return Vector4d ( a.x1 / d, a.x2 / d, a.x3 / d, a.x4 / d );
}
 
inline Vector4d operator * ( const double d, const Vector4d & a )
{
    return Vector4d ( a.x1 * d, a.x2 * d, a.x3 * d, a.x4 * d );
}

inline double operator * ( const Vector4d & a, const Vector4d & b )
{
    return a.x1 * b.x1 + a.x2 * b.x2 + a.x3 * b.x3 + a.x4 * b.x4;
}

inline double qmod ( const Vector4d & a )
{
    return a.x1 * a.x1 + a.x2 * a.x2 + a.x3 * a.x3 + a.x4 * a.x4;
}

inline bool operator == ( const Vector4d & a, const Vector4d & b )
{
    return a.x1 == b.x1 && a.x2 == b.x2 && a.x3 == b.x3 && a.x4 == b.x4;
}

inline bool operator != ( const Vector4d & a, const Vector4d & b )
{
    return a.x1 != b.x1 || a.x2 != b.x2 || a.x3 != b.x3 || a.x4 != b.x4;
}

// Вычисление векторных норм

double norm1 ( const Vector4d & v ); // единичная норма
double norm2 ( const Vector4d & v ); // квадратичная норма
double normU ( const Vector4d & v ); // бесконечная норма

• Гиперплоскость
class Plane4d
{
public:
    Vector4d norm;
    double   dist;

    Plane4d () {}
    Plane4d ( const Vector4d & v, const double & d ) : norm ( v ), dist ( d ) {}

    double operator % ( const Vector4d & v ) const
    {
        return norm * v + dist;
    }

    Plane4d operator - () const
    {
        return Plane4d ( - norm, - dist );
    }
};
• Пересечение четырёх гиперплоскостей
Def<Vector4d> intersection ( const Plane4d & plane1, const Plane4d & plane2, const Plane4d & plane3, const Plane4d & plane4 );
• Вычисление ближайшей точки к заданным плоскостям

Минимум суммы квадратов расстояний ( 2-норма )
Def<Vector4d> getNearPoint2 ( CCArrRef<Plane4d> & plane );
Минимум максимального расстояния ( бесконечная норма )
Def<Vector4d> getNearPointU ( CCArrRef<Plane4d> & plane );

Описание шаблона классов Def находится здесь.
Описание шаблона классов CCArrRef находится здесь.
Исходники находятся в файлах vector4d.h и vector4d.cpp.

Наверх