% +------------------------------------------------------------------------+
% | Reference manual page: Triangulation_Traits_3.tex
% +------------------------------------------------------------------------+
% | 27.3.2000   Monique Teillaud
% | Package: Triangulation3
% | 
\RCSdef{\RCSTriangulationTraitsRev}{$Id$}
\RCSdefDate{\RCSTriangulationTraitsDate}{$Date$}
% |
%%RefPage: end of header, begin of main body
% +------------------------------------------------------------------------+


\begin{ccRefConcept}{DelaunayTriangulationTraits_3}

\ccDefinition
The concept \ccRefName\ is the first template parameter of the class
\ccc{Delaunay_triangulation_3}. It defines the geometric objects (points,
segments...) forming the triangulation together with a few geometric
predicates and constructions on these objects.

\ccRefines \ccc{TriangulationTraits_3}

In addition to the requirements described for the traits class of
\ccc{Triangulation_3}, the geometric traits class of a
Delaunay triangulation must fulfill the following requirements:

\ccTypes
\ccTwo{DelaunayTriangulationTraits_3::Object_3_xxxxx}{}

\ccNestedType{Line_3}{The line type.}
\ccGlue
\ccNestedType{Object_3}{The object type.}
\ccGlue
%\ccNestedType{Plane_3}{The plane type.}
%\ccGlue
\ccNestedType{Ray_3}{The ray type.}

\ccTwo{DelaunayTriangulationTraits}{}

\ccNestedType{Coplanar_side_of_bounded_circle_3}
{A predicate object that must provide the function operator\\
\ccc{Bounded_side operator()(Point p, Point q, Point r, Point s)},\\
which determines the bounded side of the circle defined
by \ccc{p}, \ccc{q}, and \ccc{r} on which \ccc{s} lies.
\ccPrecond{\ccc{p}, \ccc{q}, \ccc{r}, and \ccc{s} are coplanar and
\ccc{p}, \ccc{q}, and \ccc{r} are not collinear.}}
\ccGlue
\ccNestedType{Side_of_oriented_sphere_3}
{A predicate object that must provide the function operator\\
\ccc{Oriented_side operator()(Point p, Point q, Point r, Point s, Point t)},\\
which determines on which side of the oriented sphere circumscribing 
\ccc{p, q, r, s} the point \ccc{t} lies.}

\ccNestedType{Compare_distance_3}
{A predicate object that must provide the function operator\\
\ccc{Comparison_result operator()(Point p, Point q, Point r)},\\
which compares the distance between \ccc{p} and \ccc{q} to the distance
between \ccc{p} and \ccc{r}.\\
It is only needed when using the \ccc{Fast_location} policy or the
\ccc{nearest_vertex} function.}

In addition, only when the dual operations are used, the traits class
must provide the following constructor objects: 

\ccTwo{DelaunayTriangulationTraits_3}{}
\ccNestedType{Construct_circumcenter_3}
{A constructor object that must provide the function operator\\
\ccc{Point_3 operator()(Point_3 p, Point_3 q, Point_3 r, Point_3 s)},\\
which constructs the circumcenter of four points.
\ccPrecond{\ccc{p}, \ccc{q}, \ccc{r} and \ccc{s} must be non coplanar.}\\
It must also provide the function operator\\
\ccc{Point_3 operator()(Point_3 p, Point_3 q, Point_3 r)},\\
which constructs the circumcenter of three points.
\ccPrecond{\ccc{p}, \ccc{q} and \ccc{r} must be non collinear.}}
\ccGlue
\ccNestedType{Construct_object_3}
{A constructor object that must provide the function operators\\
\ccc{Object_3 operator()(Point_3 p)},\\
\ccc{Object_3 operator()(Segment_3 s)} and\\
\ccc{Object_3 operator()(Ray_3 r)}\\
that construct an object respectively from a point, a segment and a ray.}
\ccGlue
\ccNestedType{Construct_equidistant_line_3}
{A constructor object that must provide the function operator\\
\ccc{Line_3 operator()(Point_3 p1, Point_3 p2, Point_3 p3)},\\
which constructs the line which is at the same distance from the three points.
\ccPrecond{\ccc{p1}, \ccc{p2} and \ccc{p3} must be non collinear.}}
\ccGlue
%\ccNestedType{Construct_perpendicular_line_3}
%{A constructor object that must provide the function operator\\
%\ccc{Line_3 operator()(Plane_3 pl, Point_3 p)},\\
%which constructs the line perpendicular to \ccc{pl} passing through \ccc{p}.}
%\ccGlue
%\ccNestedType{Construct_plane_3}
%{A constructor object that must provide the function operator\\
%\ccc{Plane_3 operator()(Point_3 p, Point_3 q, Point_3 r)},\\
%which constructs the plane passing through \ccc{p}, \ccc{q} and \ccc{r}.
%\ccPrecond{\ccc{p}, \ccc{q} and \ccc{r} are non collinear.}}
%\ccGlue
\ccNestedType{Construct_ray_3}
{A constructor object that must provide the function operator\\
\ccc{Ray_3 operator()(Point_3 p, Line_3 l)},\\
which constructs the ray starting at \ccc{p} with direction given by \ccc{l}.}


\ccOperations

The following functions give access to the predicate and construction objects:

\ccThree{coplanar_side_of_bounded_circle_3xxx}{gt.xxxxxxxxx(Point p0, Point p1)x}{}
\ccCreationVariable{traits}

\ccMethod{Coplanar_side_of_bounded_circle_3 coplanar_side_of_bounded_circle_3_object();}{}
\ccGlue
\ccMethod{Side_of_oriented_sphere_3 side_of_oriented_sphere_3_object();}{}

When using the \ccc{Fast_location} policy or the \ccc{nearest_vertex} function,
the traits must provide:

\ccMethod{Compare_distance_3 compare_distance_3_object();}{}

The following functions must be provided only if the methods of 
\ccc{Delaunay_triangulation_3} returning elements of the Voronoi diagram 
are instantiated:

\ccMethod{Construct_circumcenter_3 construct_circumcenter_3_object();}{}
\ccGlue
\ccMethod{Construct_object_3 construct_object_3_object();}{}
\ccGlue
\ccMethod{Construct_perpendicular_line_3 construct_perpendicular_line_object();}{}
\ccGlue
\ccMethod{Construct_plane_3 construct_plane_3_object();}{}
\ccGlue
\ccMethod{Construct_ray_3 construct_ray_3_object();}{}

\ccHasModels

\ccc{CGAL::Exact_predicates_inexact_constructions_kernel} (recommended)\\
\ccc{CGAL::Exact_predicates_exact_constructions_kernel} (recommended for
Voronoi)\\
\ccc{CGAL::Filtered_kernel}\\
\ccc{CGAL::Cartesian}\\
\ccc{CGAL::Simple_cartesian}\\
\ccc{CGAL::Homogeneous}\\
\ccc{CGAL::Simple_homogeneous}

\end{ccRefConcept}
