LARS
LARS (Light Augmented Reality System) is an open-source framework for light-based interaction and real-time tracking in multi-robot experiments. Inspired by ARK, LARS extends the augmented reality paradigm to robotic collectives by projecting dynamic visual cues and environments onto the arena, enabling new experimental possibilities for collective robotics research, education, and outreach. LARS features integrated tracking, light projection, and modular experiment control with a user-friendly Qt GUI.
Loading...
Searching...
No Matches
delaunay_triangulation.h
Go to the documentation of this file.
1// -*-c++-*-
2
7
8/*
9 *Copyright:
10
11 Copyright (C) Hidehisa AKIYAMA
12
13 This code is free software; you can redistribute it and/or
14 modify it under the terms of the GNU Lesser General Public
15 License as published by the Free Software Foundation; either
16 version 3 of the License, or (at your option) any later version.
17
18 This library is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 Lesser General Public License for more details.
22
23 You should have received a copy of the GNU Lesser General Public
24 License along with this library; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
27 *EndCopyright:
28 */
29
31
32#ifndef RCSC_GEOM_DELAUNAY_TRIANGULATION_H
33#define RCSC_GEOM_DELAUNAY_TRIANGULATION_H
34
35#include <geom/rect_2d.h>
36#include <geom/vector_2d.h>
37
38#include <boost/array.hpp>
39
40#include <algorithm>
41#include <map>
42#include <vector>
43
44namespace rcsc {
45
51public:
52
53 static const double EPSILON;
54
56
61 NOT_CONTAINED,
62 CONTAINED,
63 ONLINE,
64 SAME_VERTEX,
65 };
66
68
72 class Vertex {
73 private:
74 int M_id;
75 Vector2D M_pos;
76
77 public:
82 : M_id( 0 )
83 { }
84
89 explicit
90 Vertex( const int id )
91 : M_id( id )
92 { }
93
97 virtual
99 { }
100
106 Vertex( const int id,
107 const Vector2D & p )
108 : M_id( id )
109 , M_pos( p )
110 { }
111
118 Vertex( const int id,
119 const double & x,
120 const double & y )
121 : M_id( id )
122 , M_pos( x, y )
123 { }
124
130 Vertex & assign( const int id,
131 const Vector2D & p )
132 {
133 M_id = id;
134 M_pos = p;
135 return *this;
136 }
137
144 Vertex & assign( const int id,
145 const double & x,
146 const double & y )
147 {
148 M_id = id;
149 M_pos.assign( x, y );
150 return *this;
151 }
152
157 int id() const
158 {
159 return M_id;
160 }
161
166 const
167 Vector2D & pos() const
168 {
169 return M_pos;
170 }
171 };
172
174
175 class Edge;
176 class Triangle;
177
178 typedef Edge* EdgePtr;
180
182
185 class Edge {
186 private:
187 const int M_id;
188 const Vertex * M_vertices[2];
189 TrianglePtr M_triangles[2];
190 public:
191
198 Edge( const int id,
199 const Vertex * v0,
200 const Vertex * v1 )
201 : M_id( id )
202 {
203 //std::cout << "Edge() id_" << id << " v0 " << v0 << " v1 " << v1
204 // << std::endl;
205 M_vertices[0] = v0;
206 M_vertices[1] = v1;
207 std::fill_n( M_triangles, 2, static_cast< Triangle * >( 0 ) );
208 }
209
214 { }
215
222 {
223 if ( M_triangles[0] == tri )
224 {
225 //std::cout << "Edge::removeTriangle() edge_id_" << M_id
226 // << " remove tri_0 " << tri->id() << " "
227 // << tri << std::endl;
228 M_triangles[0] = static_cast< Triangle * >( 0 );
229 }
230 if ( M_triangles[1] == tri )
231 {
232 //std::cout << "Edge::removeTriangle() edge_id_" << M_id
233 // << " remove tri_1 " << tri->id() << " "
234 // << tri << std::endl;
235 M_triangles[1] = static_cast< Triangle * >( 0 );
236 }
237 }
238
249 {
250 if ( M_triangles[0] == tri ) return;
251 if ( M_triangles[1] == tri ) return;
252
253 if ( ! M_triangles[0] )
254 {
255 //std::cout << "Edge::setTriangle() edge_id_" << M_id
256 // << " set tri_0 " << tri->id() << " "
257 // << tri << std::endl;
258 M_triangles[0] = tri;
259 }
260 else if ( ! M_triangles[1] )
261 {
262 //std::cout << "Edge::setTriangle() edge_id_" << M_id
263 // << " set tri_1 " << tri->id() << " "
264 // << tri << std::endl;
265 M_triangles[1] = tri;
266 }
267 }
268
273 int id() const
274 {
275 return M_id;
276 }
277
283 const
284 Vertex * vertex( const std::size_t i ) const
285 {
286 return M_vertices[i];
287 }
288
294 Triangle * triangle( const std::size_t i ) const
295 {
296 return M_triangles[i];
297 }
298
304 bool hasVertex( const Vertex * v ) const
305 {
306 return ( M_vertices[0] == v
307 || M_vertices[1] == v );
308 }
309
310 };
311
313
316 class Triangle {
317 private:
318 int M_id;
319
321 boost::array< const Vertex *, 3 > M_vertices;
323 boost::array< EdgePtr, 3 > M_edges;
324
325 Vector2D M_circumcenter;
326 double M_circumradius;
327
328 Vector2D M_voronoi_vertex;
329
330 // not used
331 Triangle();
332 public:
333
343 Triangle( const int id,
344 EdgePtr e0,
345 EdgePtr e1,
346 EdgePtr e2 );
347
352 {
353 M_edges[0]->removeTriangle( this );
354 M_edges[1]->removeTriangle( this );
355 M_edges[2]->removeTriangle( this );
356 }
357
361 void updateVoronoiVertex();
362
367 int id() const
368 {
369 return M_id;
370 }
371
377 const
378 Vertex * vertex( std::size_t i ) const
379 {
380 return M_vertices[i];
381 }
382
388 Edge * edge( std::size_t i ) const
389 {
390 return M_edges[i];
391 }
392
397 const
399 {
400 return M_circumcenter;
401 }
402
407 const
408 double & circumradius() const
409 {
410 return M_circumradius;
411 }
412
417 const Vector2D & voronoiVertex() const
418 {
419 return M_voronoi_vertex;
420 }
421
427 bool contains( const Vector2D & pos ) const
428 {
429 return pos.dist2( M_circumcenter ) < M_circumradius * M_circumradius;
430 }
431
437 bool hasVertex( const Vertex * v ) const
438 {
439 return ( v == M_vertices[0]
440 || v == M_vertices[1]
441 || v == M_vertices[2] );
442 }
443
449 bool hasEdge( const EdgePtr e ) const
450 {
451 return ( M_edges[0] == e
452 || M_edges[1] == e
453 || M_edges[2] == e );
454 }
455
462 const
464 const Vertex * v2 ) const
465 {
466 for ( std::size_t i = 0; i < 3; ++i )
467 {
468 if ( M_vertices[i] != v1
469 && M_vertices[i] != v2 )
470 {
471 return M_vertices[i];
472 }
473 }
474 return static_cast< const Vertex * >( 0 );
475 }
476
482 const
483 Vertex * getVertexExclude( const Edge * edge ) const
484 {
485 return getVertexExclude( edge->vertex( 0 ),
486 edge->vertex( 1 ) );
487 }
488
496 const Vertex * v2 ) const
497 {
498 for ( std::size_t i = 0; i < 3; ++i )
499 {
500 if ( M_edges[i]->hasVertex( v1 )
501 && M_edges[i]->hasVertex( v2 ) )
502 {
503 return M_edges[i];
504 }
505 }
506 return static_cast< Edge * >( 0 );
507 }
508
514 Edge * getEdgeExclude( const Vertex * v ) const
515 {
516 for ( std::size_t i = 0; i < 3; ++i )
517 {
518 if ( ! M_edges[i]->hasVertex( v ) )
519 {
520 return M_edges[i];
521 }
522 }
523 return static_cast< Edge * >( 0 );
524 }
525
526 };
527
529
530 typedef std::vector< Vertex > VertexCont;
531 typedef std::map< int, EdgePtr > EdgeCont;
532 typedef std::map< int, TrianglePtr > TriangleCont;
533
534private:
535
537 int M_edge_count;
539 int M_tri_count;
540
542 Vertex M_initial_vertex[3];
543
545 EdgePtr M_initial_edge[3];
546
548 VertexCont M_vertices;
549
551 EdgeCont M_edges;
552
554 TriangleCont M_triangles;
555
556 // not used
557 DelaunayTriangulation & operator=( const DelaunayTriangulation & );
558
559public:
560
566
573 explicit
575 {
576 //std::cout << "create with rect" << std::endl;
577 createInitialTriangle( region );
578 }
579
584
590 void init( const Rect2D & region )
591 {
592 clear();
593 createInitialTriangle( region );
594 }
595
599 void clear();
600
604 void clearResults();
605
610 const
612 {
613 return M_vertices;
614 }
615
620 const
621 EdgeCont & edges() const
622 {
623 return M_edges;
624 }
625
630 const
632 {
633 return M_triangles;
634 }
635
642 int addVertex( const double & x,
643 const double & y );
644
650 int addVertex( const Vector2D & p )
651 {
652 return addVertex( p.x, p.y );
653 }
654
659 void addVertices( const std::vector< Vector2D > & v );
660
666 const
667 Vertex * getVertex( const int id ) const;
668
672 void compute();
673
677 void updateVoronoiVertex();
678
684 const
685 Triangle * findTriangleContains( const Vector2D & pos ) const;
686
692 const
693 Vertex * findNearestVertex( const Vector2D & pos ) const;
694
695private:
696
701 void createInitialTriangle( const Rect2D & region );
702
706 void createInitialTriangle();
707
711 void removeInitialVertices();
712
718 bool updateContainedVertex( const Vertex * vertex,
719 const TrianglePtr tri );
720
727 bool updateOnlineVertex( const Vertex * vertex,
728 const TrianglePtr tri );
729
738 bool legalizeEdge( TrianglePtr new_tri,
739 const Vertex * new_vertex,
740 EdgePtr old_edge );
741
749 TrianglePtr * sol ) const;
750
755 void removeEdge( int id )
756 {
757 EdgeCont::iterator it = M_edges.find( id );
758 if ( it != M_edges.end() )
759 {
760 delete it->second;
761 M_edges.erase( it );
762 }
763 }
764
769 void removeEdge( Edge * edge )
770 {
771 if ( edge )
772 {
773 removeEdge( edge->id() );
774 }
775 }
776
781 void removeTriangle( int id )
782 {
783 TriangleCont::iterator it = M_triangles.find( id );
784 if ( it != M_triangles.end() )
785 {
786 //std::cout << "remove triangle " << id
787 // << it->second->vertex( 0 )->pos()
788 // << it->second->vertex( 1 )->pos()
789 // << it->second->vertex( 2 )->pos()
790 // << std::endl;
791 delete it->second;
792 M_triangles.erase( it );
793 }
794 }
795
800 void removeTriangle( TrianglePtr tri )
801 {
802 if ( tri )
803 {
804 removeTriangle( tri->id() );
805 }
806 }
807
814 EdgePtr createEdge( const Vertex * v0,
815 const Vertex * v1 )
816 {
817 EdgePtr ptr = new Edge( M_edge_count++, v0, v1 );
818 M_edges.insert( EdgeCont::value_type( ptr->id(), ptr ) );
819 return ptr;
820 }
821
829 TrianglePtr createTriangle( Edge * e0,
830 Edge * e1,
831 Edge * e2 )
832 {
833 // triangle is set to edges in the constructor of Triangle
834 TrianglePtr ptr = new Triangle( M_tri_count++, e0, e1, e2 );
835 M_triangles.insert( TriangleCont::value_type( ptr->id(), ptr ) );
836 return ptr;
837 }
838
839};
840
841}
842
843#endif
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 &region)
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 &region)
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.