Разбираетесь ли вы в векторной алгебре?

«Разбираетесь ли вы в векторной алгебре?» — вопрос из категории Other, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Практическое применение:

  1. Графика и геймдев: При работе с OpenGL/DirectX или собственными движками использовал векторы для представления позиций, направлений, цветов (RGB), нормалей и текстурных координат.
  2. Машинное обучение: В задачах, связанных с линейной алгеброй (например, реализация простых классификаторов или PCA), использовал библиотеку Eigen для эффективных матричных операций.

Пример реализации базового 3D вектора с использованием шаблонов C++:

template<typename T>
struct Vec3 {
    T x, y, z;

    Vec3 operator+(const Vec3& rhs) const { return {x + rhs.x, y + rhs.y, z + rhs.z}; }
    Vec3 operator-(const Vec3& rhs) const { return {x - rhs.x, y - rhs.y, z - rhs.z}; }
    Vec3 operator*(T scalar) const        { return {x * scalar, y * scalar, z * scalar}; }

    // Скалярное произведение (dot product)
    T dot(const Vec3& rhs) const { return x * rhs.x + y * rhs.y + z * rhs.z; }

    // Векторное произведение (cross product)
    Vec3 cross(const Vec3& rhs) const {
        return { y * rhs.z - z * rhs.y,
                 z * rhs.x - x * rhs.z,
                 x * rhs.y - y * rhs.x };
    }

    // Длина вектора
    T length() const { return std::sqrt(dot(*this)); }

    // Нормализация
    Vec3 normalized() const {
        T len = length();
        if (len > std::numeric_limits<T>::epsilon()) {
            return *this * (static_cast<T>(1) / len);
        }
        return *this; // или вернуть нулевой вектор
    }
};

// Использование:
using Vec3f = Vec3<float>;
Vec3f a{1.0f, 0.0f, 0.0f};
Vec3f b{0.0f, 1.0f, 0.0f};
float dotResult = a.dot(b); // 0.0 (перпендикулярны)
Vec3f crossResult = a.cross(b); // {0.0, 0.0, 1.0}

Я знаком с ключевыми операциями: сложение/вычитание, скалярное/векторное произведение, нормализация, проекция, а также с преобразованиями (матрицы поворота, масштабирования).