На использование, модификацию и распространение распространяется лицензия Boost Software License, Version 1.0. (См. сопроводительный файл LICENSE_1_0.txt или копию по адресу http://www.boost.org/LICENSE_1_0.txt). */ #include #include #include namespace gtl = boost::polygon; с использованием усилителя пространства имен::полигон::операторы;
// Сначала давайте превратим наш код использования многоугольника в общий // функцию, параметризованную типом многоугольника шаблон void test_polygon() { //lets build a 10x10 rectangle shaped polygon typedef typename gtl::polygon_traits::point_type Точка; Точка pts[] = {gtl::construct(0,0), gtl::construct(10,0), gtl::construct(10,10), gtl::construct(0,10), Polygon poly; gtl::set_points(poly, pts, pts+4);
//Теперь посмотрим, что мы можем сделать с этим многоугольником assert(gtl::area(poly) == 100.0f); assert(gtl::contains(poly, gtl::construct(5, 5))); assert(!gtl::contains(poly, gtl::construct(15, 5))); gtl::rectangle_datarect; assert(gtl::extents(rect, poly)); //get bounding box of poly assert(gtl::equivalence(rect, poly)); //hey, that's slick assert(gtl::winding(poly) == gtl::COUNTERCLOCKWISE); assert(gtl::perimeter(poly) == 40.0f);
//добавить 5 ко всем коордам поли gtl::convolve(poly, gtl::construct(5, 5)); //multiply all coords of poly by 2 gtl::scale_up(poly, 2); gtl::set_points(rect, gtl::point_data(10, 10), gtl::point_data(30, 30)); assert(gtl::equivalence(poly, rect)); }
Теперь давайте объявим наш собственный класс многоугольников //Oops, нам нужен класс точек для поддержки нашего многоугольника, давайте позаимствуем // Пример CPoint struct CPoint { int x; int y; };
// Мы должны заставить CPoint работать с бустерным полигоном, чтобы сделать наш полигон // который использует CPoint для работы с усилителем полигона namespace boost {namespace polygon { template<> struct geometry_concept{ typedef point_concept type; }; template<> struct point_traits{ typedef int coordinate_type;
static inline coordinate_type get(const CPoint& point, Ориентация_2d orient) {
} };
template<> struct point_mutable_traits{ typedef int coordinate_type;
static inline void set(CPoint& point, orientation_2d orient, int value) { point.x = value;
// Я ленивый и использую стил везде, чтобы избежать написания моих собственных классов //Мой игрушечный полигон — std::list< CPoint> typedef std::listCPolygon;
// Нам нужно специализировать наше многоугольное концептуальное отображение в бустерном многоугольнике namespace boost {namespace polygon { //first register CPolygon as a polygon_concept type template<> struct geometry_concept{ typedef polygon_concept type; };
Теперь не остается ничего, кроме как проверить, что наш многоугольник // Работа с библиотечными интерфейсами int main() { test_polygon(); //woot! возврат 0; }
Статья Custom Polygon раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.