Пересечение Circle_2 и Line_2 с CGAL - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь использовать CGAL, чтобы найти пересечение между двумя объектами: Circle_2 и Line_2.Код компилируется, но результат неверен.

Это мой код:

typedef CGAL::Exact_circular_kernel_2                  Circular_k;
typedef CGAL::Point_2<Circular_k>                      Point_2;
typedef CGAL::Circular_arc_point_2<Circular_k>         CircularArcPoint_2;
typedef CGAL::Direction_2<Circular_k>                  Direction_2;
typedef CGAL::Line_2<Circular_k>                       Line_2;
typedef CGAL::Circle_2<Circular_k>                     Circle_2;
typedef CGAL::CK2_Intersection_traits<Circular_k, Circle_2, Circle_2>::type Intersection_cc_result;
typedef CGAL::CK2_Intersection_traits<Circular_k, Circle_2, Line_2>::type Intersection_cl_result;
int main() {
    Point_2 a(0.15, 0.15), b(-0.15, -0.15), c(-0.15, 0.15), d(0.15, -0.15);
    double u = 0.5;
    double theta = atan(u);
    Line_2 r2(b, Direction_2(sin(-1.5708+theta),cos(-1.5708+theta)));
    Circle_2 cir(Point_2 (0,0), 4);
    std::vector<Intersection_cl_result> out1s;
    intersection(cir,r2,back_inserter(out1s));
    std::cout<<"size intersection: "<<out1s.size()<<std::endl;
    CircularArcPoint_2 v1s;   
    assign(v1s, out1s[0]);                                                
    std::cout <<"v1s = "<< v1s << std::endl;
    return 0;
}

Это мой вывод:

пересечение размеров: 2

v1s = EXT [0 / 1,0 / 1,0 / 1] EXT [0 / 1,0 / 1,0 / 1]

Я не понимаю, почему яполучить это: "v1s = EXT [0 / 1,0 / 1,0 / 1] EXT [0 / 1,0 / 1,0 / 1]".Точка "v1s" должна быть первым результатом пересечения Circle_2: "cir" и Line_2: "r2".

Что я могу сделать, чтобы определить эту точку пересечения?

1 Ответ

0 голосов
/ 17 мая 2019

решаемая.Изменил мой код на:

using boostRetVal = std::pair<CGAL::Circular_arc_point_2< CGAL::Filtered_bbox_circular_kernel_2<CGAL::Circular_kernel_2<CGAL::Cartesian<CGAL::Gmpq>, CGAL::Algebraic_kernel_for_circles_2_2<CGAL::Gmpq>>>> , unsigned >;
std::vector<Intersection_cl_result> out1s;
intersection(cir,r2,back_inserter(out1s));
const auto v1_s =std::get<0>( boost::get<boostRetVal>(out1s[0]));
const auto v1s =Point_2(to_double(v1_s.x()), to_double(v1_s.y()));  
...