gmap2.h 15.9 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1 2 3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Pierre Kraemer's avatar
Pierre Kraemer committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library is distributed in the hope that it will be useful, but WITHOUT  *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
Pierre Kraemer's avatar
Pierre Kraemer committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef __GMAP2_H__
#define __GMAP2_H__

#include "Topology/gmap/gmap1.h"

namespace CGoGN
{

/**
* The class of 2-GMap
*/
Pierre Kraemer's avatar
Pierre Kraemer committed
36 37
template <typename MAP_IMPL>
class GMap2 : public GMap1<MAP_IMPL>
Pierre Kraemer's avatar
Pierre Kraemer committed
38 39
{
protected:
40 41 42
	// protected copy constructor to prevent the copy of map
	GMap2(const GMap2<MAP_IMPL>& m):GMap1<MAP_IMPL>(m) {}

43 44
	void init() ;

Pierre Kraemer's avatar
Pierre Kraemer committed
45
public:
Pierre Kraemer's avatar
Pierre Kraemer committed
46 47
	typedef MAP_IMPL IMPL;
	typedef GMap1<MAP_IMPL> ParentMap;
Thomas's avatar
Thomas committed
48

Pierre Kraemer's avatar
Pierre Kraemer committed
49
	inline static unsigned int ORBIT_IN_PARENT(unsigned int o) { return o+5; }
50

Pierre Kraemer's avatar
Pierre Kraemer committed
51
	static const unsigned int IN_PARENT = 5 ;
52 53 54 55

	static const unsigned int VERTEX_OF_PARENT = VERTEX+5;
	static const unsigned int EDGE_OF_PARENT = EDGE+5;

56 57
	static const unsigned int DIMENSION = 2 ;

Pierre Kraemer's avatar
Pierre Kraemer committed
58 59
	GMap2();

60
	virtual std::string mapTypeName() const;
Pierre Kraemer's avatar
Pierre Kraemer committed
61

62
	virtual unsigned int dimension() const;
Pierre Kraemer's avatar
Pierre Kraemer committed
63

64 65
	virtual void clear(bool removeAttrib);

Pierre Kraemer's avatar
Pierre Kraemer committed
66 67
	virtual unsigned int getNbInvolutions() const;
	virtual unsigned int getNbPermutations() const;
Sylvain Thery's avatar
Sylvain Thery committed
68

Pierre Kraemer's avatar
Pierre Kraemer committed
69 70 71 72
	/*! @name Basic Topological Operators
	 * Access and Modification
	 *************************************************************************/

Sylvain Thery's avatar
Sylvain Thery committed
73
	Dart beta2(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
74 75

	template <int N>
Sylvain Thery's avatar
Sylvain Thery committed
76
	Dart beta(const Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
77

Sylvain Thery's avatar
Sylvain Thery committed
78
	Dart phi2(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
79 80

	template <int N>
Sylvain Thery's avatar
Sylvain Thery committed
81
	Dart phi(const Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
82

Sylvain Thery's avatar
Sylvain Thery committed
83
	Dart alpha0(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
84

Sylvain Thery's avatar
Sylvain Thery committed
85
	Dart alpha1(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
86

Sylvain Thery's avatar
Sylvain Thery committed
87
	Dart alpha_1(Dart d) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
88

89
protected:
Pierre Kraemer's avatar
Pierre Kraemer committed
90 91 92 93
	void beta2sew(Dart d, Dart e);

	void beta2unsew(Dart d);

94
public:
Pierre Kraemer's avatar
Pierre Kraemer committed
95 96 97 98 99
	/*! @name Constructors and Destructors
	 *  To generate or delete cells in a 2-G-map
	 *************************************************************************/

	//@{
100 101 102 103 104
	//! Create an new face of nbEdges
	/*! @param nbEdges the number of edges
	 *  @param withBoudary create the face and its boundary (default true)
	 *  @return return a dart of the face
	 */
105
	Dart newFace(unsigned int nbEdges, bool withBoundary = true) ;
106

Pierre Kraemer's avatar
Pierre Kraemer committed
107 108 109
	//! Delete a face erasing all its darts
	/*! @param d a dart of the face
	 */
110
	void deleteFace(Dart d);
111

Pierre Kraemer's avatar
Pierre Kraemer committed
112 113 114
	//! Delete a connected component of the map
	/*! @param d a dart of the connected component
	 */
115
	void deleteCC(Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
116

117 118 119 120
	//! Fill a hole with a face
	/*! \pre Dart d is boundary marked
	 *  @param d a dart of the face to fill
	 */
121
	void fillHole(Dart d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
122 123 124 125 126 127 128
	//@}

	/*! @name Topological Operators
	 *  Topological operations on 2-G-maps
	 *************************************************************************/

	//@{
129
	//! Split a vertex v between d and e inserting an edge after d and e
Pierre Kraemer's avatar
Pierre Kraemer committed
130 131 132 133
	/*! \pre Darts d & e MUST belong to the same oriented vertex
	 *  @param d first dart in vertex v
	 *  @param e second dart in vertex v
	 */
134
	void splitVertex(Dart d, Dart e);
Pierre Kraemer's avatar
Pierre Kraemer committed
135

136
	//! Delete the vertex of d (works only for internal vertices)
137 138
	/*! Does not create a hole -> all the faces
	 * 	around the vertex are merged into one face
139
	 *  @param d a dart of the vertex to delete
140
	 *  @return a dart of the resulting face (NIL if the deletion has not been executed)
141
	 */
142
	Dart deleteVertex(Dart d) ;
143

144
	//! Cut the edge of d by inserting a new vertex
Pierre Kraemer's avatar
Pierre Kraemer committed
145
	/*! @param d a dart of the edge to cut
146
	 *  @return a dart of the new vertex
Pierre Kraemer's avatar
Pierre Kraemer committed
147
	 */
148
	Dart cutEdge(Dart d);
Pierre Kraemer's avatar
Pierre Kraemer committed
149

150
	//! Undo the cut of the edge of d
151
	/*! @param d a dart of the edge to uncut
152
	 *  @return true if the uncut has been executed, false otherwise
153
	 */
154
	bool uncutEdge(Dart d);
155

Pierre Kraemer's avatar
Pierre Kraemer committed
156 157 158
	//! Collapse an edge (that is deleted) possibly merging its vertices
	/*! If delDegenerateFaces is true, the method checks that no degenerate
	 *  faces are build (faces with less than 3 edges). If it occurs the faces
159
	 *  are deleted and the adjacencies are updated (see deleteIfDegenerated).
Pierre Kraemer's avatar
Pierre Kraemer committed
160 161 162 163
	 *  \warning This may produce two distinct vertices if the edge
	 *  was the only link between two border faces
	 *  @param d a dart in the deleted edge
	 *  @param delDegenerateFaces a boolean (default to true)
164
	 *  @return a dart of the resulting vertex
Pierre Kraemer's avatar
Pierre Kraemer committed
165
	 */
166
	Dart collapseEdge(Dart d, bool delDegenerateFaces = true);
Pierre Kraemer's avatar
Pierre Kraemer committed
167 168

	/**
169 170
	 * Flip the edge of d (rotation in phi1 order)
	 * WARNING : Works only for non-border edges
Pierre Kraemer's avatar
Pierre Kraemer committed
171 172 173
	 * @param d a dart of the edge to flip
	 * @return true if the flip has been executed, false otherwise
	 */
174
	bool flipEdge(Dart d);
Pierre Kraemer's avatar
Pierre Kraemer committed
175 176

	/**
177 178
	 * Flip the edge of d (rotation in phi_1 order)
	 * WARNING : Works only for non-border edges
Pierre Kraemer's avatar
Pierre Kraemer committed
179
	 * @param d a dart of the edge to flip
180
	 * @return true if the flipBack has been executed, false otherwise
Pierre Kraemer's avatar
Pierre Kraemer committed
181
	 */
182
	bool flipBackEdge(Dart d);
Pierre Kraemer's avatar
Pierre Kraemer committed
183

184 185 186 187 188 189 190 191 192 193 194 195 196 197
//	//! Insert an edge after a dart in the vertex orbit
//	/*! \pre Dart d and e MUST be different and belong to distinct face
//	 *  \pre Dart e must be phi2-linked with its phi_1 dart
//	 *  @param d dart of the vertex
//	 *  @param e dart of the edge
//	 */
//	virtual void insertEdgeInVertex(Dart d, Dart e);
//
//	//! Remove an edge from a vertex orbit
//	/*! \pre Dart d must be phi2 sewn
//	 *  @param d the dart of the edge to remove from the vertex
//	 */
//	virtual void removeEdgeFromVertex(Dart d);

thomas's avatar
thomas committed
198
	//! Sew two faces along an edge (pay attention to the orientation !)
199
	/*! \pre Edges of darts d & e MUST be boundary edges
Pierre Kraemer's avatar
Pierre Kraemer committed
200 201
	 *  @param d a dart of the first face
	 *  @param e a dart of the second face
202
	 *  @param withBoundary: if false, faces must have beta2 fixed points (only for construction: import/primitives)
Pierre Kraemer's avatar
Pierre Kraemer committed
203
	 */
204
	void sewFaces(Dart d, Dart e, bool withBoundary = true);
Pierre Kraemer's avatar
Pierre Kraemer committed
205

206 207 208
	//! Unsew two faces
	/*! \pre Edge of dart d MUST NOT be a boundary edge
	 *  @param d a dart of a face
Pierre Kraemer's avatar
Pierre Kraemer committed
209 210 211
	 */
	virtual void unsewFaces(Dart d);

212 213 214
	//! Delete a face if and only if it has one or two edges
	/*! If the face is sewed to two distinct adjacent faces,
	 *  then those two faces are sewed
Pierre Kraemer's avatar
Pierre Kraemer committed
215 216 217 218 219 220 221 222 223 224
	 *  @param d a dart of the face
	 *  @return true if the collapse has been executed, false otherwise
	 */
	virtual bool collapseDegeneratedFace(Dart d);

	//! Split a face f between d and e inserting an edge between vertices d & e
	/*! \pre Darts d & e MUST belong to the same face
	 *  @param d first dart in face f
	 *  @param e second dart in face f
	 */
225
	void splitFace(Dart d, Dart e);
Pierre Kraemer's avatar
Pierre Kraemer committed
226 227

	//! Merge the two faces incident to the edge of d.
228 229
	/*! Works only for non-boundary edges.
	 *  \warning Darts of the edge of d no longer exist after the call
Pierre Kraemer's avatar
Pierre Kraemer committed
230 231 232
	 *  @param d a dart in the first face
	 *  @return true if the merge has been executed, false otherwise
	 */
233
	bool mergeFaces(Dart d);
Pierre Kraemer's avatar
Pierre Kraemer committed
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

	/**
	 * Extract a pair of sewed triangles and sew their adjacent faces
	 * d is a dart of the common edge of the pair of triangles
	 */
	void extractTrianglePair(Dart d) ;

	/**
	 * Insert a pair of sewed triangles in a vertex by exploding the edges of d1 and d2
	 * d1 and d2 belong to the same vertex
	 * d is a dart of the common edge of the pair of triangles
	 */
	void insertTrianglePair(Dart d, Dart v1, Dart v2) ;

	//! Merge two volumes along two faces.
	/*! Works only if the two faces have the same number of edges.
250
	 *  The faces adjacent to the two given faces are pairwise sewed
Pierre Kraemer's avatar
Pierre Kraemer committed
251 252 253 254 255 256 257
	 *  then the 2 faces are deleted.
	 *  If the two faces belong to different surfaces, the surfaces are merged,
	 *  else a handle is created that increases the genus of the surface.
	 *  @param d a dart of the first face
	 *  @param e a dart of the second face
	 *  @return true if the merge has been executed, false otherwise
	 */
258
	bool mergeVolumes(Dart d, Dart e);
untereiner's avatar
untereiner committed
259 260 261 262 263

	//!
	/*!
	 *
	 */
264
	void splitSurface(std::vector<Dart>& vd, bool firstSideClosed = true, bool secondSideClosed = true);
untereiner's avatar
untereiner committed
265

Pierre Kraemer's avatar
Pierre Kraemer committed
266 267 268 269 270 271
	//@}

	/*! @name Topological Queries
	 *  Return or set various topological information
	 *************************************************************************/

272
	//@{
Thomas's avatar
Thomas committed
273 274 275 276
	//! Test if dart d and e belong to the same oriented vertex
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
277
	bool sameOrientedVertex(Dart d, Dart e) const;
Thomas's avatar
Thomas committed
278

Pierre Kraemer's avatar
Pierre Kraemer committed
279 280 281 282
	//! Test if dart d and e belong to the same vertex
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
283
	bool sameVertex(Dart d, Dart e) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
284

285 286 287
	/**
	 * compute the number of edges of the vertex of d
	 */
Sylvain Thery's avatar
Sylvain Thery committed
288
	unsigned int vertexDegree(Dart d) const;
289

290 291 292 293 294
	//! Check number of edges of the vertex of d with given parameter
	/*! @param d a dart
	 *	@param vd degree to compare with
	 *  @return  negative/null/positive if vertex degree is less/equal/greater than given degree
	 */
Sylvain Thery's avatar
Sylvain Thery committed
295
	int checkVertexDegree(Dart d, unsigned int vd) const;
296

297 298
	//! tell if the vertex of d is on the boundary of the map
	/*! @param d a dart
299
	 */
Sylvain Thery's avatar
Sylvain Thery committed
300
	bool isBoundaryVertex(Dart d) const;
301

302 303 304 305
	/**
	 * find the dart of vertex that belong to the boundary
	 * return NIL if the vertex is not on the boundary
	 */
Sylvain Thery's avatar
Sylvain Thery committed
306
	Dart findBoundaryEdgeOfVertex(Dart d) const;
307 308 309 310 311

	//! Test if dart d and e belong to the same edge
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
312
	bool sameEdge(Dart d, Dart e) const;
313 314 315 316

	/**
	 * tell if the edge of d is on the boundary of the map
	 */
Sylvain Thery's avatar
Sylvain Thery committed
317
	bool isBoundaryEdge(Dart d) const;
318 319 320 321 322

	//!Test if dart d and e belong to the same oriented face
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
323
	bool sameOrientedFace(Dart d, Dart e) const;
324 325 326 327 328

	//! Test if dart d and e belong to the same face
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
329
	bool sameFace(Dart d, Dart e) const;
330 331 332 333

	/**
	 * compute the number of edges of the face of d
	 */
Sylvain Thery's avatar
Sylvain Thery committed
334
	unsigned int faceDegree(Dart d) const;
335

336 337 338 339 340
	//! Check number of edges of the face of d with given parameter
	/*! @param d a dart
	 *	@param vd degree to compare with
	 *  @return  negative/null/positive if vertex degree is less/equal/greater than given degree
	 */
Sylvain Thery's avatar
Sylvain Thery committed
341
	int checkFaceDegree(Dart d, unsigned int le) const;
342

343
	/**
Sylvain Thery's avatar
Tutos  
Sylvain Thery committed
344
	 * tell if the face of d is adjacent to the boundary of the map
345
	 */
Sylvain Thery's avatar
Tutos  
Sylvain Thery committed
346
	bool isBoundaryAdjacentFace(Dart d) const;
347

Thomas's avatar
Thomas committed
348 349 350 351
	//! Test if dart d and e belong to the same oriented volume
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
352
	bool sameOrientedVolume(Dart d, Dart e) const;
Thomas's avatar
Thomas committed
353 354 355 356 357

	//! Test if dart d and e belong to the same volume
	/*! @param d a dart
	 *  @param e a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
358
	bool sameVolume(Dart d, Dart e) const;
359

360 361 362
	//! Compute the number of faces in the volume of d
	/*! @param d a dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
363
	unsigned int volumeDegree(Dart d) const;
364

365 366 367 368 369
	//! Check number of faces of the volume of d with given parameter
	/*! @param d a dart
	 *	@param vd degree to compare with
	 *  @return  negative/null/positive if volume degree is less/equal/greater than given degree
	 */
Sylvain Thery's avatar
Sylvain Thery committed
370
	int checkVolumeDegree(Dart d, unsigned int volDeg) const;
371

372
	// TODO a mettre en algo
Pierre Kraemer's avatar
Pierre Kraemer committed
373
	/**
374 375
	 * check if the mesh is triangular or not
	 * @return a boolean indicating if the mesh is triangular
Pierre Kraemer's avatar
Pierre Kraemer committed
376
	 */
Sylvain Thery's avatar
Sylvain Thery committed
377
	bool isTriangular() const;
378 379 380 381 382

	// TODO a mettre en algo
	/**
	 * Check if map is complete
	 * Should be executed after import
Pierre Kraemer's avatar
Pierre Kraemer committed
383
	 */
Sylvain Thery's avatar
Sylvain Thery committed
384
	virtual bool check() const;
Pierre Kraemer's avatar
Pierre Kraemer committed
385 386 387 388 389

	/**
	 * Check if a serie of darts is an oriented simple close path
	 */
	virtual bool checkSimpleOrientedPath(std::vector<Dart>& vd);
Pierre Kraemer's avatar
Pierre Kraemer committed
390 391 392 393 394 395 396 397
	//@}

	/*! @name Cell Functors
	 *  Apply functors to all darts of a cell
	 *************************************************************************/

	//@{
	/**
398 399
	* Apply a functor on each dart of an oriented vertex
	* @param d a dart of the oriented vertex
Pierre Kraemer's avatar
Pierre Kraemer committed
400 401
	* @param fonct functor obj ref
	*/
402
	void foreach_dart_of_oriented_vertex(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
403 404

	/**
405 406
	* Apply a functor on each dart of a vertex
	* @param d a dart of the vertex
Pierre Kraemer's avatar
Pierre Kraemer committed
407 408
	* @param fonct functor obj ref
	*/
409
	void foreach_dart_of_vertex(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
410

411 412 413 414 415
	/**
	* Apply a functor on each dart of an oriented edge
	* @param d a dart of the oriented edge
	* @param fonct functor obj ref
	*/
416
	void foreach_dart_of_oriented_edge(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
417

Pierre Kraemer's avatar
Pierre Kraemer committed
418 419
	/**
	* Apply a functor on each dart of an edge
420
	* @param d a dart of the oriented edge
Pierre Kraemer's avatar
Pierre Kraemer committed
421 422
	* @param fonct functor obj ref
	*/
423
	void foreach_dart_of_edge(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
424

425 426
	//! Apply a functor on every dart of an oriented face
	/*! @param d a dart of the oriented face
Pierre Kraemer's avatar
Pierre Kraemer committed
427 428
	 *  @param f the functor to apply
	 */
429
	void foreach_dart_of_oriented_face(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
430

431 432
	//! Apply a functor on every dart of a face
	/*! @param d a dart of the face
Pierre Kraemer's avatar
Pierre Kraemer committed
433 434
	 *  @param f the functor to apply
	 */
435
	void foreach_dart_of_face(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Pierre Kraemer's avatar
Pierre Kraemer committed
436

437 438
	//! Apply a functor on every dart of an oriented convex component
	/*! @param d a dart of the oriented convex component
439 440
	 *  @param f the functor to apply
	 */
441
	void foreach_dart_of_oriented_cc(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
442

443 444
	//! Apply a functor on every dart of a convex component
	/*! @param d a dart of the convex component
445 446
	 *  @param f the functor to apply
	 */
447
	void foreach_dart_of_cc(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
448 449 450 451 452 453

	/**
	* Apply a functor on each dart of a vertex
	* @param d a dart of the vertex
	* @param fonct functor obj ref
	*/
454
	void foreach_dart_of_vertex1(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
455 456 457 458 459 460

	/**
	* Apply a functor on each dart of an edge
	* @param d a dart of the oriented edge
	* @param fonct functor obj ref
	*/
461
	void foreach_dart_of_edge1(Dart d, std::function<void (Dart)>& f, unsigned int thread = 0) const;
Sylvain Thery's avatar
Sylvain Thery committed
462

463 464 465 466 467 468 469
	//@}

	/*! @name Close map after import or creation
	 *  These functions must be used with care, generally only by import algorithms
	 *************************************************************************/

	//@{
470 471 472 473 474
	/**
	 * create a face of map1 marked as boundary
	 */
	Dart newBoundaryCycle(unsigned int nbE);

475 476 477 478 479 480 481 482 483 484 485 486
	//! Close a topological hole (a sequence of connected fixed point of beta2). DO NOT USE, only for import/creation algorithm
	/*! \pre dart d MUST be fixed point of beta2 relation
	 *  Add a face to the map that closes the hole.
	 *  @param d a dart of the hole (with beta2(d)==d)
	 *  @param forboundary tag the created face as boundary (default is true)
	 *  @return the degree of the created face
	 */
	virtual unsigned int closeHole(Dart d, bool forboundary = true);

	//! Close the map removing topological holes: DO NOT USE, only for import/creation algorithm
	/*! Add faces to the map that close every existing hole.
	 *  These faces are marked as boundary.
487
	 *  @return the number of closed holes
488
	 */
489
	unsigned int closeMap();
490
	//@}
491 492 493 494 495 496 497 498 499 500 501

	/*! @name Compute dual
	 * These functions compute the dual mesh
	 *************************************************************************/

	//@{
	//! Dual mesh computation
	/*!
	 */
	void computeDual();
	//@}
Pierre Kraemer's avatar
Pierre Kraemer committed
502 503 504 505 506 507 508
};

} // namespace CGoGN

#include "Topology/gmap/gmap2.hpp"

#endif