В 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);
Это даст возможность оптимизатору выкинуть все умножения на нули/единицы и получить итоговый код столь же быстрый, как и прибавление пары координат к каждой точке.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Меня интересует можно ли изменять значения в деревеК примеру, у меня есть дерево, содержащее пары прямоугольников и некоторый объект - могу...
Я хочу сохранить анонимную функцию в структуре, которая будет вызываться время от времени:
Вопрос в удалении HGDIOBJ результата возвращаемого функцией SelectObject()
Делаю лабораторную работуНужно создать программу, которая будет реализовывать со стороны сервера разные функции (создание документа, обновление...