CGALでは、線の集合と円の集合の間の正確な交点を計算する必要があります。円(無理な半径で有理数のsquared_radiusを持つことができます)から始めて、各円のx_extremal_points(線分ではなく線分)を通る縦線を計算し、各円と各線の交点を計算する必要があります。CGAL交差点と垂直線(セグメントではない)
私は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
私は交点を計算することができる方法を見つけ出すことはできません。 また、線を計算する良い方法はありますか?私はabotをx_extremal_point関数が知っているがCircular_arc_pointポイントを返し、私は垂直線を構築することはできません直接それらを通過するバウンディングボックスを使用せずに。
私は、一点から線を構成することはできないと思います。これは「a_left_point_bb」は縮退ボックスです。あなたは何をしたいのですか? 'a_left_point'を通る垂直線? – BeyelerStudios
ああ!それは退化した箱です:/!はい、私は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))を使用して(sweepline algのような)できます。それを計算する良い方法はありますか?どのように交点を取得するには? – Cers
代わりに 'Line_2(a_left_point、Point_2(a_left_point.x()、a_left_point.y()+ 1))'を使用して 'a_left_point'が' 0 'の場合を避けることができます – BeyelerStudios