Вычислить медиальную ось с использованием cgal lib - PullRequest
0 голосов
/ 14 марта 2019

Я хочу вычислить что-то, что очень близко к преобразованию медиальной оси, используя скелетные методы cgal.Я написал очень простой код, основанный на примере вычислительного скелета cgal.

включает в себя:

#include<boost/shared_ptr.hpp>
#include<CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include<CGAL/Polygon_2.h>
#include<CGAL/create_straight_skeleton_2.h>
#include<CGAL/Polygon_with_holes_2.h>
#include<CGAL/create_straight_skeleton_from_polygon_with_holes_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K ;
typedef K::Point_2                    Point ;
typedef CGAL::Polygon_2<K>            Polygon_2 ;
typedef CGAL::Polygon_with_holes_2<K> Polygon_with_holes ;
typedef CGAL::Straight_skeleton_2<K>  Ss ;
typedef boost::shared_ptr<Ss>         SsPtr ;

typedef Ss::Vertex_const_handle     Vertex_const_handle ;
typedef Ss::Vertex_const_iterator   Vertex_const_iterator ;
typedef Ss::Halfedge_const_handle   Halfedge_const_handle ;
typedef Ss::Halfedge_const_iterator Halfedge_const_iterator ;

код

Polygon_2 outer ;

outer.push_back( Point(-1,-1) ) ;
outer.push_back( Point(0,-12) ) ;
outer.push_back( Point(1,-1) ) ;
outer.push_back( Point(12,0) ) ;
outer.push_back( Point(1,1) ) ;
outer.push_back( Point(0,12) ) ;
outer.push_back( Point(-1,1) ) ;
outer.push_back( Point(-12,0) ) ;

Polygon_2 hole ;

hole.push_back( Point(-1,0) ) ;
hole.push_back( Point(0,1 ) ) ;
hole.push_back( Point(1,0 ) ) ;
hole.push_back( Point(0,-1) ) ;

Polygon_with_holes poly( outer ) ;
poly.add_hole( hole ) ;

// You can pass the polygon via an iterator pair
SsPtr ss = CGAL::create_interior_straight_skeleton_2(poly);

, затем я перебираюкрая вычисленного скелета:

for ( Halfedge_const_iterator i = (*ss).halfedges_begin(); i != (*ss).halfedges_end(); ++i )
{
    if (i->is_inner_bisector())
    {
        cout << i->opposite()->vertex()->point() << "->" <<  i->vertex()->point() << endl;
    }
}

результат - совершенно неправильный скелет.Вход является многоугольником с отверстием в нем.Вычисленный скелет пересекает эту дыру, и его общая форма совершенно неверна.

Пожалуйста, помогите мне рассчитать правильный скелет для нее.

Спасибо.

...