在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框。
答案 0 :(得分:0)
为了提高效率,你应该看看潜在的一维问题:在X轴上投射线条和圆圈,你有一组点和一组区间[Xc-R,Xc + R]。
如果L点越来越多,您可以通过二分法找到时间间隔Lg(L)的左边界,并扫描点列表直到右边界。这导致O(Lg(L).C + I)行为(C圆间隔),其中I是报告的交叉点数。
我猜这个使用活动列表的类似合并的过程,如果区间界限也被排序,你可以降低到O(L + C + I)。
2D的扩展是基本的。