toydesigner-cgal/tdcgal/plane/plane.cpp

138 lines
6.4 KiB
C++

#include <pybind11/operators.h>
#include <pybind11/pybind11.h>
#include <CGAL/Simple_cartesian.h>
#include "../cgal.hpp"
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
typedef Kernel::Line_2 Line_2;
typedef Kernel::Direction_2 Direction_2;
typedef Kernel::Vector_2 Vector_2;
typedef Kernel::Ray_2 Ray_2;
typedef Kernel::FT FT;
template <typename T, typename U> FT squared_distance(const T &a, const U &b) {
return CGAL::squared_distance(a, b);
}
namespace py = pybind11;
void init_plane(py::module_ &m) {
py::class_<Point_2>(m, "Point_2")
.def(py::init<double, double>())
.def("x", &Point_2::x)
.def("y", &Point_2::y)
.def("hx", &Point_2::hx)
.def("hy", &Point_2::hy)
.def("hw", &Point_2::hw)
.def(
"squared_distance",
[](const Point_2 &a, const Point_2 &b) {
return CGAL::squared_distance(a, b);
},
"返回两个点的平方距离")
.def(py::self == py::self);
py::class_<Segment_2>(m, "Segment_2")
.def(py::init<Point_2, Point_2>())
.def("_source", &Segment_2::source)
.def("_target", &Segment_2::target)
.def("min", &Segment_2::min, "返回线段的端点中较小的那个")
.def("max", &Segment_2::max, "返回线段的端点中较大的那个")
.def("_squared_length", &Segment_2::squared_length, "返回线段的平方长度")
.def("opposite", &Segment_2::opposite, "返回反向的线段")
.def("has_on", &Segment_2::has_on, "判断点是否在线段上")
.def("supporting_line", &Segment_2::supporting_line,
"返回与线段共线的直线")
.def("is_degenerate", &Segment_2::is_degenerate, "判断线段端点是否重合")
.def("is_horizontal", &Segment_2::is_horizontal, "判断线段是否水平")
.def("is_vertical", &Segment_2::is_vertical, "判断线段是否垂直")
.def(py::self == py::self)
.def(py::self != py::self);
py::class_<Ray_2>(m, "Ray_2")
.def(py::init<Point_2, Point_2>())
.def(py::init<Point_2, Vector_2>())
.def(py::init<Point_2, Direction_2>())
.def(py::init<Point_2, Line_2>())
.def("_source", &Ray_2::source)
.def("_direction", &Ray_2::direction)
.def("has_on", &Ray_2::has_on, "判断点是否在射线上")
.def(
"point", [](const Ray_2 &r, FT i) { return r.point(i); },
"返回射线上任意一点, 根据`i`值返回射线`r`上的某一点, i=0返回起点, "
"i>=0")
.def("supporting_line", &Ray_2::supporting_line, "返回与射线共线的直线")
.def("opposite", &Ray_2::opposite, "返回起点相同但反向的射线")
.def("is_degenerate", &Ray_2::is_degenerate, "判断射线是否退化")
.def("is_horizontal", &Ray_2::is_horizontal, "判断射线是否水平")
.def("is_vertical", &Ray_2::is_vertical, "判断射线是否垂直")
.def(py::self == py::self)
.def(py::self != py::self);
py::class_<Line_2>(m, "Line_2")
.def(py::init<double, double, double>())
.def(py::init<Point_2, Point_2>())
.def(py::init<Point_2, Direction_2>())
.def(py::init<Point_2, Vector_2>())
.def(py::init<Segment_2>())
.def(py::init<Ray_2>())
.def("_a", &Line_2::a)
.def("_b", &Line_2::b)
.def("_c", &Line_2::c)
.def("x_at_y", &Line_2::x_at_y, "返回给定y值处的x值")
.def("y_at_x", &Line_2::y_at_x, "返回给定x值处的y值")
.def(
"point", [](const Line_2 &l, FT i) { return l.point(i); },
"根据`i`值返回直线`l`上的某一点, i=0返回起点, i>=0")
.def("direction", &Line_2::direction, "返回直线的方向")
.def("to_vector", &Line_2::to_vector, "返回直线的方向向量")
.def("opposite", &Line_2::opposite, "返回反向的直线")
.def("has_on", &Line_2::has_on, "判断点是否在直线上")
.def("has_on_positive_side", &Line_2::has_on_positive_side,
"判断点是否在直线的正方向上")
.def("has_on_negative_side", &Line_2::has_on_negative_side,
"判断点是否在直线的负方向上")
.def("projection", &Line_2::projection, "返回点到直线的正交投影")
.def("perpendicular", &Line_2::perpendicular, "返回与直线垂直的直线")
.def("transform", &Line_2::transform, "返回经过变换后的直线")
.def("is_degenerate", &Line_2::is_degenerate, "判断直线是否退化")
.def("is_horizontal", &Line_2::is_horizontal, "判断直线是否水平")
.def("is_vertical", &Line_2::is_vertical, "判断直线是否垂直")
.def(py::self == py::self)
.def(py::self != py::self);
m.def("squared_distance", &squared_distance<Point_2, Point_2>,
"返回两个点的平方距离");
m.def("squared_distance", &squared_distance<Point_2, Segment_2>,
"返回点到线段的平方距离");
m.def("squared_distance", &squared_distance<Point_2, Ray_2>,
"返回点到射线的平方距离");
m.def("squared_distance", &squared_distance<Point_2, Line_2>,
"返回点到直线的平方距离");
m.def("squared_distance", &squared_distance<Segment_2, Point_2>,
"返回线段到点的平方距离");
m.def("squared_distance", &squared_distance<Segment_2, Segment_2>,
"返回线段到线段的平方距离");
m.def("squared_distance", &squared_distance<Segment_2, Ray_2>,
"返回线段到射线的平方距离");
m.def("squared_distance", &squared_distance<Segment_2, Line_2>,
"返回线段到直线的平方距离");
m.def("squared_distance", &squared_distance<Ray_2, Point_2>,
"返回射线到点的平方距离");
m.def("squared_distance", &squared_distance<Ray_2, Segment_2>,
"返回射线到线段的平方距离");
m.def("squared_distance", &squared_distance<Ray_2, Ray_2>,
"返回射线到射线的平方距离");
m.def("squared_distance", &squared_distance<Ray_2, Line_2>,
"返回射线到直线的平方距离");
m.def("squared_distance", &squared_distance<Line_2, Point_2>,
"返回直线到点的平方距离");
m.def("squared_distance", &squared_distance<Line_2, Segment_2>,
"返回直线到线段的平方距离");
m.def("squared_distance", &squared_distance<Line_2, Ray_2>,
"返回直线到射线的平方距离");
m.def("squared_distance", &squared_distance<Line_2, Line_2>,
"返回直线到直线的平方距离");
};