22 #include "pybind11/pybind11.h"
23 #include "pybind11/eigen.h"
24 #include "pybind11/stl.h"
26 #include "ndarray/pybind11.h"
32 using namespace pybind11::literals;
40 [](
auto & mod,
auto &
cls)
mutable {
43 cls.attr(
"XX") = py::cast(int(AffineTransform::Parameters::XX));
44 cls.attr(
"YX") = py::cast(int(AffineTransform::Parameters::YX));
45 cls.attr(
"XY") = py::cast(int(AffineTransform::Parameters::XY));
46 cls.attr(
"YY") = py::cast(int(AffineTransform::Parameters::YY));
47 cls.attr(
"X") = py::cast(int(AffineTransform::Parameters::X));
48 cls.attr(
"Y") = py::cast(int(AffineTransform::Parameters::Y));
51 cls.def(py::init<>());
52 cls.def(py::init<Eigen::Matrix3d const &>(),
"matrix"_a);
53 cls.def(py::init<Eigen::Matrix2d const &>(),
"linear"_a);
54 cls.def(py::init<Eigen::Vector2d const &>(),
"translation"_a);
55 cls.def(py::init<Eigen::Matrix2d const &, Eigen::Vector2d const &>(),
56 "linear"_a,
"translation"_a);
57 cls.def(py::init<LinearTransform const &>(),
"linear"_a);
58 cls.def(py::init<Extent2D const &>(),
"translation"_a);
59 cls.def(py::init<LinearTransform const &, Extent2D const &>(),
"linear"_a,
"translation"_a);
62 cls.def(
"__mul__", &AffineTransform::operator*, py::is_operator());
64 py::overload_cast<Point2D const &>(&AffineTransform::operator(), py::const_));
66 py::overload_cast<Extent2D const &>(&AffineTransform::operator(), py::const_));
83 [](py::object self, py::object x, py::object y) {
84 return py::make_tuple(self.attr(
"applyX")(x, y),
85 self.attr(
"applyY")(x, y));
90 PyErr_Format(PyExc_IndexError,
"Invalid index for AffineTransform: %d", i);
91 throw py::error_already_set();
96 if (row < 0 || row > 2 || col < 0 || col > 2) {
97 PyErr_Format(PyExc_IndexError,
"Invalid index for AffineTransform: %d, %d",
row,
col);
98 throw py::error_already_set();
100 return (
self.getMatrix())(
row,
col);
103 if (i < 0 || i > 5) {
104 PyErr_Format(PyExc_IndexError,
"Invalid index for AffineTransform: %d", i);
105 throw py::error_already_set();
110 return py::str(py::cast(
self.getMatrix())); }
113 return py::str(
"AffineTransform(\n{}\n)").format(py::cast(
self.getMatrix()));
116 return py::make_tuple(
cls, py::make_tuple(py::cast(
self.getMatrix())));
120 cls.def(
"inverted", &AffineTransform::inverted);
121 cls.def(
"isIdentity", &AffineTransform::isIdentity);
124 cls.def(
"getMatrix", &AffineTransform::getMatrix);
125 cls.def(
"getParameterVector", &AffineTransform::getParameterVector);
126 cls.def(
"setParameterVector", &AffineTransform::setParameterVector);
127 cls.def(
"applyX", py::vectorize(&AffineTransform::applyX),
"x"_a,
"y"_a);
128 cls.def(
"applyY", py::vectorize(&AffineTransform::applyY),
"x"_a,
"y"_a);
129 cls.def_static(
"makeScaling", py::overload_cast<double>(&AffineTransform::makeScaling));
130 cls.def_static(
"makeScaling", py::overload_cast<double, double>(&AffineTransform::makeScaling));
131 cls.def_static(
"makeRotation", &AffineTransform::makeRotation,
"angle"_a);
132 cls.def_static(
"makeTranslation", &AffineTransform::makeTranslation,
"translation"_a);