\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)

CGAL 4.8 - 2D Apollonius Graphs (Delaunay Graphs of Disks)

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
List of all members
CGAL::Apollonius_graph_2< Gt, Agds > Class Template Reference
2D Apollonius Graphs (Delaunay Graphs of Disks) Reference

`#include <CGAL/Apollonius_graph_2.h>`

Inherited by CGAL::Apollonius_graph_hierarchy_2< Gt, Agds >.

## Definition

The class `Apollonius_graph_2` represents the Apollonius graph.

It supports insertions and deletions of sites. It is templated by two template arguments `Gt`, which must be a model of `ApolloniusGraphTraits_2`, and `Agds`, which must be a model of `ApolloniusGraphDataStructure_2`. The second template argument defaults to `CGAL::Triangulation_data_structure_2< CGAL::Apollonius_graph_vertex_base_2<Gt,true>, CGAL::Triangulation_face_base_2<Gt> >`.

Is Model Of:
  `DelaunayGraph_2`

Traversal of the Apollonius Graph

An Apollonius graph can be seen as a container of faces and vertices. Therefore the Apollonius graph provides several iterators and circulators that allow to traverse it (completely or partially).

Traversal of the Convex Hull

Applied on the `infinite_vertex` the `incident_*` functions allow to visit the vertices on the convex hull and the infinite edges and faces. Note that a counterclockwise traversal of the vertices adjacent to the `infinite_vertex` is a clockwise traversal of the convex hull.

CGAL::Apollonius_graph_2<Gt, Agds> ag;
CGAL::Apollonius_graph_2<Gt, Agds>::Face f;
ag.incident_vertices(ag.infinite_vertex());
ag.incident_vertices(ag.infinite_vertex(), f);
ag.incident_faces(ag.infinite_vertex());
ag.incident_faces(ag.infinite_vertex(), f);
ag.incident_edges(ag.infinite_vertex());
ag.incident_edges(ag.infinite_vertex(), f);

See Also
  `DelaunayGraph_2`
  `ApolloniusGraphTraits_2`
  `ApolloniusGraphDataStructure_2`
  `ApolloniusGraphVertexBase_2`
  `TriangulationFaceBase_2`
  `CGAL::Apollonius_graph_traits_2<K,Method_tag>`
  `CGAL::Apollonius_graph_filtered_traits_2<CK,CM,EK,EM,FK,FM>`
  `CGAL::Triangulation_data_structure_2<Vb,Fb>`
  `CGAL::Apollonius_graph_vertex_base_2<Gt,StoreHidden>`
  `CGAL::Triangulation_face_base_2<Gt>`

Examples:
  Apollonius_graph_2/ag2_exact_traits.cpp, Apollonius_graph_2/ag2_exact_traits_sqrt.cpp, and Apollonius_graph_2/ag2_filtered_traits_no_hidden.cpp.

## Types
typedef Agds | Data_structure
| A type for the underlying data structure.
typedef Data_structure | Triangulation_data_structure
| Same as the `Data_structure` type. More...
typedef Gt | Geom_traits
| A type for the geometric traits.
typedef Gt::Point_2 | Point_2
| A type for the point defined in the geometric traits.
typedef Gt::Site_2 | Site_2
| A type for the Apollonius site, defined in the geometric traits.

## Handles And Iterators
The vertices and faces of the Apollonius graph are accessed through `handles`, `iterators` and `circulators`. The iterators and circulators are all bidirectional and non-mutable. The circulators and iterators are assignable to the corresponding handle types, and they are also convertible to the corresponding handles. The edges of the Apollonius graph can also be visited through iterators and circulators, the edge circulators and iterators are also bidirectional and non-mutable. In the following, we call infinite any face or edge incident to the infinite vertex and the infinite vertex itself. Any other feature (face, edge or vertex) of the Apollonius graph is said to be finite. Some iterators (the `All` iterators ) allow to visit finite or infinite features while the others (the `Finite` iterators) visit only finite features. Circulators visit both infinite and finite features.
typedef Data_structure::Edge | Edge
| the edge type. More...
typedef Data_structure::Vertex | Vertex
| A type for a vertex.
typedef Data_structure::Face | Face
| A type for a face.
typedef Data_structure::Vertex_handle | Vertex_handle
| A type for a handle to a vertex.
typedef Data_structure::Face_handle | Face_handle
| A type for a handle to a face.
typedef Data_structure::Vertex_circulator | Vertex_circulator
| A type for a circulator over vertices incident to a given vertex.
typedef Data_structure::Face_circulator | Face_circulator
| A type for a circulator over faces incident to a given vertex.
typedef Data_structure::Edge_circulator | Edge_circulator
| A type for a circulator over edges incident to a given vertex.
typedef Data_structure::Vertex_iterator | All_vertices_iterator
| A type for an iterator over all vertices.
typedef Data_structure::Face_iterator | All_faces_iterator
| A type for an iterator over all faces.
typedef Data_structure::Edge_iterator | All_edges_iterator
| A type for an iterator over all edges.
typedef Data_structure::size_type | size_type
| An unsigned integral type.
typedef unspecified_type | Finite_vertices_iterator
| A type for an iterator over finite vertices.
typedef unspecified_type | Finite_faces_iterator
| A type for an iterator over finite faces.
typedef unspecified_type | Finite_edges_iterator
| A type for an iterator over finite edges.

## Site Iterators
The following iterators allow respectively to visit all sites, the visible sites and the hidden sites. These iterators are non-mutable, bidirectional and their value type is `Site_2`. They are all invalidated by any change in the Apollonius graph.
typedef unspecified_type | Sites_iterator
| A type for an iterator over all sites.
typedef unspecified_type | Visible_sites_iterator
| A type for an iterator over all visible sites.
typedef unspecified_type | Hidden_sites_iterator
| A type for an iterator over all hidden sites.
Sites_iterator | sites_begin ()
| Starts at an arbitrary site.
Sites_iterator | sites_end ()
| Past-the-end iterator.
Visible_sites_iterator | visible_sites_begin ()
| Starts at an arbitrary visible site.
Visible_sites_iterator | visible_sites_end ()
| Past-the-end iterator.
Hidden_sites_iterator | hidden_sites_begin ()
| Starts at an arbitrary hidden site.
Hidden_sites_iterator | hidden_sites_end ()
| Past-the-end iterator.

## Creation
| Apollonius_graph_2 (Gt gt=Gt())
| Creates an Apollonius graph `ag` using `gt` as geometric traits.
template<class Input_iterator >
| Apollonius_graph_2 (Input_iterator first, Input_iterator beyond, Gt gt=Gt())
| Creates an Apollonius graph `ag` using `gt` as geometric traits and inserts all sites in the range [`first`, `beyond`). More...
| Apollonius_graph_2 (const Apollonius_graph_2< Gt, Agds > &other)
| Copy constructor. More...
Apollonius_graph_2< Gt, Agds > | operator= (const Apollonius_graph_2< Gt, Agds > &other)
| Assignment. More...

## Access Functions
Geom_traits | geom_traits ()
| Returns a reference to the Apollonius graph traits object.
Data_structure | data_structure ()
| Returns a reference to the underlying data structure.
Data_structure | tds ()
| Same as `data_structure()`. More...
int | dimension ()
| Returns the dimension of the Apollonius graph.
size_type | number_of_vertices ()
| Returns the number of finite vertices.
size_type | number_of_visible_sites ()
| Returns the number of visible sites.
size_type | number_of_hidden_sites ()
| Returns the number of hidden sites.
size_type | number_of_faces ()
| Returns the number of faces (both finite and infinite) of the Apollonius graph.
Face_handle | infinite_face ()
| Returns a face incident to the `infinite_vertex`.
Vertex_handle | infinite_vertex ()
| Returns the `infinite_vertex`.
Vertex_handle | finite_vertex ()
| Returns a vertex distinct from the `infinite_vertex`. More...

## Face, Edge and Vertex Iterators
The following iterators allow respectively to visit finite faces, finite edges and finite vertices of the Apollonius graph. These iterators are non-mutable, bidirectional and their value types are respectively `Face`, `Edge` and `Vertex`. They are all invalidated by any change in the Apollonius graph. The following iterators allow respectively to visit all (both finite and infinite) faces, edges and vertices of the Apollonius graph. These iterators are non-mutable, bidirectional and their value types are respectively `Face`, `Edge` and `Vertex`. They are all invalidated by any change in the Apollonius graph.
Finite_vertices_iterator | finite_vertices_begin ()
| Starts at an arbitrary finite vertex.
Finite_vertices_iterator | finite_vertices_end ()
| Past-the-end iterator.
Finite_edges_iterator | finite_edges_begin ()
| Starts at an arbitrary finite edge.
Finite_edges_iterator | finite_edges_end ()
| Past-the-end iterator.
Finite_faces_iterator | finite_faces_begin ()
| Starts at an arbitrary finite face.
Finite_faces_iterator | finite_faces_end () const
| Past-the-end iterator.
All_vertices_iterator | all_vertices_begin ()
| Starts at an arbitrary vertex.
All_vertices_iterator | all_vertices_end ()
| Past-the-end iterator.
All_edges_iterator | all_edges_begin ()
| Starts at an arbitrary edge.
All_edges_iterator | all_edges_end ()
| Past-the-end iterator.
All_faces_iterator | all_faces_begin ()
| Starts at an arbitrary face.
All_faces_iterator | all_faces_end ()
| Past-the-end iterator.

## Face, Edge and Vertex Circulators
The Apollonius graph also provides circulators that allow to visit respectively all faces or edges incident to a given vertex or all vertices adjacent to a given vertex. These circulators are non-mutable and bidirectional. The operator `operator++` moves the circulator counterclockwise around the vertex while the `operator--` moves clockwise. A face circulator is invalidated by any modification of the face pointed to. An edge circulator is invalidated by any modification in one of the two faces incident to the edge pointed to. A vertex circulator is invalidated by any modification in any of the faces adjacent to the vertex pointed to.
Face_circulator | incident_faces (Vertex_handle v)
| Starts at an arbitrary face incident to `v`.
Face_circulator | incident_faces (Vertex_handle v, Face_handle f)
| Starts at face `f`. More...
Edge_circulator | incident_edges (Vertex_handle v)
| Starts at an arbitrary edge incident to `v`.
Edge_circulator | incident_edges (Vertex_handle v, Face_handle f)
| Starts at the first edge of `f` incident to `v`, in counterclockwise order around `v`. More...
Vertex_circulator | incident_vertices (Vertex_handle v)
| Starts at an arbitrary vertex incident to `v`.
Vertex_circulator | incident_vertices (Vertex_handle v, Face_handle f)
| Starts at the first vertex of `f` adjacent to `v` in counterclockwise order around `v`. More...

## Predicates
The class `Apollonius_graph_2` provides methods to test the finite or infinite character of any feature.
bool | is_infinite (Vertex_handle v) const
| `true`, iff `v` is the `infinite_vertex`.
bool | is_infinite (Face_handle f) const
| `true`, iff face `f` is infinite.
bool | is_infinite (Face_handle f, int i) const
| `true`, iff edge `(f,i)` is infinite.
bool | is_infinite (Edge e) const
| `true`, iff edge `e` is infinite.
bool | is_infinite (Edge_circulator ec) const
| `true`, iff edge `*ec` is infinite.

## Insertion
template<class Input_iterator >
unsigned int | insert (Input_iterator first, Input_iterator beyond)
| Inserts the sites in the range [`first`,`beyond`). More...
Vertex_handle | insert (Site_2 s)
| Inserts the site `s` in the Apollonius graph. More...
Vertex_handle | insert (Site_2 s, Vertex_handle vnear)
| Inserts `s` in the Apollonius graph using the site associated with `vnear` as an estimate for the nearest neighbor of the center of `s`. More...

## Removal
void | remove (Vertex_handle v)
| Removes the site associated to the vertex handle `v` from the Apollonius graph. More...

## Nearest Neighbor Location
Vertex_handle | nearest_neighbor (Point_2 p)
| Finds the nearest neighbor of the point `p`. More...
Vertex_handle | nearest_neighbor (Point_2 p, Vertex_handle vnear)
| Finds the nearest neighbor of the point `p` using the site associated with `vnear` as an estimate for the nearest neighbor of `p`. More...

## Access to the Dual
The `Apollonius_graph_2` class provides access to the duals of the faces of the graph. The dual of a face of the Apollonius graph is a site. If the originating face is infinite, its dual is a site with center at infinity (or equivalently with infinite weight), which means that it can be represented geometrically as a line. If the originating face is finite, its dual is a site with finite center and weight. In the following three methods the returned object is assignable to either `Site_2` or `Gt::Line_2`, depending on whether the corresponding face of the Apollonius graph is finite or infinite, respectively.
Gt::Object_2 | dual (Face_handle f) const
| Returns the dual corresponding to the face handle `f`. More...
Gt::Object_2 | dual (All_faces_iterator it) const
| Returns the dual of the face to which `it` points to. More...
Gt::Object_2 | dual (Finite_faces_iterator it) const
| Returns the dual of the face to which `it` points to. More...

## I/O
template<class Stream >
Stream & | draw_primal (Stream &str)
| Draws the Apollonius graph to the stream `str`. More...
template<class Stream >
Stream & | draw_dual (Stream &str)
| Draws the dual of the Apollonius graph, i.e., the Apollonius diagram, to the stream `str`. More...
template<class Stream >
Stream & | draw_primal_edge (Edge e, Stream &str)
| Draws the edge `e` of the Apollonius graph to the stream `str`. More...
template<class Stream >
Stream & | draw_dual_edge (Edge e, Stream &str)
| Draws the dual of the edge `e` to the stream `str`. More...
void | file_output (std::ostream &os)
| Writes the current state of the Apollonius graph to an output stream. More...
void | file_input (std::istream &is)
| Reads the state of the Apollonius graph from an input stream.
std::ostream & | operator<< (std::ostream &os, Apollonius_graph_2< Gt, Agds > ag)
| Writes the current state of the Apollonius graph to an output stream.
std::istream & | operator>> (std::istream &is, Apollonius_graph_2< Gt, Agds > ag)
| Reads the state of the Apollonius graph from an input stream.

## Validity Check
bool | is_valid (bool verbose=false, int level=1)
| Checks the validity of the Apollonius graph. More...

## Miscellaneous
void | clear ()
| Clears all contents of the Apollonius graph.
void | swap (Apollonius_graph_2< Gt, Agds > other)
| The Apollonius graphs `other` and `ag` are swapped. More...

## Member Typedef Documentation

template<typename Gt, typename Agds>

typedef Data_structure::Edge CGAL::Apollonius_graph_2< Gt, Agds >::Edge

the edge type.

The `Edge(f,i)` is the edge common to faces `f` and `f.neighbor(i)`. It is also the edge joining the vertices `vertex(cw(i))` and `vertex(ccw(i))` of `f`.

Precondition
  `i` must be `0`, `1` or `2`.

template<typename Gt, typename Agds>

typedef Data_structure CGAL::Apollonius_graph_2< Gt, Agds >::Triangulation_data_structure

Same as the `Data_structure` type.

This type has been introduced in order for the `Apollonius_graph_2` class to be a model of the `DelaunayGraph_2` concept.

## Constructor & Destructor Documentation

template<typename Gt, typename Agds>
template<class Input_iterator >

CGAL::Apollonius_graph_2< Gt, Agds >::Apollonius_graph_2 | ( | Input_iterator | first,
|  | Input_iterator | beyond,
|  | Gt | gt = `Gt()`
| ) |  |

Creates an Apollonius graph `ag` using `gt` as geometric traits and inserts all sites in the range [`first`, `beyond`).

Precondition
  `Input_iterator` must be a model of `InputIterator`. The value type of `Input_iterator` must be `Site_2`.

template<typename Gt, typename Agds>

CGAL::Apollonius_graph_2< Gt, Agds >::Apollonius_graph_2 | ( | const Apollonius_graph_2< Gt, Agds > & | other) |  |

Copy constructor.

All faces and vertices are duplicated. After the construction, `ag` and `other` refer to two different Apollonius graphs : if `other` is modified, `ag` is not.

## Member Function Documentation

template<typename Gt, typename Agds>
template<class Stream >

Stream& CGAL::Apollonius_graph_2< Gt, Agds >::draw_dual | ( | Stream & | str) |  |

Draws the dual of the Apollonius graph, i.e., the Apollonius diagram, to the stream `str`.

Precondition
  The following operators must be defined: `Stream& operator<<(Stream&, Gt::Segment_2)`, `Stream& operator<<(Stream&, Gt::Ray_2)`, `Stream& operator<<(Stream&, Gt::Line_2)`.

template<typename Gt, typename Agds>
template<class Stream >

Stream& CGAL::Apollonius_graph_2< Gt, Agds >::draw_dual_edge | ( | Edge | e,
|  | Stream & | str
| ) |  |

Draws the dual of the edge `e` to the stream `str`.

The dual of `e` is an edge of the Apollonius diagram.

Precondition
  The following operators must be defined: `Stream& operator<<(Stream&, Gt::Segment_2)`, `Stream& operator<<(Stream&, Gt::Ray_2)`, `Stream& operator<<(Stream&, Gt::Line_2)`.

template<typename Gt, typename Agds>
template<class Stream >

Stream& CGAL::Apollonius_graph_2< Gt, Agds >::draw_primal | ( | Stream & | str) |  |

Draws the Apollonius graph to the stream `str`.

Precondition
  The following operators must be defined: `Stream& operator<<(Stream&, Gt::Segment_2)`, `Stream& operator<<(Stream&, Gt::Ray_2)`.

template<typename Gt, typename Agds>
template<class Stream >

Stream& CGAL::Apollonius_graph_2< Gt, Agds >::draw_primal_edge | ( | Edge | e,
|  | Stream & | str
| ) |  |

Draws the edge `e` of the Apollonius graph to the stream `str`.

Precondition
  The following operators must be defined: `Stream& operator<<(Stream&, Gt::Segment_2)`, `Stream& operator<<(Stream&, Gt::Ray_2)`.

template<typename Gt, typename Agds>

Gt::Object_2 CGAL::Apollonius_graph_2< Gt, Agds >::dual | ( | Face_handle | f) |  | const

Returns the dual corresponding to the face handle `f`.

The returned object can be assignable to one of the following: `Site_2`, `Gt::Line_2`.

template<typename Gt, typename Agds>

Gt::Object_2 CGAL::Apollonius_graph_2< Gt, Agds >::dual | ( | All_faces_iterator | it) |  | const

Returns the dual of the face to which `it` points to.

The returned object can be assignable to one of the following: `Site_2`, `Gt::Line_2`.

template<typename Gt, typename Agds>

Gt::Object_2 CGAL::Apollonius_graph_2< Gt, Agds >::dual | ( | Finite_faces_iterator | it) |  | const

Returns the dual of the face to which `it` points to.

The returned object can be assignable to one of the following: `Site_2`, `Gt::Line_2`.

template<typename Gt, typename Agds>

void CGAL::Apollonius_graph_2< Gt, Agds >::file_output | ( | std::ostream & | os) |  |

Writes the current state of the Apollonius graph to an output stream.

In particular, all visible and hidden sites are written as well as the underlying combinatorial data structure.

template<typename Gt, typename Agds>

Vertex_handle CGAL::Apollonius_graph_2< Gt, Agds >::finite_vertex | ( | ) |  |

Returns a vertex distinct from the `infinite_vertex`.

Precondition
  The number of (visible) vertices in the Apollonius graph must be at least one.

template<typename Gt, typename Agds>

Edge_circulator CGAL::Apollonius_graph_2< Gt, Agds >::incident_edges | ( | Vertex_handle | v,
|  | Face_handle | f
| ) |  |

Starts at the first edge of `f` incident to `v`, in counterclockwise order around `v`.

Precondition
  Face `f` is incident to vertex `v`.

template<typename Gt, typename Agds>

Face_circulator CGAL::Apollonius_graph_2< Gt, Agds >::incident_faces | ( | Vertex_handle | v,
|  | Face_handle | f
| ) |  |

Starts at face `f`.

Precondition
  Face `f` is incident to vertex `v`.

template<typename Gt, typename Agds>

Vertex_circulator CGAL::Apollonius_graph_2< Gt, Agds >::incident_vertices | ( | Vertex_handle | v,
|  | Face_handle | f
| ) |  |

Starts at the first vertex of `f` adjacent to `v` in counterclockwise order around `v`.

Precondition
  Face `f` is incident to vertex `v`.

template<typename Gt, typename Agds>
template<class Input_iterator >

unsigned int CGAL::Apollonius_graph_2< Gt, Agds >::insert | ( | Input_iterator | first,
|  | Input_iterator | beyond
| ) |  |

Inserts the sites in the range [`first`,`beyond`).

The number of sites in the range [`first`, `beyond`) is returned.

Precondition
  `Input_iterator` must be a model of `InputIterator` and its value type must be `Site_2`.

template<typename Gt, typename Agds>

Vertex_handle CGAL::Apollonius_graph_2< Gt, Agds >::insert | ( | Site_2 | s) |  |

Inserts the site `s` in the Apollonius graph.

If `s` is visible then the vertex handle of `s` is returned, otherwise `Vertex_handle(NULL)` is returned.

template<typename Gt, typename Agds>

Vertex_handle CGAL::Apollonius_graph_2< Gt, Agds >::insert | ( | Site_2 | s,
|  | Vertex_handle | vnear
| ) |  |

Inserts `s` in the Apollonius graph using the site associated with `vnear` as an estimate for the nearest neighbor of the center of `s`.

If `s` is visible then the vertex handle of `s` is returned, otherwise `Vertex_handle(NULL)` is returned.

template<typename Gt, typename Agds>

bool CGAL::Apollonius_graph_2< Gt, Agds >::is_valid | ( | bool | verbose = `false`,
|  | int | level = `1`
| ) |  |

Checks the validity of the Apollonius graph.

If `verbose` is `true` a short message is sent to `std::cerr`. If `level` is 0, only the data structure is validated. If `level` is 1, then both the data structure and the Apollonius graph are validated. Negative values of `level` always return true, and values greater then 1 are equivalent to `level` being 1.

template<typename Gt, typename Agds>

Vertex_handle CGAL::Apollonius_graph_2< Gt, Agds >::nearest_neighbor | ( | Point_2 | p) |  |

Finds the nearest neighbor of the point `p`.

In other words it finds the site whose Apollonius cell contains `p`. Ties are broken arbitrarily and one of the nearest neighbors of `p` is returned. If there are no visible sites in the Apollonius diagram `Vertex_handle(NULL)` is returned.

template<typename Gt, typename Agds>

Vertex_handle CGAL::Apollonius_graph_2< Gt, Agds >::nearest_neighbor | ( | Point_2 | p,
|  | Vertex_handle | vnear
| ) |  |

Finds the nearest neighbor of the point `p` using the site associated with `vnear` as an estimate for the nearest neighbor of `p`.

Ties are broken arbitrarily and one of the nearest neighbors of `p` is returned. If there are no visible sites in the Apollonius diagram `Vertex_handle(NULL)` is returned.

template<typename Gt, typename Agds>

Apollonius_graph_2<Gt,Agds> CGAL::Apollonius_graph_2< Gt, Agds >::operator= | ( | const Apollonius_graph_2< Gt, Agds > & | other) |  |

Assignment.

If `ag` and `other` are the same object nothing is done. Otherwise, all the vertices and faces are duplicated. After the assignment, `ag` and `other` refer to different Apollonius graphs : if `other` is modified, `ag` is not.

template<typename Gt, typename Agds>

void CGAL::Apollonius_graph_2< Gt, Agds >::remove | ( | Vertex_handle | v) |  |

Removes the site associated to the vertex handle `v` from the Apollonius graph.

Precondition
  `v` must correspond to a valid finite vertex of the Apollonius graph.

template<typename Gt, typename Agds>

void CGAL::Apollonius_graph_2< Gt, Agds >::swap | ( | Apollonius_graph_2< Gt, Agds > | other) |  |

The Apollonius graphs `other` and `ag` are swapped.

`ag`.`swap(other)` should be preferred to `ag``= other` or to `ag``(other)` if `other` is deleted afterwards.

template<typename Gt, typename Agds>

Data_structure CGAL::Apollonius_graph_2< Gt, Agds >::tds | ( | ) |  |

Same as `data_structure()`.

This method has been added in compliance with the `DelaunayGraph_2` concept.