2014-10-07 3 views
1

저는 벽에 머리를 두드려서 CGAL의 원형 커널을 사용하여 선분 (Line_Arc_2)과 선분 서클 (Circle_2). 안타깝게도 Circular Kernel의 예제 코드에는 그다지 많은 부분이 없기 때문에 참고 매뉴얼이 도움이되지 않습니다. 여기CGAL을 사용하여 선분과 원의 교점을 계산하는 방법

내가 일 것이라고 생각 코드,하지만 지금 심지어 (최신 시스템 컴파일러를 사용하여 맥 OS 10.9)를 컴파일되지 않습니다 : 나는 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 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_type'이 (가) '...'표시되지 않고 교차 선에 '실행 가능 오버로드 됨'= ''이 가능하다는 두 번째 오류가 발생했습니다.

또한 이것이 일단 작동하면 다음 질문 일 가능성이 높습니다. 실제로 벡터에 삽입 된 교차점에 어떻게 도달합니까? CGAL의 문서는 나에게 "결과"가 Circular_arc_point_2와 다중성을 나타내는 부호없는 int의 쌍을 포함해야한다고 제안합니다. 이 경우 내가 실제로 얻을 수있는 것입니까? 더 일반적으로, Circular Kernel과 Spherical Kernel 교차 루틴을 사용하는 좋은 지침서를 아는 사람이 있습니까?

감사합니다.

답변

0

그래서 CircularKernel의 교차 함수에 대한 CGAL 참조 설명서에 제안되었지만 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; 
} 
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