cgal/Kernel_23/doc_tex/Kernel_23_ref/intersection.tex

338 lines
8.6 KiB
TeX

\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}