\begin{ccRefFunction}{intersection} Depending on which \cgal\ \ccHtmlNoLinksFrom{kernel} is used, different versions of this global function are available. This is described below. \paragraph{Notes on Backwards compatibility} The \ccStyle{intersection} function used to return \ccStyle{CGAL::Object} but starting with {\cgal} VERSION HERE the return type is determined by a dedicated traits class. To preserve backwards compatibility \ccStyle{CGAL::Object} can be constructed from the new return types implicitly, but switching to the new style is advocated. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \paragraph{With the basic 2D and 3D Kernel} (see Chapter~\ref{chapter-kernel-23}) \ccInclude{CGAL/intersections.h} \ccUnchecked{ \ccRefLabel{Kernel::intersection} \ccFunction{IT< Kernel, Type1, Type2 >::result_type intersection(Type1 obj1, Type2 obj2);} {Two objects \ccStyle{obj1} and \ccStyle{obj2} intersect if there is a point \ccStyle{p} that is part of both \ccStyle{obj1} and \ccStyle{obj2}. The \ccHtmlNoLinksFrom{intersection} region of those two objects is defined as the set of all points \ccStyle{p} that are part of both \ccStyle{obj1} and \ccStyle{obj2}. Note that for objects like triangles and polygons that enclose a bounded region, this region is considered part of the object. If a segment lies completely inside a triangle, then those two objects intersect and the \ccHtmlNoLinksFrom{intersection} region is the complete segment. }} The same functionality is also available through the functors \ccc{Kernel::Intersect_2} and \ccc{Kernel::Intersect_2}. The possible values for types \ccStyle{Type1} and \ccStyle{Type2} and the value for T\ldots in \ccStyle{boost::optional< boost::variant< T\ldots >} are the following: \begin{ccTexOnly} \begin{longtable}[c]{|l|l|l|} %\caption{All available intersection computations}\\ \multicolumn{3}{l}{\sl \ \ } \endfirsthead \multicolumn{3}{l}{\sl continued} \endhead \hline type A & type B & \parbox{4 cm}{\vspace{1 mm}{return type}} \\ \hline \ccStyle{Line_2} & \ccStyle{Line_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Line_2} \vspace{1 mm}} \\ \hline \ccStyle{Segment_2} & \ccStyle{Line_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Segment_2} & \ccStyle{Segment_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Ray_2} & \ccStyle{Line_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Ray_2} \vspace{1 mm}} \\ \hline \ccStyle{Ray_2} & \ccStyle{Segment_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Ray_2} & \ccStyle{Ray_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \\ \ccStyle{Ray_2} \vspace{1 mm}} \\ \hline \ccStyle{Triangle_2} & \ccStyle{Line_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Triangle_2} & \ccStyle{Segment_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Triangle_2} & \ccStyle{Ray_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Triangle_2} & \ccStyle{Triangle_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \\ \ccStyle{Triangle_2} \\ \ccStyle{std::vector} \vspace{1 mm}} \\ \hline \ccStyle{Iso_rectangle_2} & \ccStyle{Line_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Iso_rectangle_2} & \ccStyle{Segment_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Iso_rectangle_2} & \ccStyle{Ray_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \vspace{1 mm}} \\ \hline \ccStyle{Iso_rectangle_2} & \ccStyle{Triangle_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_2} \\ \ccStyle{Segment_2} \\ \ccStyle{Triangle_2} \\ \ccStyle{_2} \vspace{1 mm}} \\ \hline \ccStyle{Iso_rectangle_2} & \ccStyle{Iso_rectangle_2} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Iso_rectangle_2} \vspace{1 mm}} \\ \hline {\ccStyle{Line_3}} & {\ccStyle{Line_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Line_3} \vspace{1 mm}} \\ \hline {\ccStyle{Line_3}} & {\ccStyle{Plane_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Line_3} \vspace{1 mm}} \\ \hline {\ccStyle{Line_3}} & {\ccStyle{Ray_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Ray_3} \vspace{1 mm}} \\ \hline {\ccStyle{Line_3}} & {\ccStyle{Segment_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Line_3}} & {\ccStyle{Triangle_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Plane_3}} & {\ccStyle{Plane_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Line_3} \\ \ccStyle{Plane_3} \vspace{1 mm}} \\ \hline {\ccStyle{Plane_3}} & {\ccStyle{Ray_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Ray_3} \vspace{1 mm}} \\ \hline {\ccStyle{Plane_3}} & {\ccStyle{Segment_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Plane_3}} & {\ccStyle{Sphere_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Circle_3} \vspace{1 mm}} \\ \hline {\ccStyle{Plane_3}} & {\ccStyle{Triangle_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Triangle_3} \\ \ccStyle{Segment_3} \\ \ccStyle{Point_3} \vspace{1 mm}} \\ \hline {\ccStyle{Ray_3}} & {\ccStyle{Ray_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Ray_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Ray_3}} & {\ccStyle{Segment_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Ray_3}} & {\ccStyle{Triangle_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Segment_3}} & {\ccStyle{Segment_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Segment_3}} & {\ccStyle{Triangle_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3} \vspace{1 mm}} \\ \hline {\ccStyle{Sphere_3}} & {\ccStyle{Sphere_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Circle_3} \\ \ccStyle{Sphere_3} \vspace{1 mm}} \\ \hline {\ccStyle{Triangle_3}} & {\ccStyle{Triangle_3}} & \parbox{4 cm}{\vspace{1 mm} \ccStyle{Point_3} \\ \ccStyle{Segment_3}\\ \ccStyle{Triangle_3}\\ \ccStyle{std::vector} \vspace{1 mm}} \\ \hline \end{longtable} \end{ccTexOnly} \begin{ccHtmlOnly}
type A type B return type
Line_2 Line_2
Point_2
Line_2
Segment_2 Line_2
Point_2
Segment_2
Segment_2 Segment_2
Point_2
Segment_2
Ray_2 Line_2
Point_2
Ray_2
Ray_2 Segment_2
Point_2
Segment_2
Ray_2 Ray_2
Point_2
Segment_2
Ray_2
Triangle_2 Line_2
Point_2
Segment_2
Triangle_2 Segment_2
Point_2
Segment_2
Triangle_2 Ray_2
Point_2
Segment_2
Triangle_2 Triangle_2
Point_2
Segment_2
Triangle_2
std::vector<Point_2>
Iso_rectangle_2 Line_2
Point_2
Segment_2
Iso_rectangle_2 Segment_2
Point_2
Segment_2
Iso_rectangle_2 Ray_2
Point_2
Segment_2
Iso_rectangle_2 Iso_rectangle_2
Iso_rectangle_2
Line_3 Line_3
Point_3
Line_3
Line_3 Plane_3
Point_3
Line_3
Line_3 Ray_3
Point_3
Ray_3
Line_3 Segment_3
Point_3
Segment_3
Line_3 Triangle_3
Point_3
Segment_3
Plane_3 Plane_3
Line_3
Plane_3
Plane_3 Ray_3
Point_3
Ray_3
Plane_3 Segment_3
Point_3
Segment_3
Plane_3 Sphere_3
Point_3
Circle_3
Plane_3 Triangle_3
Point_3
Segment_3
Triangle_3
Ray_3 Ray_3
Point_3
Ray_3
Segment_3
Ray_3 Segment_3
Point_3
Segment_3
Ray_3 Triangle_3
Point_3
Segment_3
Segment_3 Segment_3
Point_3
Segment_3
Segment_3 Triangle_3
Point_3
Segment_3
Sphere_3 Sphere_3
Point_3
Circle_3
Sphere_3
Triangle_3 Triangle_3
Point_3
Segment_3
Triangle_3
std::vector < Point_3 >
\end{ccHtmlOnly} There is also an intersection function between 3 planes. \ccFunction{optional< variant< Point_3, Line_3, Plane_3 > > intersection(const Plane_3& pl1, const Plane_3& pl2, const Plane_3& pl3);} {returns the intersection of 3 planes, which can be either a point, a line, a plane, or empty.} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \paragraph{With the 2D Circular Kernel} (see Chapter~\ref{chapter-circular-kernel}) \ccInclude{CGAL/Circular_kernel_intersections.h} If this kernel is used, in addition to the function and the combination of 2D types described above, another version of the function is provided. The iterator versions of those functions can be used in conjunction with \ccc{CGAL::Dispatch_output_iterator}. Since both the number of intersections, if any, and their type, depend on the arguments, the function expects an output iterator on \ccc{Intersection_Traits< K, Type1, Type2 >}, as presented below. \ccFunction{template < class OutputIterator > OutputIterator intersection(const Type1 &obj1, const Type2 &obj2, OutputIterator intersections);} {Copies in the output iterator the intersection elements between the two objects. \ccc{intersections} iterates on elements of type \ccStyle{IT< K, Type1, Type2 >}, in lexicographic order,} where \ccStyle{Type1} and \ccStyle{Type2} can both be either \begin{itemize} \item {} \ccStyle{Line_2} or \item {} \ccStyle{Line_arc_2} or \item {} \ccStyle{Circle_2} or \item {} \ccStyle{Circular_arc_2}. \end{itemize} Depending on the types \ccStyle{Type1} and \ccStyle{Type2}, these elements can be assigned to \begin{itemize} \item {} \ccStyle{std::pair, unsigned>}, where the unsigned integer is the multiplicity of the corresponding intersection point between \ccc{obj1} and \ccc{obj2}, \item {} \ccStyle{Circular_arc_2} in case of an overlap of two circular arcs, \item {} \ccStyle{Line_arc_2} in case of an overlap of two line segments or \item {} \ccStyle{Line_2} or \ccStyle{Circle_2} in case of two equal input lines or circles. \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \paragraph{With the 3D Spherical Kernel} (see Chapter~\ref{chapter-spherical-kernel}) \ccInclude{CGAL/Spherical_kernel_intersections.h} If this kernel is used, in addition to the function and the combination of 3D types described above, two other versions of the function are provided. The iterator versions of those functions can be used in conjunction with \ccc{CGAL::Dispatch_output_iterator}. Since both the number of intersections, if any, and their type, depend on the arguments, the functions expects an output iterator on \ccStyle{Intersection_Traits, Type2}, as presented below. The \textbf{first function} is: \ccFunction{template < class OutputIterator > OutputIterator intersection(const Type1 &obj1, const Type2 &obj2, OutputIterator intersections);} {Copies in the output iterator the intersection elements between the two objects. \ccc{intersections} iterates on elements of type \ccStyle{IT, B}, in lexicographic order, when this ordering is defined on the computed objects,} where \ccStyle{Type1} and \ccStyle{Type2} can both be either: \begin{itemize} \item {} \ccStyle{Sphere_3}, \item {} \ccStyle{Plane_3}, \item {} \ccStyle{Line_3}, \item {} \ccStyle{Circle_3}, \item {} \ccStyle{Line_arc_3} or \item {} \ccStyle{Circular_arc_3}, \end{itemize} and depending on the types \ccStyle{Type1} and \ccStyle{Type2}, the computed type can be: \begin{itemize} \item {} \ccStyle{std::pair, unsigned>}, where the unsigned integer is the multiplicity of the corresponding intersection point between \ccc{obj1} and \ccc{obj2}, \item {} \ccStyle{Type1}, when \ccStyle{Type1} and \ccStyle{Type2} are equal, and if the two objets \ccc{obj1} and \ccc{obj2} are equal, \item {} \ccStyle{Line_3} or \ccStyle{Circle_3} when \ccStyle{Type1} and \ccStyle{Type2} are two-dimensional objets intersecting along a curve (2 planes, or 2 spheres, or one plane and one sphere), \item {} \ccStyle{Circular_arc_3} in case of an overlap of two circular arcs or \item {} \ccStyle{Line_arc_3} in case of an overlap of two line segments. \end{itemize} The \textbf{second function} is: \ccFunction{template < class OutputIterator > OutputIterator intersection(const Type1 &obj1, const Type2 &obj2, const Type3 &obj3, OutputIterator intersections);} {Copies in the output iterator the intersection elements between the three objects. \ccc{intersections} iterates on elements of type \ccStyle{boost::optional< boost::variant< std::pair, unsigned>, Circle_3, Sphere_3, Plane_3 >}, in lexicographic order when this ordering is defined on the computed objects} where \ccStyle{Type1}, \ccStyle{Type2} and \ccStyle{Type3} can be either \begin{itemize} \item {} \ccStyle{Sphere_3} or \item {} \ccStyle{Plane_3} \end{itemize} and depending of these types, the computed return value \begin{itemize} \item {} \ccStyle{std::pair, unsigned>}, where the unsigned integer is the multiplicity of the corresponding intersection point, \item {} \ccStyle{Circle_3} or \item {} \ccStyle{Type1}, when \ccStyle{Type1}, \ccStyle{Type2} and \ccc{Type3} are equal, and if the three objets \ccc{obj1} and \ccc{obj2} and \ccc{obj3} are equal. \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ccExample The following example demonstrates the most common use of \ccc{intersection} routines with the basic 2D and 3D Kernels. \ccHtmlLinksOff% \begin{verbatim} #include template struct Intersection_visitor { typedef result_type void; void operator()(const Point_2& p) const { /* handle point */ } void operator()(const Segment_2& s) const { /* handle segment */ } }; template void foo(Segment_2 seg, Line_2 lin) { ITd< R, Segment_2, Line_2 >::result_type result = intersection(seg, lin); if(result) { boost::apply_visitor(Intersection_visitor(), *result); } else { /* no intersection */ } } \end{verbatim}% \ccHtmlLinksOn% Examples illustrating the use of this function in the case of the 2D Circular Kernel and the 3D Spherical Kernel are presented respectively in Chapters~\ref{chapter-circular-kernel} and~\ref{chapter-spherical-kernel}. \ccSeeAlso \ccRefIdfierPage{CGAL::do_intersect}, \\ \ccRefIdfierPage{CGAL::Intersection_traits, B}, \\ \ccAnchor{www.boost.org/doc/libs/release/libs/optional/index.html}{boost::optional}, \\ \ccAnchor{www.boost.org/doc/html/variant.html}{boost::variant} \end{ccRefFunction}