diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_compare_at_x b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_compare_at_x index 281059c478c..2ee70ee5dec 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_compare_at_x +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_compare_at_x @@ -9,7 +9,8 @@ s -1 3 3 -1 e 3 2 0 0 -3 0 3 0 # Curve #2: part of the upper portion of the right branch of the hyperbola # (x/2)^2 - (y/1)^2 = 1 -h 2 1 0 0 3 1.118034 2 0 +# given by its intersections with x=2 and x=3. +i 1 -4 0 0 0 -4 3 1.118034 0 0 0 1 0 -3 2 0 0 0 0 1 0 -2 # Curve #3: the upper part of the circle x^2 + y^2 = 2^2. e 2 2 0 0 -2 0 2 0 # Curve #4: the lower part of the circle x^2 + (y-3)^2 = 1^2 diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw index 80da0e9c532..a6f1fe79ccf 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw @@ -17,8 +17,8 @@ s 0 0 0 -3 e 3 1 0 -1 -3 -1 0 0 # Curve #6: a horizontal segment s -2 0 0 0 -# curve #7: a portion of the hyperbola y + 1 = 1/(x + 1) -a 0 0 1 1 1 0 -0.9 9 0 0 +# curve #7: a segment +s -1 1 0 0 #----------------------------------------------------------- # Number of "stand alone" points 1 diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw_full b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw_full index 5dfbbce6166..f76ba0a4a12 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw_full +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_between_cw_full @@ -17,8 +17,8 @@ s 0 0 0 -3 e 3 1 0 -1 -3 -1 0 0 # Curve #6: a horizontal segment s -2 0 0 0 -# curve #7: a portion of the hyperbola y + 1 = 1/(x + 1) -a 0 0 1 1 1 0 -0.9 9 0 0 +# curve #7: a segment +s -1 1 0 0 #----------------------------------------------------------- # Number of "stand alone" points 1 diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_in_x_range b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_in_x_range index b6d3869922a..9a15d599ef0 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_in_x_range +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_is_in_x_range @@ -9,8 +9,9 @@ e 5 3 0 0 0 3 5 0 s -1 3 2 4 # Curve #2: a vertical segment s 0 1 0 0 -# Curve #3: a portion of the hyperbola y = 1/x -a 0 0 1 0 0 -1 0.1 10 2 0.5 +# Curve #3: a portion of the upper branch of the hyperbola y = 1/x +# given by its intersections with y=100x and x=4y +i 0 0 1 0 0 -1 0.1 10 0 0 0 100 -1 0 2 0.5 0 0 0 1 -4 0 # Curve #4: a portion of the parabola y = 3*x^2 - 2*x + 5 a 3 0 0 -2 -1 5 2 13 -1 10 #----------------------------------------------------------- diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_split b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_split index 473fb38c530..26588ccbacd 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_split +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_curve_split @@ -8,8 +8,9 @@ e 5 3 0 0 -5 0 5 0 s -1 3 3 -1 # Curve #2: a vertical segment s 0 -2 0 0 -# Curve #3: a portion of the hyperbola y = 1/x -a 0 0 1 0 0 -1 0.1 10 2 0.5 +# Curve #3: a portion of the upper branch of the hyperbola y = 1/x +# given by its intersections with y=100x and x=4y +i 0 0 1 0 0 -1 0.1 10 0 0 0 100 -1 0 2 0.5 0 0 0 1 -4 0 # Curve #4: a portion of the parabola y = 3*x^2 - 2*x + 5 a 3 0 0 -2 -1 5 2 13 -1 10 #----------------------------------------------------------- diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_get_point_status b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_get_point_status index 9d698ff1aee..9f6cac7bed5 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_get_point_status +++ b/Packages/Arrangement/test/Arrangement_2_Traits/DATA/conic_arcs/conic_get_point_status @@ -8,8 +8,9 @@ e 5 3 0 0 -5 0 5 0 s -1 3 3 -1 # Curve #2: a vertical segment s 0 -2 0 0 -# Curve #3: a portion of the hyperbola y = 1/x -a 0 0 1 0 0 -1 0.1 10 2 0.5 +# Curve #3: a portion of the upper branch of the hyperbola y = 1/x +# given by its intersections with y=100x and x=4y +i 0 0 1 0 0 -1 0.1 10 0 0 0 100 -1 0 2 0.5 0 0 0 1 -4 0 # Curve #4: a portion of the parabola y = 3*x^2 - 2*x + 5 a 3 0 0 -2 -1 5 2 13 -1 10 #----------------------------------------------------------- diff --git a/Packages/Arrangement/test/Arrangement_2_Traits/include/Conic_traits_test.h b/Packages/Arrangement/test/Arrangement_2_Traits/include/Conic_traits_test.h index 834d1f4aa4e..f4af85143b5 100644 --- a/Packages/Arrangement/test/Arrangement_2_Traits/include/Conic_traits_test.h +++ b/Packages/Arrangement/test/Arrangement_2_Traits/include/Conic_traits_test.h @@ -14,9 +14,10 @@ public Base_traits_test typedef Number_type NT; typedef typename Traits_class::Point_2 Point; + typedef typename Traits_class::Segment_2 Segment; + typedef typename Traits_class::Circle_2 Circle; typedef typename Traits_class::X_curve_2 X_curve; typedef typename Traits_class::Curve_2 Curve; - typedef typename Traits_class::Curve_2 Conic; public: @@ -50,12 +51,13 @@ read_curve (std::ifstream & is, Curve & cv) char one_line[128]; skip_comments (is, one_line); - std::string stringvalues(one_line); - std::istringstream str_line (stringvalues, std::istringstream::in); + std::istrstream str_line( one_line, 128 ); // Get the arc type. - char type; - Conic conic; + char type; + bool is_circle = false; // Is this a circle. + Circle circle; + NT r, s, t, u, v, w; // The conic coefficients. str_line >> type; @@ -75,14 +77,29 @@ read_curve (std::ifstream & is, Curve & cv) NT a_sq = a*a; NT b_sq = b*b; - conic = Conic (b_sq, a_sq, 0, - -2*x0*b_sq, -2*y0*a_sq, - x0*x0*b_sq + y0*y0*a_sq - a_sq*b_sq); + if (a == b) + { + is_circle = true; + circle = Circle (Point (x0, y0), a*b, CGAL::CLOCKWISE); + } + else + { + r = b_sq; + s = a_sq; + t = 0; + u = -2*x0*b_sq; + v = -2*y0*a_sq; + w = x0*x0*b_sq + y0*y0*a_sq - a_sq*b_sq; + } if (type == 'f' || type == 'F') { - // Create a full ellipse. - cv = Curve(conic); + // Create a full ellipse (or circle). + if (is_circle) + cv = Curve (circle); + else + cv = Curve (r, s, t, u, v, w); + return; } } @@ -101,9 +118,12 @@ read_curve (std::ifstream & is, Curve & cv) NT a_sq = a*a; NT b_sq = b*b; - conic = Conic (b_sq, -a_sq, 0, - -2*x0*b_sq, 2*y0*a_sq, - x0*x0*b_sq - y0*y0*a_sq - a_sq*b_sq); + r = b_sq; + s= -a_sq; + t = 0; + u = -2*x0*b_sq; + v = 2*y0*a_sq; + w = x0*x0*b_sq - y0*y0*a_sq - a_sq*b_sq; } else if (type == 'p' || type == 'P') { @@ -116,23 +136,22 @@ read_curve (std::ifstream & is, Curve & cv) str_line >> c >> x0 >> y0; - conic = Conic (1, 0, 0, - -2*x0, -4*c, - x0*x0 + 4*c*y0); + r = 1; + s = 0; + t = 0; + u = -2*x0; + v = -4*c; + w = x0*x0 + 4*c*y0; } else if (type == 'c' || type == 'C' || type == 'a' || type == 'A') { // Read a general conic, given by its coefficients . - NT r, s, t, u, v, w; - str_line >> r >> s >> t >> u >> v >> w; - conic = Conic (r, s, t, u, v, w); - if (type == 'c' || type == 'C') { // Create a full conic (should work only for ellipses). - cv = Curve(conic); + cv = Curve (r, s, t, u, v, w); return; } } @@ -143,18 +162,51 @@ read_curve (std::ifstream & is, Curve & cv) str_line >> x1 >> y1 >> x2 >> y2; - conic = Conic (0, 0, 0, - y1 - y2, x2 - x1, - x1*y2 - x2*y1); + Point source (x1, y1); + Point target (x2, y2); + Segment segment (source, target); // Create the segment. - cv = Curve(conic, Point(x1,y1), Point(x2,y2)); + cv = Curve (segment); return; } + else if (type == 'i' || type == 'I') + { + // Read a general conic, given by its coefficients . + str_line >> r >> s >> t >> u >> v >> w; + // Read the approximated source, along with a general conic + // whose intersection with + // defines the source. + NT r1, s1, t1, u1, v1, w1; + NT x1, y1; + + str_line >> x1 >> y1; + str_line >> r1 >> s1 >> t1 >> u1 >> v1 >> w1; + + Point app_source (x1, y1); + + // Read the approximated target, along with a general conic + // whose intersection with + // defines the target. + NT r2, s2, t2, u2, v2, w2; + NT x2, y2; + + str_line >> x2 >> y2; + str_line >> r2 >> s2 >> t2 >> u2 >> v2 >> w2; + + Point app_target (x2, y2); + + // Create the conic arc. + cv = Curve (r, s, t, u, v ,w, + app_source, r1, s1, t1, u1, v1, w1, + app_target, r2, s2, t2, u2, v2, w2); + return; + } else { - std::cerr << "Illegal conic type specification: " << type << "." << std::endl; + std::cerr << "Illegal conic type specification: " << type << "." + << std::endl; return; } @@ -166,10 +218,17 @@ read_curve (std::ifstream & is, Curve & cv) Point source (x1, y1); Point target (x2, y2); - // Create the circular arc. - cv = Curve (conic, - source, target, - _error_eps); // It's OK to move the endpoints a bit. + // Create the conic (or circular) arc. + if (is_circle) + { + cv = Curve (circle, + source, target); + } + else + { + cv = Curve (r, s, t, u, v, w, + source, target); + } return; }