Browse Source

python: expose new Range scaled() and scaledFromCenter() overloads.

next
Vladimír Vondruš 3 years ago
parent
commit
6212e36fda
  1. 17
      src/python/magnum/math.range.cpp
  2. 4
      src/python/magnum/test/test_math.py

17
src/python/magnum/math.range.cpp

@ -78,8 +78,8 @@ template<class T> void range(py::module_& m, py::class_<T>& c) {
.def("center", &T::center, "Range center") .def("center", &T::center, "Range center")
.def("translated", &T::translated, "Translated range") .def("translated", &T::translated, "Translated range")
.def("padded", &T::padded, "Padded ange") .def("padded", &T::padded, "Padded ange")
.def("scaled", &T::scaled, "Scaled range") .def("scaled", static_cast<T(T::*)(const typename T::VectorType&) const>(&T::scaled), "Scaled range")
.def("scaled_from_center", &T::scaledFromCenter, "Range scaled from the center") .def("scaled_from_center", static_cast<T(T::*)(const typename T::VectorType&) const>(&T::scaledFromCenter), "Range scaled from the center")
.def("contains", static_cast<bool(T::*)(const typename T::VectorType&) const>(&T::contains), .def("contains", static_cast<bool(T::*)(const typename T::VectorType&) const>(&T::contains),
"Whether given point is contained inside the range") "Whether given point is contained inside the range")
@ -102,6 +102,12 @@ template<class T> void range(py::module_& m, py::class_<T>& c) {
}, "Whether two ranges intersect"); }, "Whether two ranges intersect");
} }
template<class T> void rangeND(py::class_<T>& c) {
c
.def("scaled", static_cast<T(T::*)(typename T::VectorType::Type) const>(&T::scaled), "Scaled range")
.def("scaled_from_center", static_cast<T(T::*)(typename T::VectorType::Type) const>(&T::scaledFromCenter), "Range scaled from the center");
}
template<class T> void range2D(py::class_<T>& c) { template<class T> void range2D(py::class_<T>& c) {
py::implicitly_convertible<std::pair<std::tuple<typename T::VectorType::Type, typename T::VectorType::Type>, std::tuple<typename T::VectorType::Type, typename T::VectorType::Type>>, T>(); py::implicitly_convertible<std::pair<std::tuple<typename T::VectorType::Type, typename T::VectorType::Type>, std::tuple<typename T::VectorType::Type, typename T::VectorType::Type>>, T>();
@ -355,6 +361,13 @@ void mathRange(py::module_& root, py::module_& m) {
range(m, range2Dd); range(m, range2Dd);
range(m, range3Dd); range(m, range3Dd);
rangeND(range2D_);
rangeND(range2Di);
rangeND(range2Dd);
rangeND(range3D_);
rangeND(range3Di);
rangeND(range3Dd);
range2D(range2D_); range2D(range2D_);
range2D(range2Di); range2D(range2Di);
range2D(range2Dd); range2D(range2Dd);

4
src/python/magnum/test/test_math.py

@ -1267,7 +1267,9 @@ class Range(unittest.TestCase):
self.assertEqual(a2.center(), (2, 5)) self.assertEqual(a2.center(), (2, 5))
self.assertEqual(a2.translated((1, 2)), Range2Di((2, 5), (4, 9))) self.assertEqual(a2.translated((1, 2)), Range2Di((2, 5), (4, 9)))
self.assertEqual(a2.scaled((2, 4)), Range2Di((2, 12), (6, 28))) self.assertEqual(a2.scaled((2, 4)), Range2Di((2, 12), (6, 28)))
self.assertEqual(a2.scaled(2), Range2Di((2, 6), (6, 14)))
self.assertEqual(a2.scaled_from_center((2, 4)), Range2Di((0, -3), (4, 13))) self.assertEqual(a2.scaled_from_center((2, 4)), Range2Di((0, -3), (4, 13)))
self.assertEqual(a2.scaled_from_center(2), Range2Di((0, 1), (4, 9)))
# Verify that both integer and float variants work. There isn't # Verify that both integer and float variants work. There isn't
# anything else special about the 3D variant to need thorough testing. # anything else special about the 3D variant to need thorough testing.
@ -1276,7 +1278,9 @@ class Range(unittest.TestCase):
self.assertEqual(a3.center(), (1.0, 1.1, 1.65)) self.assertEqual(a3.center(), (1.0, 1.1, 1.65))
self.assertEqual(a3.translated((0.1, 0.2, 0.3)), Range3Dd((1.1, 0.4, 0.6), (1.1, 2.2, 3.3))) self.assertEqual(a3.translated((0.1, 0.2, 0.3)), Range3Dd((1.1, 0.4, 0.6), (1.1, 2.2, 3.3)))
self.assertEqual(a3.scaled((2.0, 0.5, 1.0/3.0)), Range3Dd((2.0, 0.1, 0.1), (2.0, 1.0, 1.0))) self.assertEqual(a3.scaled((2.0, 0.5, 1.0/3.0)), Range3Dd((2.0, 0.1, 0.1), (2.0, 1.0, 1.0)))
self.assertEqual(a3.scaled(2.0), Range3Dd((2.0, 0.4, 0.6), (2.0, 4.0, 6.0)))
self.assertEqual(a3.scaled_from_center((2.0, 0.5, 1.0/3.0)), Range3Dd((1.0, 0.65, 1.2), (1.0, 1.55, 2.1))) self.assertEqual(a3.scaled_from_center((2.0, 0.5, 1.0/3.0)), Range3Dd((1.0, 0.65, 1.2), (1.0, 1.55, 2.1)))
self.assertEqual(a3.scaled_from_center(2.0), Range3Dd((1.0, -0.7, -1.05), (1.0, 2.9, 4.35)))
def test_functions(self): def test_functions(self):
a = Range2D((1.5, 0.7), (4.5, 5.7)) a = Range2D((1.5, 0.7), (4.5, 5.7))

Loading…
Cancel
Save