CGAL交叉圆和垂直线(不是线段)

时间:2016-04-08 09:14:46

标签: c++ computational-geometry intersection cgal

在CGAL中,我需要计算一组线和一组o圆之间的确切交点。从圆圈(可能具有无理半径但有理平方半径)开始,我应该计算穿过每个圆的x_extremal_points的垂直线(不是线段而是线),并计算每个圆与每条线的交点。

我正在使用CircularKernel和Circle_2作为圆圈,而Line_2则使用Line_2。 这是我如何计算圆和线以及如何检查它们是否相交的示例。

int main()
{

    Point_2 a = Point_2(250.5, 98.5);
    Point_2 b = Point_2(156, 139);

    //Radius is half distance ab
    Circular_k::FT aRad = CGAL::squared_distance(a, b);

    Circle_2 circle_a = Circle_2(a, aRad/4);

    Circular_arc_point_2 a_left_point = CGAL::x_extremal_point(circle_a, false);
    Circular_arc_point_2 a_right_point = CGAL::x_extremal_point(circle_a, true);

    //for example use only left extremal point of circle a
    CGAL::Bbox_2 a_left_point_bb = a_left_point.bbox();

    Line_2 a_left_line = Line_2(Point_2(a_left_point_bb.xmin(), a_left_point_bb.ymin()),
                                Point_2(a_left_point_bb.xmin(), a_left_point_bb.ymax()));

    if ( do_intersect(a_left_line, circle_a) ) {
        std::cout << "intersect";
    }
    else {
        std::cout << " do not intersect ";
    }

    return 0;
}

这个流程引发了这个例外:

CGAL error: precondition violation!
 Expression : y != 0
 File       : c:\dev\cgal-4.7\include\cgal\gmp\gmpq_type.h
 Line       : 371
 Explanation:
 Refer to the bug-reporting instructions at http://www.cgal.org/bug_report.html

我无法弄清楚如何计算交点。 另外,有更好的方法来计算线条吗?我知道ab_x_extremal_point函数,但它返回Circular_arc_point点,我无法构造直接通过它们的垂直线,而不使用Bounding框。

1 个答案:

答案 0 :(得分:0)

为了提高效率,你应该看看潜在的一维问题:在X轴上投射线条和圆圈,你有一组点和一组区间[Xc-R,Xc + R]。

如果L点越来越多,您可以通过二分法找到时间间隔Lg(L)的左边界,并扫描点列表直到右边界。这导致O(Lg(L).C + I)行为(C圆间隔),其中I是报告的交叉点数。

我猜这个使用活动列表的类似合并的过程,如果区间界限也被排序,你可以降低到O(L + C + I)。

2D的扩展是基本的。