|
CGAL 5.1 - 2D and 3D Linear Geometry Kernel
|
Functions | |
| template<typename Kernel > | |
| cpp11::result_of< Kernel::Intersect_23(Type1, Type2)>::type | CGAL::intersection (Type1< Kernel > obj1, Type2< Kernel > obj2) |
Two objects obj1 and obj2 intersect if there is a point p that is part of both obj1 and obj2. More... | |
| template<typename Kernel > | |
| boost::optional< boost::variant< Point_3, Line_3, Plane_3 > > | CGAL::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 a point, a line, a plane, or empty. More... | |
| boost::optional< boost::variant< Point_3, Line_3, Plane_3 > > CGAL::intersection | ( | const Plane_3< Kernel > & | pl1, |
| const Plane_3< Kernel > & | pl2, | ||
| const Plane_3< Kernel > & | pl3 | ||
| ) |
#include <CGAL/intersections.h>
returns the intersection of 3 planes, which can be a point, a line, a plane, or empty.
| cpp11::result_of<Kernel::Intersect_23(Type1, Type2)>::type CGAL::intersection | ( | Type1< Kernel > | obj1, |
| Type2< Kernel > | obj2 | ||
| ) |
#include <CGAL/intersections.h>
Two objects obj1 and obj2 intersect if there is a point p that is part of both obj1 and obj2.
The intersection region of those two objects is defined as the set of all points p that are part of both obj1 and 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 intersection region is the complete segment.
Here, Intersect_23 means either Intersect_2 or Intersect_3, depending on the arguments.
The following tables give the possible values for Type1 and Type2.
2D Intersections
The return type can be obtained through CGAL::cpp11::result_of<Kernel::Intersect_2(A, B)>::type. It is equivalent to boost::optional< boost::variant< T... > >, the last column in the table providing the template parameter pack.
| Type1 | Type2 | Return Type: T... |
|---|---|---|
| Iso_rectangle_2 | Iso_rectangle_2 | |
| Iso_rectangle_2 | Line_2 | Point_2, or Segment_2 |
| Iso_rectangle_2 | Ray_2 | Point_2, or Segment_2 |
| Iso_rectangle_2 | Segment_2 | Point_2, or Segment_2 |
| Iso_rectangle_2 | Triangle_2 | Point_2, or Segment_2, or Triangle_2, or std::vector<Point_2> |
| Line_2 | Line_2 | Point_2, or Line_2 |
| Line_2 | Ray_2 | Point_2, or Ray_2 |
| Line_2 | Segment_2 | Point_2, or Segment_2 |
| Line_2 | Triangle_2 | Point_2, or Segment_2 |
| Ray_2 | Ray_2 | Point_2, or Segment_2, or Ray_2 |
| Ray_2 | Segment_2 | Point_2, or Segment_2 |
| Ray_2 | Triangle_2 | Point_2, or Segment_2 |
| Segment_2 | Segment_2 | Point_2, or Segment_2 |
| Segment_2 | Triangle_2 | Point_2, or Segment_2 |
| Triangle_2 | Triangle_2 | Point_2, or Segment_2, or Triangle_2, or std::vector<Point_2> |
Additional overloads are provided for the type Point_2 combined with any other type with the result type being boost::optional< boost::variant< Point_2 > >. Overloads are also provided for the type Bbox_2, for all intersections existing with the type Iso_rectangle_2. Note that the return type for Bbox_2 - Bbox_2 is Bbox_2 and not Iso_rectangle_2.
3D Intersections
The return type can be obtained through CGAL::cpp11::result_of<Kernel::Intersect_3(A, B)>::type. It is equivalent to boost::optional< boost::variant< T... > >, the last column in the table providing the template parameter pack.
Additional overloads are provided for the type Point_3 combined with any other type with the result type being boost::optional< boost::variant< Point_3 > >. Overloads are also provided for the type Bbox_3, for all intersections existing with the type Iso_cuboid_3. Note that the return type for Bbox_3 - Bbox_3 is Bbox_3 and not Iso_cuboid_3.
Examples
The following examples demonstrate the most common use of intersection() functions with the 2D and 3D Linear Kernel.
In the first two examples we intersect a segment and a line. The result type can be obtained with CGAL::cpp11::result_of. It looks simpler if you use a C++ compiler which supports auto, but you must anyways know that the result type is a boost::optional<boost::variant<..> >, in order to unpack the point or segment.
boost::optional comes in as there might be no intersection. boost::variant comes in as, if there is an intersection, it is either a point or a segment.
As explained in the boost manual pages for boost::variant, there are two ways to access the variants. The first examples uses boost::get.
File Kernel_23/intersection_get.cpp
The second example uses boost::apply_visitor.
File Kernel_23/intersection_visitor.cpp
A third example shows the use of the intersection function as a plain function call and with Dispatch_output_iterator, combined with a standard library algorithm.
File Kernel_23/intersections.cpp