【发布时间】:2016-07-29 11:52:11
【问题描述】:
在 CGAL 中,我需要计算一组线和一组圆之间的确切交点。从圆开始(可以有无理半径但有理 squared_radius)我应该计算通过每个圆的 x_extremal_points 的垂直线(不是线段而是线)并计算每个圆与每条线的交点。
我将 CircularKernel 和 Circle_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
我不知道如何计算交点。 另外,有没有更好的方法来计算线条?我知道 x_extremal_point 函数,但它返回 Circular_arc_point 点,我无法在不使用边界框的情况下直接构造一条穿过它们的垂直线。
【问题讨论】:
-
我猜你不能从一个点构造一条线这就是说:
a_left_point_bb是一个退化的盒子。你想做什么?通过a_left_point的垂直线? -
哦!那是一个退化的盒子:/!是的,我需要一条通过 a_left_point 的垂直线。然后我需要将它与集合中的所有圆相交(在示例中只有 circle_a)以获得所有相交点。 (一种扫描线算法)使用 Line_2(Point_2(a_left_point_bb.xmin(), a_left_point_bb.ymin()), Point_2(a_left_point_bb.xmin(), 0));有用。有没有更好的计算方法?如何获得交点?
-
您可以改为直接使用
Line_2(a_left_point, Point_2(a_left_point.x(), a_left_point.y() + 1))避免a_left_point的y 为0的情况
标签: c++ computational-geometry intersection cgal