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

Geometry 如何用CGAL计算线段与圆的交点,geometry,computational-geometry,cgal,Geometry,Computational Geometry,Cgal,我一直把头撞在墙上,试图了解如何使用CGAL的圆形内核来计算线段(直线\圆弧\ 2)和圆(圆\ 2)之间的交点。不幸的是,循环内核的示例代码并不多,我也没有发现参考手册有多少帮助 下面是我认为可以工作的代码,但现在它甚至无法编译(使用最新系统编译器的Mac OS 10.9): #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 typedef CGAL::精确循环核2圈; 类型定义CGAL::点2 Pt2; typedef CGAL::Circle_2 Circ2; type

我一直把头撞在墙上,试图了解如何使用CGAL的圆形内核来计算线段(直线\圆弧\ 2)和圆(圆\ 2)之间的交点。不幸的是,循环内核的示例代码并不多,我也没有发现参考手册有多少帮助

下面是我认为可以工作的代码,但现在它甚至无法编译(使用最新系统编译器的Mac OS 10.9):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
typedef CGAL::精确循环核2圈;
类型定义CGAL::点2 Pt2;
typedef CGAL::Circle_2 Circ2;
typedef CGAL::Line_arc_2 LineArc2;
typedef CGAL::cpp11::result_of::type Res;
int main(){
int n=0;
circ2c=Circ2(Pt2(1,0),Pt2(0,1),Pt2(-1,0));
linearc2l=LineArc2(Pt2(0,-2),Pt2(0,2));
std::向量结果;
CGAL::交叉点(c、l、std::反向插入器(结果));
返回0;
}
我在第行的result_上得到一个错误:“error:no type name'result_type'in…”,第二个错误是“no available overloaded'='”可用于相交线

而且,因为这可能是一个后续问题,一旦它起作用:我如何实际到达向量中的交点?CGAL的文档向我建议,“结果”应该包含一对圆弧点和一个表示其多重性的无符号整数。这就是我在这种情况下得到的吗?更一般地说,是否有人知道使用圆形内核和球形内核相交例程的好教程


谢谢

因此,尽管CGAL参考手册中建议循环车道的交叉功能,但结果_在这里似乎不起作用

以下是一个不同的版本,它似乎可以正常工作,并且可以正确处理输出:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
typedef CGAL::精确循环核2圈;
类型定义CGAL::点2 Pt2;
typedef CGAL::Circle_2 Circ2;
typedef CGAL::Line_arc_2 LineArc2;
typedef std::成对IsectOutput;
使用名称空间std;
int main(){
int n=0;
circ2c=Circ2(Pt2(1.0,0.0)、Pt2(0.0,1.0)、Pt2(-1.0,0.0));
linearc2l=LineArc2(Pt2(0.0,-2.0),Pt2(0.0,2.0));
std::矢量输出;
typedef CGAL::Dispatch\u output\u迭代器>调度程序;
Dispatcher disp=CGAL::dispatch_output(std::back_inserter(output));
CGAL::交叉点(l、c、disp);

cout
result\u的
正在工作,但您请求的运算符不存在,您缺少输出迭代器。 不过,我同意这份文件有误导性,我会设法改正的

以下代码工作正常:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
typedef CGAL::精确循环核2圈;
类型定义CGAL::点2 Pt2;
typedef CGAL::Circle_2 Circ2;
typedef CGAL::Line_arc_2 LineArc2;
typedef boost::变量中断;
typedef CGAL::cpp11::result_of::type Res;
int main(){
circ2c=Circ2(Pt2(1,0),Pt2(0,1),Pt2(-1,0));
linearc2l=LineArc2(Pt2(0,-2),Pt2(0,2));
std::向量结果;
CGAL::交叉点(c、l、std::反向插入器(结果));
返回0;
}

好的,谢谢您的澄清。更新文档将非常有帮助!
#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;
}