From 6750116a93755f76922cb8187defc6432a2d06e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Herna=CC=81ndez?= Date: Fri, 24 Dec 2021 13:22:47 +0100 Subject: [PATCH] Added Triangle pybind11 interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Alejandro Hernández --- src/python/CMakeLists.txt | 1 - src/python_pybind11/CMakeLists.txt | 1 + src/python_pybind11/src/Triangle.hh | 105 ++++++++++++++++++ .../src/_ignition_math_pybind11.cc | 5 + .../test}/Triangle_TEST.py | 0 5 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/python_pybind11/src/Triangle.hh rename src/{python => python_pybind11/test}/Triangle_TEST.py (100%) diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index 8ea584796..127190c2e 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -112,7 +112,6 @@ if (PYTHONLIBS_FOUND) SphericalCoordinates_TEST Spline_TEST Temperature_TEST - Triangle_TEST Triangle3_TEST Vector3Stats_TEST ) diff --git a/src/python_pybind11/CMakeLists.txt b/src/python_pybind11/CMakeLists.txt index 9f5600705..c5e5132b9 100644 --- a/src/python_pybind11/CMakeLists.txt +++ b/src/python_pybind11/CMakeLists.txt @@ -82,6 +82,7 @@ if (${pybind11_FOUND}) Rand_TEST RollingMean_TEST StopWatch_TEST + Triangle_TEST Vector2_TEST Vector3_TEST Vector4_TEST diff --git a/src/python_pybind11/src/Triangle.hh b/src/python_pybind11/src/Triangle.hh new file mode 100644 index 000000000..cb5d91d2b --- /dev/null +++ b/src/python_pybind11/src/Triangle.hh @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2021 Open Source Robotics Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +#ifndef IGNITION_MATH_PYTHON__TRIANGLE_HH_ +#define IGNITION_MATH_PYTHON__TRIANGLE_HH_ + +#include + +#include +#include + +#include + +namespace py = pybind11; +using namespace pybind11::literals; + +namespace ignition +{ +namespace math +{ +namespace python +{ +/// Define a pybind11 wrapper for an ignition::math::Triangle +/** + * \param[in] module a pybind11 module to add the definition to + * \param[in] typestr name of the type used by Python + */ +template +void defineMathTriangle(py::module &m, const std::string &typestr) +{ + using Class = ignition::math::Triangle; + py::class_(m, + typestr.c_str(), + py::buffer_protocol(), + py::dynamic_attr()) + .def(py::init<>()) + .def(py::init &, + const math::Vector2 &, + const math::Vector2 &>()) + .def(py::init()) + .def("set", + py::overload_cast &> + (&Class::Set), + "Set one vertex of the triangle.") + .def("set", + py::overload_cast &, + const math::Vector2 &, + const math::Vector2 &> + (&Class::Set), + "Set all vertices of the triangle.") + .def("valid", + &Class::Valid, + "Get whether this triangle is valid, based on triangle " + "inequality: the sum of the lengths of any two sides must be greater " + "than the length of the remaining side.") + .def("side", + &Class::Side, + "Get a line segment for one side of the triangle.") + .def("contains", + py::overload_cast&>(&Class::Contains, py::const_), + "Check if this triangle completely contains the given line " + "segment.") + .def("contains", + py::overload_cast&>(&Class::Contains, py::const_), + "Get whether this triangle contains the given point") + .def("intersects", + &Class::Intersects, + "Get whether the given line intersects this triangle.") + .def("perimeter", + &Class::Perimeter, + "Get the length of the triangle's perimeter.") + .def("area", &Class::Area, "Get the area of this triangle.") + .def("__copy__", [](const Class &self) { + return Class(self); + }) + .def("__deepcopy__", [](const Class &self, py::dict) { + return Class(self); + }, "memo"_a) + .def("__getitem__", + (&Class::operator[])) + .def("__getitem__", + py::overload_cast(&Class::operator[], py::const_)) + .def("__setitem__", + [](Class* vec, unsigned index, T val) { (*vec)[index] = val; }); +} + +} // namespace python +} // namespace gazebo +} // namespace ignition + +#endif // IGNITION_MATH_PYTHON__TRIANGLE_HH_ diff --git a/src/python_pybind11/src/_ignition_math_pybind11.cc b/src/python_pybind11/src/_ignition_math_pybind11.cc index cca30a6fe..9143041c1 100644 --- a/src/python_pybind11/src/_ignition_math_pybind11.cc +++ b/src/python_pybind11/src/_ignition_math_pybind11.cc @@ -24,6 +24,7 @@ #include "Rand.hh" #include "RollingMean.hh" #include "StopWatch.hh" +#include "Triangle.hh" #include "Vector2.hh" #include "Vector3.hh" #include "Vector4.hh" @@ -73,6 +74,10 @@ PYBIND11_MODULE(math, m) ignition::math::python::defineMathLine3(m, "Line3d"); ignition::math::python::defineMathLine3(m, "Line3f"); + ignition::math::python::defineMathTriangle(m, "Trianglei"); + ignition::math::python::defineMathTriangle(m, "Triangled"); + ignition::math::python::defineMathTriangle(m, "Trianglef"); + ignition::math::python::defineMathQuaternion(m, "Quaternioni"); ignition::math::python::defineMathQuaternion(m, "Quaterniond"); ignition::math::python::defineMathQuaternion(m, "Quaternionf"); diff --git a/src/python/Triangle_TEST.py b/src/python_pybind11/test/Triangle_TEST.py similarity index 100% rename from src/python/Triangle_TEST.py rename to src/python_pybind11/test/Triangle_TEST.py