неточный прямой скелет с CGAL

Когда я пытаюсь нарисовать прямой скелет с помощью CGAL, я получаю странные результаты (несимметричный скелет на симметричном многоугольнике).

Результат с ядрами:

  • Exact_predicates_inexact_constructions_kernel
  • Exact_predicates_exact_constructions_kernel

является Вот.

Использование ядра

  • картезианский

является Вот (это лучше, но оно ломается, когда я циклически сдвигаю точки в определении многоугольника).

Я использую этот код:

#include <vector>

#include <boost/shared_ptr.hpp>

// #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
// typedef CGAL::Exact_predicates_inexact_constructions_kernel K ;

// #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
// typedef CGAL::Exact_predicates_exact_constructions_kernel K ;

#include <CGAL/Cartesian.h>
typedef CGAL::Cartesian<float> K;

#include <CGAL/Polygon_2.h>
#include <CGAL/create_straight_skeleton_2.h>

typedef K::Point_2 Point_2;
typedef CGAL::Straight_skeleton_2<K> Ss;
typedef boost::shared_ptr<Ss> SsPtr;

int main() {
Point_2 pts[] = {
Point_2(0,  -1385),//top
Point_2(500, 0),//right half:
Point_2(300, 0),
Point_2(400, 173),
Point_2(200, 173),
Point_2(100, 0),
Point_2(-100, 0),//left half:
Point_2(-200, 173),
Point_2(-400, 173),
Point_2(-300, 0),
Point_2(-500, 0),
} ;
std::vector<Point_2> poly(pts,pts+11);

SsPtr iss = CGAL::create_interior_straight_skeleton_2(poly.begin(), poly.end(), K());

//printing for debugging
for ( Ss::Halfedge_const_iterator i = (*iss).halfedges_begin(); i != (*iss).halfedges_end(); ++i )  {
if ( i->is_bisector()){
std::cout<<"i ";
}
else {
std::cout<<"c ";
}
CGAL::Point_2<K> pa= i->opposite()->vertex()->point();
CGAL::Point_2<K> pb= i->vertex()->point();
std::cout << pa.x() << " " << pa.y() << " " << pb.x() << " " << pb.y() << std::endl;
}
return 0;
}

Кажется, проблема в том, что вырождения (4 линии, встречающиеся в одной точке) не вычисляются точно.

Я неправильно использую ядро? Как я должен использовать это, чтобы получить этот результат: http://i.imgur.com/3ggYocV.png

В качестве обходного пути я увеличиваю полигон на 100, затем вызываю CGAL, затем снова уменьшаю результат.


Заметки:

Скрипт для отображения результатов (для отладки): https://gist.github.com/anonymous/5497523

2

Решение

Справедливо.
Ответ в том, что вы используете ядро ​​надлежащим образом. Это не проблема с вашим кодом, это ошибка в CGAL, которую мне нужно исправить.
Jiri (ОП), пожалуйста, свяжитесь со мной лично (Фернандо Дот Каччола на Gmail), чтобы вы могли следить за этим.

4

Другие решения

Других решений пока нет …