% +------------------------------------------------------------------------+ % | 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}{RegularTriangulationTraits_3} \ccDefinition The concept \ccRefName\ is the first template parameter of the class \ccc{Regular_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 \ccc{Regular_triangulation_3} must fulfill the following requirements. %It must provide definitions for the \textit{power tests}. \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.} We use here the same notation as in Section~\ref{Triangulation3-sec-class-Regulartriangulation}. To simplify notation, $p$ will often denote in the sequel either the point $p\in\R^3$ or the weighted point ${p}^{(w)}=(p,w_p)$. \ccTwo{RegularTriangulationTraits_3::Weighted_point_3xx}{} \ccNestedType{Weighted_point_3}{The weighted point type.} \ccTwo{Regular}{} \ccNestedType{Power_test_3} {A predicate object which must provide the following function operators: % \\ \\ \ccc{Oriented_side operator()( Weighted_point_3 p, Weighted_point_3 q, Weighted_point_3 r, Weighted_point_3 s, Weighted_point_3 t)},\\ which performs the following:\\ Let ${z(p,q,r,s)}^{(w)}$ be the power sphere of the weighted points $(p,q,r,s)$. Returns \\ \ccc{ON_ORIENTED_BOUNDARY} if \ccc{t} is orthogonal to ${z(p,q,r,s)}^{(w)}$,\\ \ccc{ON_NEGATIVE_SIDE} if \ccc{t} lies outside the oriented sphere of center $z(p,q,r,s)$ and radius $\sqrt{ w_{z(p,q,r,s)}^2 + w_t^2 }$ (which is equivalent to $\Pi({t}^{(w)},{z(p,q,r,s)}^{(w)} >0$)),\\ \ccc{ON_POSITIVE_SIDE} if \ccc{t} lies inside this oriented sphere. \ccPrecond{\ccc{p, q, r, s} are not coplanar.} % Note that with this definition, if all the points have a weight equal to 0, then \ccc{power_test_3(p,q,r,s,t)} = \ccc{side_of_oriented_sphere(p,q,r,s,t)}. % % \\ \\ \ccc{Oriented_side operator()( Weighted_point_3 p, Weighted_point_3 q, Weighted_point_3 r, Weighted_point_3 t)},\\ which has an definition analogous to the previous method, for coplanar points, with the power circle ${z(p,q,r)}^{(w)}$. \ccPrecond{\ccc{p, q, r} are not collinear and \ccc{p, q, r, t} are coplanar.} % If all the points have a weight equal to 0, then \ccc{power_test_3(p,q,r,s,t)} = \ccc{side_of_oriented_circle(p,q,r,s,t)}. % \\ \\ \ccc{Oriented_side operator()( Weighted_point_3 p, Weighted_point_3 q, Weighted_point_3 t)},\\ which is the same for collinear points, where ${z(p,q)}^{(w)}$ is the power segment of \ccc{p} and \ccc{q}. \ccPrecond{\ccc{p} and \ccc{q} have different Bare\_points, and \ccc{p, q, t} are collinear.} % If all points have a weight equal to 0, then \ccc{power_test_3(p,q,t)} gives the same answer as the kernel predicate \ccc{s(p,q).has_on(t)} would give, where \ccc{s(p,q)} denotes the segment with endpoints \ccc{p} and \ccc{q}. % \\ \\ \ccc{Oriented_side operator()( Weighted_point_3 p, Weighted_point_3 q)},\\ which is the same for equal points, that is when \ccc{p} and \ccc{q} have equal coordinates, then it returns the comparison of the weights (\ccc{ON_POSITIVE_SIDE} when \ccc{q} is heavier than \ccc{p}). \ccPrecond{\ccc{p} and \ccc{q} have equal Bare\_points.} } The following predicate is required if a call to \ccc{nearest_power_vertex} or \ccc{nearest_power_vertex_in_cell} is issued: \ccNestedType{Compare_power_distance_3} {A predicate object that must provide the function operator\\ \ccc{Comparison_result operator()(Point_3 p, Weighted_point_3 q, Weighted_point_3 r)},\\ which compares the power distance between \ccc{p} and \ccc{q} to the power distance between \ccc{p} and \ccc{r}.} In addition, only when the dual operations are used, the traits class must provide the following constructor objects: \ccTwo{DelaunayTriangulationTraits_3}{} \ccNestedType{Construct_weighted_circumcenter_3} {A constructor type. The operator() constructs the bare point which is the center of the smallest orthogonal sphere to the input weighted points. \\ \ccc{Bare_point operator() ( Weighted_point_3 p, Weighted_point_3 q, Weighted_point_3 r, Weighted_point_3 s);} } \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_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 function gives access to the predicate object: \ccThree{coplanar_side_of_bounded}{gt.xxxxxxxxx(Point p0, Point p1)x}{} \ccCreationVariable{traits} %% choose variable name \ccMethod{Power_test_3 power_test_3_object();}{} The following functions must be provided only if the member functions of \ccc{Regular_triangulation_3} returning elements of the dual diagram are called: \ccMethod{Construct_weighted_circumcenter_3 construct_weighted_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::Regular_triangulation_euclidean_traits_3}\\ \ccc{CGAL::Regular_triangulation_filtered_traits_3}. \end{ccRefConcept}