2014-10-07 45 views
1

我一直在撞墙,试图了解如何使用CGAL的圆内核来计算线段(Line_Arc_2)和线段一个圆圈(Circle_2)。不幸的是,循环内核的示例代码没有太多,我没有找到参考手册很多帮助。如何用CGAL计算线段和圆的交点

这里是我想会的工作代码,但现在它不会(使用最新的系统编译器的Mac OS 10.9),甚至编译:

#include <vector> 
#include <iterator> 
#include <CGAL/Exact_circular_kernel_2.h> 
#include <CGAL/Circular_kernel_intersections.h> 
#include <CGAL/intersections.h> 
#include <CGAL/result_of.h> 
#include <CGAL/iterator.h> 
#include <CGAL/point_generators_2.h> 
#include <boost/bind.hpp> 

typedef CGAL::Exact_circular_kernel_2  CircK; 
typedef CGAL::Point_2<CircK>     Pt2; 
typedef CGAL::Circle_2<CircK>    Circ2; 
typedef CGAL::Line_arc_2<CircK>    LineArc2; 
typedef CGAL::cpp11::result_of<CircK::Intersect_2(Circ2,LineArc2)>::type Res; 

int main(){ 
    int n = 0; 
    Circ2 c  = Circ2(Pt2(1,0), Pt2(0,1), Pt2(-1, 0)); 
    LineArc2 l = LineArc2(Pt2(0,-2), Pt2(0,2)); 

    std::vector<Res> result; 
    CGAL::intersection(c, l, std::back_inserter(result)); 

    return 0; 
} 

我上的result_of行的错误:“错误:在...中没有类型命名为“result_type”,并且第二个错误是“不存在可重载”='“可用于相交线。

另外,因为这可能是后续问题,一旦这是工作:我怎么实际上得到在交叉点放入向量? CGAL的文档建议我“结果”应该包含一对Circular_arc_point_2和一个表示其多重性的无符号整数。这是我在这种情况下实际得到的吗?更一般地说,有没有人知道使用循环内核和球形内核交叉例程的好教程?

谢谢!

回答

0

因此,似乎result_of在这里不起作用,尽管在CGAL参考手册中提到了CircularKernel的交集函数。

这是一个不同的版本,似乎工作,并能妥善处理输出:

#include <vector> 
#include <iterator> 
#include <CGAL/Exact_circular_kernel_2.h> 
#include <CGAL/Circular_kernel_intersections.h> 
#include <CGAL/intersections.h> 
#include <CGAL/iterator.h> 

typedef CGAL::Exact_circular_kernel_2  CircK; 
typedef CGAL::Point_2<CircK>     Pt2; 
typedef CGAL::Circle_2<CircK>    Circ2; 
typedef CGAL::Line_arc_2<CircK>    LineArc2; 
typedef std::pair<CGAL::Circular_arc_point_2<CircK>, unsigned> IsectOutput; 

using namespace std; 

int main(){ 
    int n = 0; 
    Circ2 c  = Circ2(Pt2(1.0,0.0), Pt2(0.0,1.0), Pt2(-1.0, 0.0)); 
    LineArc2 l = LineArc2(Pt2(0.0,-2.0), Pt2(0.0,2.0)); 

    std::vector<IsectOutput> output; 

    typedef CGAL::Dispatch_output_iterator< CGAL::cpp11::tuple<IsectOutput>, 
         CGAL::cpp0x::tuple< std::back_insert_iterator<std::vector<IsectOutput> > > > Dispatcher; 
    Dispatcher disp = CGAL::dispatch_output<IsectOutput>(std::back_inserter(output)); 

    CGAL::intersection(l, c, disp); 

    cout << output.size() << endl; 
    for(const auto& v : output){ 
    cout << "Point: (" << CGAL::to_double(v.first.x()) << ", " << CGAL::to_double(v.first.y()) << "), Mult: " 
    << v.second << std::endl; 
    } 


    return 0; 
} 
0

result_of是工作,但你所要求的不存在运营商,你缺少的输出迭代器。 但是,我同意该文件具有误导性。我会尽力修复它。

下面的代码工作正常:

#include <vector> 
#include <iterator> 
#include <CGAL/Exact_circular_kernel_2.h> 
#include <CGAL/Circular_kernel_intersections.h> 
#include <CGAL/intersections.h> 
#include <CGAL/result_of.h> 
#include <CGAL/iterator.h> 
#include <CGAL/point_generators_2.h> 
#include <boost/bind.hpp> 

typedef CGAL::Exact_circular_kernel_2  CircK; 
typedef CGAL::Point_2<CircK>     Pt2; 
typedef CGAL::Circle_2<CircK>    Circ2; 
typedef CGAL::Line_arc_2<CircK>    LineArc2; 
typedef boost::variant<std::pair<CGAL::Circular_arc_point_2<CircK>, unsigned> > InterRes; 
typedef CGAL::cpp11::result_of<CircK::Intersect_2(Circ2,LineArc2,std::back_insert_iterator<std::vector<InterRes> >)>::type Res; 

int main(){ 
    Circ2 c  = Circ2(Pt2(1,0), Pt2(0,1), Pt2(-1, 0)); 
    LineArc2 l = LineArc2(Pt2(0,-2), Pt2(0,2)); 

    std::vector<InterRes> result; 
    CGAL::intersection(c, l, std::back_inserter(result)); 

    return 0; 
} 
+0

好,感谢澄清。更新文档将是最有帮助的! – Sam 2014-10-09 03:38:45