Ответ
Да, я активно применяю векторную и линейную алгебру в C++ проектах, связанных с компьютерной графикой, физическим моделированием и обработкой данных.
Практическое применение:
- Графика и геймдев: При работе с OpenGL/DirectX или собственными движками использовал векторы для представления позиций, направлений, цветов (RGB), нормалей и текстурных координат.
- Машинное обучение: В задачах, связанных с линейной алгеброй (например, реализация простых классификаторов или 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}
Я знаком с ключевыми операциями: сложение/вычитание, скалярное/векторное произведение, нормализация, проекция, а также с преобразованиями (матрицы поворота, масштабирования).