32#ifndef RCSC_GEOM_DELAUNAY_TRIANGULATION_H
33#define RCSC_GEOM_DELAUNAY_TRIANGULATION_H
38#include <boost/array.hpp>
149 M_pos.assign( x, y );
188 const Vertex * M_vertices[2];
207 std::fill_n( M_triangles, 2,
static_cast< Triangle *
>( 0 ) );
223 if ( M_triangles[0] == tri )
228 M_triangles[0] =
static_cast< Triangle *
>( 0 );
230 if ( M_triangles[1] == tri )
235 M_triangles[1] =
static_cast< Triangle *
>( 0 );
250 if ( M_triangles[0] == tri )
return;
251 if ( M_triangles[1] == tri )
return;
253 if ( ! M_triangles[0] )
258 M_triangles[0] = tri;
260 else if ( ! M_triangles[1] )
265 M_triangles[1] = tri;
286 return M_vertices[i];
296 return M_triangles[i];
306 return ( M_vertices[0] == v
307 || M_vertices[1] == v );
321 boost::array< const Vertex *, 3 > M_vertices;
323 boost::array< EdgePtr, 3 > M_edges;
326 double M_circumradius;
343 Triangle(
const int id,
353 M_edges[0]->removeTriangle(
this );
354 M_edges[1]->removeTriangle(
this );
355 M_edges[2]->removeTriangle(
this );
380 return M_vertices[i];
400 return M_circumcenter;
410 return M_circumradius;
419 return M_voronoi_vertex;
429 return pos.
dist2( M_circumcenter ) < M_circumradius * M_circumradius;
439 return ( v == M_vertices[0]
440 || v == M_vertices[1]
441 || v == M_vertices[2] );
451 return ( M_edges[0] == e
453 || M_edges[2] == e );
466 for ( std::size_t i = 0; i < 3; ++i )
468 if ( M_vertices[i] != v1
469 && M_vertices[i] != v2 )
471 return M_vertices[i];
474 return static_cast< const Vertex *
>( 0 );
498 for ( std::size_t i = 0; i < 3; ++i )
506 return static_cast< Edge *
>( 0 );
516 for ( std::size_t i = 0; i < 3; ++i )
523 return static_cast< Edge *
>( 0 );
542 Vertex M_initial_vertex[3];
577 createInitialTriangle( region );
593 createInitialTriangle( region );
659 void addVertices(
const std::vector< Vector2D > & v );
667 Vertex *
getVertex(
const int id )
const;
701 void createInitialTriangle(
const Rect2D & region );
706 void createInitialTriangle();
711 void removeInitialVertices();
718 bool updateContainedVertex(
const Vertex * vertex,
727 bool updateOnlineVertex(
const Vertex * vertex,
739 const Vertex * new_vertex,
755 void removeEdge(
int id )
757 EdgeCont::iterator it = M_edges.find(
id );
758 if ( it != M_edges.end() )
769 void removeEdge(
Edge * edge )
773 removeEdge( edge->id() );
781 void removeTriangle(
int id )
783 TriangleCont::iterator it = M_triangles.find(
id );
784 if ( it != M_triangles.end() )
792 M_triangles.erase( it );
804 removeTriangle( tri->id() );
818 M_edges.insert( EdgeCont::value_type( ptr->id(), ptr ) );
835 M_triangles.insert( TriangleCont::value_type( ptr->id(), ptr ) );
triangle's edge data.
Definition delaunay_triangulation.h:185
Triangle * triangle(const std::size_t i) const
get the raw pointer to the triangle that this edge belongs to
Definition delaunay_triangulation.h:294
int id() const
get Id number of this edge
Definition delaunay_triangulation.h:273
const Vertex * vertex(const std::size_t i) const
get the raw pointer to the vertex that this edge has
Definition delaunay_triangulation.h:284
void setTriangle(TrianglePtr tri)
set the triangle that this edge belongs to.
Definition delaunay_triangulation.h:248
bool hasVertex(const Vertex *v) const
check if this edge has the specified vertex or not.
Definition delaunay_triangulation.h:304
~Edge()
nothing to do
Definition delaunay_triangulation.h:213
Edge(const int id, const Vertex *v0, const Vertex *v1)
create edge with two vertices. vertices must not be NULL.
Definition delaunay_triangulation.h:198
void removeTriangle(TrianglePtr tri)
remove pointer to the triangle that this edge belongs to. This edge is NOT removed.
Definition delaunay_triangulation.h:221
triangle data
Definition delaunay_triangulation.h:316
Edge * getEdgeExclude(const Vertex *v) const
get the pointer to the edge that does not have the specified vertex.
Definition delaunay_triangulation.h:514
void updateVoronoiVertex()
update the voronoi vertex point (intersection of perpendicular bisectors)
Definition delaunay_triangulation.cpp:137
Edge * edge(std::size_t i) const
get the raw pointer to the edge that this triangle has
Definition delaunay_triangulation.h:388
~Triangle()
remove this triangle from all edges.
Definition delaunay_triangulation.h:351
Edge * getEdgeInclude(const Vertex *v1, const Vertex *v2) const
get the pointer to the edge that has the specified vertices.
Definition delaunay_triangulation.h:495
const Vertex * vertex(std::size_t i) const
get the raw pointer to the vertex that this triangle has
Definition delaunay_triangulation.h:378
bool contains(const Vector2D &pos) const
check if circumcircle contains the specified point
Definition delaunay_triangulation.h:427
bool hasVertex(const Vertex *v) const
check if this triangle has the specified vertex.
Definition delaunay_triangulation.h:437
const Vector2D & voronoiVertex() const
get the voronoi vertex point
Definition delaunay_triangulation.h:417
const double & circumradius() const
get the radius of the circumcircle of this triangle
Definition delaunay_triangulation.h:408
const Vector2D & circumcenter() const
get the circumcenter point of this triangle
Definition delaunay_triangulation.h:398
const Vertex * getVertexExclude(const Vertex *v1, const Vertex *v2) const
get the pointer to the vertex that is different from the specified vertices.
Definition delaunay_triangulation.h:463
const Vertex * getVertexExclude(const Edge *edge) const
get the pointer to the vertex that does not belong to the specified edge.
Definition delaunay_triangulation.h:483
int id() const
get the Id of this triangle
Definition delaunay_triangulation.h:367
bool hasEdge(const EdgePtr e) const
check if this triangle has the specified edge.
Definition delaunay_triangulation.h:449
triangle's vertex data. This is handled as kernel point for the Voronoi diagram..
Definition delaunay_triangulation.h:72
Vertex(const int id)
create vertex with Id
Definition delaunay_triangulation.h:90
Vertex()
create vertex with Id number 0
Definition delaunay_triangulation.h:81
int id() const
get the Id of this vertex
Definition delaunay_triangulation.h:157
Vertex(const int id, const Vector2D &p)
create vertex with Id & coordinates
Definition delaunay_triangulation.h:106
const Vector2D & pos() const
get the coordinates of the kernel point
Definition delaunay_triangulation.h:167
virtual ~Vertex()
nothing to do
Definition delaunay_triangulation.h:98
Vertex(const int id, const double &x, const double &y)
create vertex with Id & coordinates
Definition delaunay_triangulation.h:118
Vertex & assign(const int id, const double &x, const double &y)
assign data
Definition delaunay_triangulation.h:144
Vertex & assign(const int id, const Vector2D &p)
assign data
Definition delaunay_triangulation.h:130
const VertexCont & vertices() const
get vertices
Definition delaunay_triangulation.h:611
const TriangleCont & triangles() const
get triangle set
Definition delaunay_triangulation.h:631
void clear()
clear all vertices and all computed results.
Definition delaunay_triangulation.cpp:176
void addVertices(const std::vector< Vector2D > &v)
set vertices.
Definition delaunay_triangulation.cpp:239
void compute()
compute the Delaunay Triangulation
Definition delaunay_triangulation.cpp:445
Edge * EdgePtr
alias of Edge pointer
Definition delaunay_triangulation.h:178
const Triangle * findTriangleContains(const Vector2D &pos) const
find triangle that contains pos from the computed triangle set.
Definition delaunay_triangulation.cpp:406
DelaunayTriangulation()
nothing to do
Definition delaunay_triangulation.h:564
std::map< int, TrianglePtr > TriangleCont
triangle pointer container type
Definition delaunay_triangulation.h:532
static const double EPSILON
tolerance threshold
Definition delaunay_triangulation.h:53
const EdgeCont & edges() const
get edge set
Definition delaunay_triangulation.h:621
void updateVoronoiVertex()
calculate voronoi vertex point for each triangle
Definition delaunay_triangulation.cpp:565
const Vertex * findNearestVertex(const Vector2D &pos) const
find the vertex nearest to the specified point
Definition delaunay_triangulation.cpp:419
const Vertex * getVertex(const int id) const
get the const pointer to vertex specified by Id number.
Definition delaunay_triangulation.cpp:389
void clearResults()
clear all computed results
Definition delaunay_triangulation.cpp:187
~DelaunayTriangulation()
destruct
Definition delaunay_triangulation.cpp:164
DelaunayTriangulation(const Rect2D ®ion)
construct with considerable rectangle region
Definition delaunay_triangulation.h:574
int addVertex(const Vector2D &p)
add new vertex
Definition delaunay_triangulation.h:650
std::map< int, EdgePtr > EdgeCont
edge pointer container type
Definition delaunay_triangulation.h:531
std::vector< Vertex > VertexCont
vertex container type
Definition delaunay_triangulation.h:530
void init(const Rect2D ®ion)
initialize with target field rectangle data. All data are cleared. Initial triangle is crated.
Definition delaunay_triangulation.h:590
int addVertex(const double &x, const double &y)
add new vertex
Definition delaunay_triangulation.cpp:214
ContainedType
containment type in triangles
Definition delaunay_triangulation.h:60
Triangle * TrianglePtr
alias of Triangle pointer
Definition delaunay_triangulation.h:179
2D rectangle regin class.
Definition rect_2d.h:59
2D point vector class
Definition vector_2d.h:47
double y
Y coordinate.
Definition vector_2d.h:65
double dist2(const Vector2D &p) const
get the squared distance from this to 'p'.
Definition vector_2d.h:354
double x
X coordinate.
Definition vector_2d.h:64
2d vector class Header File.
2D rectangle region Header File.