CGAL 3.0 differs from CGAL 2.4 in the platforms that are supported and in functionality. There have also been a number of bug fixes for this release.
The license has been changed to either the LGPL (GNU Lesser General Public License v2.1) or the QPL (Q Public License v1.0) depending on each package. So CGAL remains free of use for you, if your usage meets the criteria of these licenses, otherwise, a commercial license has to be purchased from GeometryFactory.
Changelog
Supported platforms
- MS Visual C++, version 7.1.
- SunPro CC versions 5.4 and 5.5 on Solaris
- GNU g++ versions 3.2 and 3.3 on Linux, Solaris, Irix, cygwin, and FreeBSD.
- MipsPRO CC 7.30 and 7.40 with both the n32 and n64 ABIs.
The following platforms are no longer supported:
- MS Visual C++, version 6.
- GNU g++ 2.95.2 (2.95.3 is still supported)
- Kai C++ and Borland C++, all versions
General
- The CORE library for exact computations is now distributed as part of CGAL as well.
Largest_empty_rectangle_2
: Given a set of points P in the plane, the classLargest_empty_iso_rectangle_2
is a data structure that maintains an iso-rectangle with the largest area among all iso-rectangles that are inside a given iso-rectangle bounding box, and that do not contain any point of the point set P.
Kernels
- 3 typedefs have been added to ease the choice of a robust and fast kernel:
Exact_predicates_inexact_constructions_kernel
Exact_predicates_exact_constructions_kernel
Exact_predicates_exact_constructions_kernel_with_sqrt
- Progress has been made towards the complete adaptability and extensibility of our kernels.
- New faster
Triangle_3
intersection test routines.(see Erratum at the bottom)
- Added a Kernel concept archetype to check that generic algorithms don’t use more functionality than they should.
- A few more miscellaneous functions.
Interval Skip List (new package)
- An interval skip list is a data strucure for finding all intervals that contain a point, and for stabbing queries, that is for answering the question whether a given point is contained in an interval or not.
2D Apollonius Graph (new package)
- Algorithms for computing the Apollonius graph in two dimensions. The Apollonius graph is the dual of the Apollonius diagram, also known as the additively weighted Voronoi diagram. The latter can be thought of as the Voronoi diagram of a set of circles under the Euclidean metric, and it is a generalization of the standard Voronoi diagram for points. The algorithms provided are dynamic.
dD Min Sphere of Spheres (new package)
- Algorithms to compute the smallest
enclosing sphere of a given set of spheres in Rd.
The package provides
an algorithm with maximal expected running time
O(2<sup>O(d)</sup> n)
and a fast and robust heuristic (for dimension less than 30).
Spatial Searching (new package)
- Provides exact and approximate distance browsing in a set of points in
d
-dimensional space using implementations of algorithms supporting:- both nearest and furthest neighbor searching
- both exact and approximate searching
- (approximate) range searching
- (approximate)
k
-nearest andk
-furthest neighbor searching - (approximate) incremental nearest and incremental furthest neighbor searching
- query items representing points and spatial objects.
Kd-tree
- This package is deprecated, its documentation is removed. It is replaced by the Spatial Searching package.
2D Triangulation and 3D Triangulation
- The classes Triangulation_data_structure_2 (and 3), which implements the data structure for 2D triangulation class, now makes use of CGAL::Compact_container (see Support Library section below).
- The triangulation classes use a Rebind mecanism to provide the full flexibility on Vertex and Face base classes. This means that it is possible for the user to derive its own Face of Vertex base class, adding a functionality that makes use of types defined by the triangulation data structure like Face_handle or Vertex_handle.
- New classes
Triangulation_vertex_base_with_info_2
(and 3) andTriangulation_face_base_with_info_2
(and 3) to make easier the customisation of base classes in most cases.
2D Triangulation
- Regular triangulation provides an easy access to hidden points.
- The
Triangulation_hierarchy_2
, which provides an efficient location data structure, can now be used with any 2D triangulation class plugged in (including regular triangulations).
3D Triangulation
- Faster vertex removal function in
Delaunay_triangulation_3
. Delaunay_triangulation_3
is now independent of the order of insertions of the points (in case of degenerate cosphericity).Regular_triangulation_3
now hides vertices (and updates itself) when inserting a coinciding point with greater weight. This required a new predicate.- Deprecated functions:
copy_triangulation()
,push_back()
,set_number_of_vertices()
. Triangulation_3
now gives non-const access to its data structure.
Planar Maps and Arrangements
The changes concern mainly the traits classes.
- New traits hierarchy and interface:
The set of requirements was made sound and complete. A couple of
requirements were eliminated, few others were redefined, and some
were renamed. A hierarchy of three traits classes for the
Planar_map_2
,Planar_map_with_intersections_2
, andArrangement_2
types was established to include only the necessary requirements at each level. It was determined that for the aggregate insertion- operation based on a sweep-line algorithm only a subset of the requirements is needed. Preconditions were added where appropriate to tighten the requirements further. - The following functions have been renamed:
point_is_same()
renamed topoint_equal()
curve_is_same()
renamed tocurve_equal()
curve_is_in_x_range()
renamed topoint_in_x_range()
curve_compare_at_x()
renamed tocurves_compare_y_at_x()
. Furthermore, a precondition has been added that the reference point is in the x-range of both curves.curve_compare_at_x_right()
renamed tocurves_compare_y_at_x_to_right()
. Furthermore, a precondition has been added that both curves are equal at the reference point and defined to its right.curve_compare_at_x_left()
renamed tocurves_compare_y_at_x_to_left()
. Furthermore, a precondition has been added that both curves are equal at the reference point and defined to its right.curve_get_point_status()
renamed tocurve_compare_y_at_x()
. Furthermore, a precondition has been added that the point is in the x-range of the curve. Consequently, the function now returns a Comparison_result (instead of a special enum).make_x_monotone()
renamed tocurve_make_x_monotone()
. See more details below.curve_flip()
renamed tocurve_opposite()
- The following functions have been removed:
curve_is_between_cw()
point_to_left()
point_to_right()
is_x_monotone()
point_reflect_in_x_and_y()
curve_reflect_in_x_and_y()
do_intersect_to_right()
do_intersect_to_left()
- Most functions, are required by the
PlanarMapTraits_2
concept, except for themake_x_monotone()
,nearest_intersection_to_right()
,nearest_intersection_to_left()
,curves_overlap()
andcurve_opposite()
.PlanarMapWithIntersectionsTraits_2
requires all these functions, exceptcurve_opposite()
, needed only by theArrangementTraits_2
concept. Furthermore, the two functionscurve_compare_at_x_left()
andnearest_intersection_to_left()
can be omitted, if the two functionspoint_reflect_in_x()
andcurve_reflect_in_x()
are implemented. Reflection can be avoided, if the two _left functions are supplied. - The type X_curve_2 of the PlanarMapWithIntersectionsTraits_2
concept was renamed to X_monotone_curve_2, and the distinction
between this type and the Curve_2 type was made firm. The method
is_x_monotone()
of the PlanarMapWithIntersectionsTraits_2 concept was removed. The related methodcurve_make_x_monotone()
is now called for each input curve of type Curve_2 when curves are inserted into a Planar_map_with_intersections_2 to subdivide the input curve into x-monotone sub-curves (and in case the curve is already x-monotone, this function is responsible for casting it to an x-monotone curve). - New and improved traits classes:
- Conic traits -
Arr_conic_traits_2
Support finite segments of ellipses, hyperbolas and parabolas, as well as line segments. The traits require an exact real number- type, such as leda_real orCORE::Expr
. - Segment cached traits -
Arr_segment_cached_traits_2
This class uses an improved representation for segments that helps avoiding cascaded computations, thus achieving faster running times. To work properly, an exact rational number-type should be used. - Polyline traits -
Arr_polyline_traits_2
The polyline traits class has been reimplemented to work in a more efficient, generic manner. The new class replaces the obsolete Arr_polyline_traits class. It is parameterized with a segment traits class. - Hyperbola and segment traits -
Arr_hyper_segment_traits_2
Supports line segments and segments of canonical hyperbolas. This is the type of curves that arise when projecting segments in three-space rotationally around a line onto a plane containing the line. Such projections are often useful in CAD/CAM problems.
- Conic traits -
- Removed old traits class:
- The models of the
PlanarMapWithIntersectionsTraits_2
concept below became obsolete, as the new conic traits, namelyArr_conic_traits_2
, supports the same functionality and is much more efficient. Arr_circles_real_traits
Arr_segment_circle_traits
- The models of the
- The segment traits class and the new polyline traits class were
reimplemented using standard CGAL-kernel calls. This essentially
eliminated the corresponding leda traits classes, namely:
Pm_leda_segment_traits_2
Arr_leda_segment_traits_2
Arr_leda_polyline_traits
- With the use of the Leda_rat_kernel new external package the same functionality can be achieved with less overhead and more efficiency.
- New interface functions to the
Planar_map_with_intersections_2
class. The Planar_map_with_intersections_2 class maintains a planar map of input curves that possibly intersect each other and are not necessarily x-monotone. If an input curve, or a set of input curves, are known to be x-monotone and pairwise disjoint, the new functions below can be used to insert them into the map efficiently.
2D Sweep Line
- The
Sweep_line_2
package was reimplemented. As a consequence it is much more efficient, its traits is tighter (namely neither the two _left nor the reflection functions are required), and its interface has changed a bit. - The following global functions have been removed:
sweep_to_produce_subcurves_2()
sweep_to_produce_points_2()
sweep_to_construct_planar_map_2()
- Instead, the public methods of the Sweep_line_2 class listed below were introduced:
get_subcurves()
- Given a container of curves, this function returns a list of curves that are created by intersecting the input curves.get_intersection_points()
- Given a range of curves, this function returns a list of points that are the intersection points of the curves.get_intersecting_curves()
- Given a range of curves, this function returns an iterator to the beginning of a range that contains the list of curves for each intersection point between any two curves in the specified range.
- It is possible to construct a planar map with intersections (or an arrangement) by inserting a range of curves into an empty map. This will invoke the sweep-line process to construct the map more efficiently.
Polyhedral Surface
- The old design that was deprecated since CGAL 2.3 has been removed.
- Class
Polyhedron_incremental_builder_3
: - Renamed local enum
ABSOLUTE
toABSOLUTE_INDEXING
, andRELATIVE
toRELATIVE_INDEXING
to avoid conflicts with similarly named macros of another library. - Changed member functions
add_vertex()
,begin_facet()
, andend_facet()
to return useful handles. - Added
test_facet()
to check facets for validity before adding them. - Added
vertex( size_t i)
to returnVertex_handle
for indexi
.
Halfedge Data Structure
- The old design that was deprecated since CGAL 2.3 has been removed.
Support Library
- New container class
Compact_container
, which (roughly) provides the flexibility ofstd::list
, with the memory compactness of std::vector. - Geomview_stream: added a function gv.draw_triangles(InputIterator begin, InputIterator end) which draws a set of triangles much more quickly than one by one.
Number types:
- number types are now required to provide a function:
std::pair<double, double> to_interval(const NT&)
. - number types are now required to provide mixed operators with “int”.
- CLN support removed.
- faster
square()
for MP_Float. - added Gmp_q.
Qt_widget:
- New classes:
Qt_help_window
: provides a simple way to show some helpful information about a demo as an HTML page.Qt_widget_history
: provides basic functionality to manipulate intervals ofQt_widget
class. The current visible area ofQt_widget
is mapped to an interval. Each interval could be stored in theQt_widget_history
object. So you can use this object to navigate in history. It is mostly used byQt_widget_standard_toolbar
.
- Changes:
- Qt_widget_standard_toolbar: is derived from QToolBar class, so pay attention to modify your code, if you used this class. Some public methods were introduced to control the history object that the toolbar use to navigate.
- The icons are now part of libCGALQt.
- Deprecated members of Qt_widget:
add_to_history()
,clear_history()
,back()
,forth()
: useforward()
,back()
andclear_history()
of theQt_widget_standard_toolbar
instead.custom_redraw()
: useredraw_on_back()
andredraw_on_front()
instead.
- Optimizations:
- The output operators of the following classes have been optimized:
CGAL::Segment_2
(now tests for intersection with the drawing area)CGAL::Triangle_2
(now tests for intersection with the drawing area)CGAL::Triangulation_2
(is optimized for faster display on zooming)
Erratum in the Kernel manual
Intersection test routines
- The documentation of CGAL::do_intersect should mention, for the 3D case:
also, in three-dimensional space
Type1
can be eitherPlane_3<Kernel>
orTriangle_3<Kernel>
andType2
any of:Plane_3<Kernel>
Line_3<Kernel>
Ray_3<Kernel>
Segment_3<Kernel>
Triangle_3<Kernel>
- In the same way, for
Kernel::DoIntersect_3
: for all pairsType1
andType2
, where the typeType1
is eitherKernel::Plane_3
orKernel::Triangle_3
andType2
can be any of the following:Kernel::Plane_3
Kernel::Line_3
Kernel::Ray_3
Kernel::Segment_3
Kernel::Triangle_3
- Philippe Guigue (INRIA Sophia-Antipolis) should be mentioned as one of the authors.