如何用CGAL计算线段和圆的交点

时间:2014-10-07 22:32:59

标签: geometry computational-geometry cgal

我一直在撞墙试图了解如何使用CGAL的圆形核来计算线段(Line_Arc_2)和圆(Circle_2)之间的交点。遗憾的是,循环内核的示例代码并没有多大帮助,而且我没有找到参考手册的帮助。

以下是我认为可行的代码,但现在它甚至无法编译(使用最新的系统编译器的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行上收到错误:&#34;错误:没有名为&#39; result_type&#39;在...&#34;,以及第二个错误,&#34;没有可行的超载&#39; =&#39;&#34;可用于交叉线。

此外,由于这可能是后续问题,一旦这个工作:我如何实际得到放在向量中的交叉点? CGAL的文档告诉我&#34;结果&#34;应该包含一对Circular_arc_point_2和一个表示其多样性的unsigned int。这是我在这种情况下实际得到的吗?更一般地说,有没有人知道使用循环内核和球形内核交集例程的好教程?

谢谢!

2 个答案:

答案 0 :(得分:0)

因此,尽管在CGAL参考手册中为CircularKernel的交叉函数提出了建议,但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/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;
}

答案 1 :(得分: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;
}