Я хочу представить 2D-форму таким образом, чтобы с ней можно было взаимодействовать, как если бы она была вектором точек, в частности, я хочу иметь возможность вызывать на ней operator[]
и at()
и возвращать ссылки на вещи, которые действуют как 2D-точки. . В настоящее время я просто использую класс, единственная переменная-член которого является вектором точек, и в котором для его элементов поточечно определены различные арифметические и геометрические операции.
Однако в других частях моего кода мне нужно рассматривать вектор из n точек как элемент 2n-мерного пространства и выполнять на нем базовую линейную алгебру (например, проецировать вектор на заданное подпространство R ^ 2n). В настоящее время я создаю объект Eigen::VectorXd
каждый раз, когда хочу это сделать, а затем конвертирую обратно после выполнения этих операций. Я не хочу этого делать, так как конвертирую достаточно часто, и все копирование становится заметным источником неэффективности.
Если бы я хранил данные в виде плоского массива чисел типа double / float / int, я мог бы преобразовать указатель на его n-й элемент в указатель на Point (члены которого были бы просто парой чисел double / float / int). Однако, поскольку я не знаю внутреннего представления, которое Эйген использует для векторов (и оно вполне может измениться), это невозможно.
Есть ли разумный способ решить эту проблему? Я мог бы просто использовать Eigen::Vector
s везде, но я действительно хочу, чтобы большая часть кода могла делать вид, что имеет дело с набором точек.