В boost::geometry есть алгоритм transform, который, используя различные стратегии, позволяет производить афинные преобразования. Меня интересует использование matrix_transformer для этих целей. Как я понял, если, к примеру, мне нужно сдвинуть прямоугольник на x, y позицию, то для этого нужна матрица вида:
namespace bg = boost::geometry;
bg::strategy::transform::matrix_transform<float, 2, 2> trans{1, 0, x, 0, 1, y, 0, 0, 1};
bg::model::box box{/*here two floats points*/};
bg::transform(box, box, trans);
Но я бы хотел хранить и видоизменять эту матрицу, например когда измениться позиция, на которую нужно сдвинуть прямоугольник, или если нужно будет его повернуть. Как я могу (и могу ли) получать значения из этой матрицы и изменять их.
matrix_transformer использует внутри boost::qvm::mat, поэтому можно работать с ним напрямую:
namespace bg = boost::geometry;
boost::qvm::mat<float, 3, 3> trans_matr {1, 0, x, 0, 1, y, 0, 0, 1};
// ...
boost::geometry::strategy::transform::matrix_transformer<float, 2, 2> trans{trans_matr};
доступ к текущей матрице для всех матричных трансформаций возможен через:
trans.matrix();
boost::qvm::mat в свою очередь может быть преобразован в произвольный матричный тип.
Но если трансформации ограничиваются только, например, сдвигом, то эффективней будет не хранить всю матрицу в течение длительного времени, а конструировать её непосредственно перед использованием:
boost::geometry::strategy::transform::translate_transformer<float, 2, 2> trans{x, y};
boost::geometry::transform(box, box, trans);
Это даст возможность оптимизатору выкинуть все умножения на нули/единицы и получить итоговый код столь же быстрый, как и прибавление пары координат к каждой точке.
Продвижение своими сайтами как стратегия роста и независимости