Geometry 如何用CGAL计算线段与圆的交点
我一直把头撞在墙上,试图了解如何使用CGAL的圆形内核来计算线段(直线\圆弧\ 2)和圆(圆\ 2)之间的交点。不幸的是,循环内核的示例代码并不多,我也没有发现参考手册有多少帮助 下面是我认为可以工作的代码,但现在它甚至无法编译(使用最新系统编译器的Mac OS 10.9):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
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
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);
coutresult\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;
}