当我试图用CGAL绘制直骨架时,我得到了奇怪的结果(对称多边形上的非对称骨架)。
内核的结果:
是here。
使用内核
是here(这是更好的,但是当我在多边形的定义中循环移动点时,它会中断。)
我正在使用此代码:
#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
答案 0 :(得分:4)
足够公平。 答案是您正在使用内核。这对你的代码来说不是问题,这是我需要解决的CGAL中的一个错误。 Jiri(OP),请私下联系我(gn的fernando dot cacciola),这样你就可以跟进了。