\begin{ccRefFunction}{intersection}
\ccInclude{CGAL/intersections.h}

\ccUnchecked{
\ccFunction{Object intersection(Type1<Kernel> obj1, Type2<Kernel> 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 possible value for types \ccStyle{Type1} and \ccStyle{Type2} and the
possible return values wrapped in \ccc{Object} 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<Point_2>}
  \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{Iso_rectangle_2} & \parbox{4 cm}{\vspace{1 mm}
    \ccStyle{Iso_rectangle_2}
  \vspace{1 mm}} \\
\hline
{\ccStyle{Plane_3}} & {\ccStyle{Line_3}} & \parbox{4 cm}{\vspace{1 mm}
\ccStyle{Point_3} \\
 \ccStyle{Line_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{Plane_3}} & \parbox{4 cm}{\vspace{1 mm}
\ccStyle{Line_3} \\
 \ccStyle{Plane_3}
\vspace{1 mm}}  \\
\hline
\end{longtable}
\end{ccTexOnly}

\begin{ccHtmlOnly}
<DIV ALIGN="CENTER">
<TABLE CELLPADDING=3 BORDER="1">
<TR> <TH> type A </TH>
 <TH> type B </TH>
 <TH> return type </TH>
</TR>
<TR>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Line_2</TD></TR>
        </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Ray_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
	<TR><TD>Ray_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Triangle_2 </TD>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Triangle_2 </TD>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Triangle_2 </TD>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Triangle_2 </TD>
    <TD VALIGN="CENTER" > Triangle_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
	<TR><TD>Triangle_2</TD></TR>
	<TR><TD>std::vector&lt;Point_2&gt;</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Iso_rectangle_2 </TD>
    <TD VALIGN="CENTER" > Line_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Iso_rectangle_2 </TD>
    <TD VALIGN="CENTER" > Segment_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Iso_rectangle_2 </TD>
    <TD VALIGN="CENTER" > Ray_2 </TD>
    <TD><TABLE>
	<TR><TD>Point_2</TD></TR>
	<TR><TD>Segment_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Iso_rectangle_2 </TD>
    <TD VALIGN="CENTER" > Iso_rectangle_2 </TD>
    <TD><TABLE>
	<TR><TD>Iso_rectangle_2</TD></TR>
      </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Plane_3 </TD>
    <TD VALIGN="CENTER" > Line_3 </TD>
    <TD><TABLE>
	<TR><TD>Point_3</TD></TR>
	<TR><TD>Line_3</TD></TR>
        </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Plane_3 </TD>
    <TD VALIGN="CENTER" > Ray_3 </TD>
    <TD><TABLE>
	<TR><TD>Point_3</TD></TR>
	<TR><TD>Ray_3</TD></TR>
        </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Plane_3 </TD>
    <TD VALIGN="CENTER" > Segment_3 </TD>
    <TD><TABLE>
	<TR><TD>Point_3</TD></TR>
	<TR><TD>Segment_3</TD></TR>
        </TABLE></TD>
</TR>
<TR>
    <TD VALIGN="CENTER" > Plane_3 </TD>
    <TD VALIGN="CENTER" > Plane_3 </TD>
    <TD><TABLE>
	<TR><TD>Line_3</TD></TR>
	<TR><TD>Plane_3</TD></TR>
        </TABLE></TD>
</TR>
</TABLE>
</DIV>
\end{ccHtmlOnly}

There is also an intersection function between 3 planes.

\ccFunction{Object intersection(const Plane_3<Kernel>& pl1,
                                const Plane_3<Kernel>& pl2,
                                const Plane_3<Kernel>& pl3);}
{returns the intersection of 3 planes, which can be either a point, a line,
a plane, or empty.}

\ccExample

The following example demonstrates the most common use of 
\ccc{intersection} routines.
\begin{verbatim}
#include <CGAL/intersections.h>

void foo(CGAL::Segment_2<Kernel> seg, CGAL::Line_2<Kernel> line)
{
    CGAL::Object result;
    CGAL::Point_2<Kernel> ipoint;
    CGAL::Segment_2<Kernel> iseg;

    result = CGAL::intersection(seg, line);
    if (CGAL::assign(ipoint, result)) {
\end{verbatim}%
\ccHtmlLinksOff%
\begin{verbatim}
        // handle the point intersection case.
\end{verbatim}%
\ccHtmlLinksOn%
\begin{verbatim}
    } else
        if (CGAL::assign(iseg, result)) {
\end{verbatim}%
\ccHtmlLinksOff%
\begin{verbatim}
            // handle the segment intersection case.
\end{verbatim}%
\ccHtmlLinksOn%
\begin{verbatim}
        } else {
\end{verbatim}%
\ccHtmlLinksOff%
\begin{verbatim}
            // handle the no intersection case.
        }
}
\end{verbatim}%
\ccHtmlLinksOn%

\ccSeeAlso
\ccRefIdfierPage{CGAL::assign} \\
\ccRefIdfierPage{CGAL::do_intersect} \\ 
\ccRefIdfierPage{CGAL::Object} \\

\end{ccRefFunction}
