matrix_transformer

145
30 декабря 2019, 09:40

В 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);

Но я бы хотел хранить и видоизменять эту матрицу, например когда измениться позиция, на которую нужно сдвинуть прямоугольник, или если нужно будет его повернуть. Как я могу (и могу ли) получать значения из этой матрицы и изменять их.

Answer 1

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);

Это даст возможность оптимизатору выкинуть все умножения на нули/единицы и получить итоговый код столь же быстрый, как и прибавление пары координат к каждой точке.

READ ALSO
Как провильно работать с boost::geometry::index::rtree

Как провильно работать с boost::geometry::index::rtree

Меня интересует можно ли изменять значения в деревеК примеру, у меня есть дерево, содержащее пары прямоугольников и некоторый объект - могу...

130
Анонимные (лямбда) функции в C++

Анонимные (лямбда) функции в C++

Я хочу сохранить анонимную функцию в структуре, которая будет вызываться время от времени:

164
winapi SelectObject - DeleteObject - когда нужно удалять обьект

winapi SelectObject - DeleteObject - когда нужно удалять обьект

Вопрос в удалении HGDIOBJ результата возвращаемого функцией SelectObject()

142
Не получается создать службу виндовс

Не получается создать службу виндовс

Делаю лабораторную работуНужно создать программу, которая будет реализовывать со стороны сервера разные функции (создание документа, обновление...

173