|
CGAL 6.0 - 2D and 3D Linear Geometry Kernel
|
Functions | |
| template<typename Kernel > | |
| decltype(auto) | 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. | |
| template<typename Kernel > | |
| decltype(auto) | 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. | |
| decltype(auto) 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 of intersecting two objects of the types Type1 and Type2 can be specified through the placeholder type specifier auto. It is equivalent to std::optional< std::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 std::optional< std::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 of intersecting two objects of the types Type1 and Type2 can be specified through the placeholder type specifier auto. It is equivalent to std::optional< std::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 std::optional< std::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 specified through the placeholder type specifier auto, but you must anyway know that the result type is a std::optional<std::variant<..> >, in order to unpack the point or segment.
std::optional comes in as there might be no intersection. std::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 std::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 std::visit.
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