map3MR_PrimalAdapt.h 5.81 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
*                                                                              *
* 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.           *
*                                                                              *
* Web site: http://cgogn.unistra.fr/                                           *
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef __MAP3MR_PRIMAL_ADAPT__
#define __MAP3MR_PRIMAL_ADAPT__

#include "Topology/map/embeddedMap3.h"
#include "Topology/generic/traversorCell.h"
#include "Topology/generic/traversor3.h"
31
#include "Algo/Modelisation/tetrahedralization.h"
32 33 34 35 36
#include <limits>

namespace CGoGN
{

37 38 39
namespace Algo
{

40 41 42
namespace Volume
{

43 44 45 46 47 48 49 50 51
namespace MR
{

namespace Primal
{

namespace Adaptive
{

52 53 54
/*! \brief The class of adaptive 3-map MR
 */

55 56
template <typename PFP>
class Map3MR
57
{
58 59 60 61 62 63

public:
	typedef typename PFP::MAP MAP ;
	typedef typename PFP::VEC3 VEC3 ;
	typedef typename PFP::REAL REAL ;

64
protected:
65
	MAP& m_map;
66 67 68 69 70 71 72 73
	bool shareVertexEmbeddings;

	FunctorType* vertexVertexFunctor ;
	FunctorType* edgeVertexFunctor ;
	FunctorType* faceVertexFunctor ;
	FunctorType* volumeVertexFunctor ;

public:
74
	Map3MR(MAP& map);
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

	/*! @name Cells informations
	 *
	 *************************************************************************/
	//@{
	//! Return the level of the edge of d in the current level map
	/* @param d Dart from the edge
	 */
	unsigned int edgeLevel(Dart d);

	//! Return the level of the face of d in the current level map
	/* @param d Dart from the face
	 */
	unsigned int faceLevel(Dart d);

	//! Return the level of the volume of d in the current level map
	/* @param d Dart from the volume
	 */
	unsigned int volumeLevel(Dart d);

	//! Return the oldest dart of the face of d in the current level map
	/* @param d Dart from the edge
	 */
	Dart faceOldestDart(Dart d);

	//! Return the level of the edge of d in the current level map
	/* @param d Dart from the edge
	 */
	Dart volumeOldestDart(Dart d);

	//! Return true if the edge of d in the current level map
	//! has already been subdivided to the next level
	/*! @param d Dart from the edge
	 */
	bool edgeIsSubdivided(Dart d) ;

	//! Return true if the face of d in the current level map
	//! has already been subdivided to the next level
	/*! @param d Dart from the face
	 */
	bool faceIsSubdivided(Dart d) ;

	//! Return true if the volume of d in the current level map
	//! has already been subdivided to the next level
	/*! @param d Dart from the volume
	 */
	bool volumeIsSubdivided(Dart d);
	//@}

untereiner's avatar
untereiner committed
124
//protected:
125 126 127 128 129 130 131 132 133 134 135 136
	/*! @name Topological helping functions
	 *
	 *************************************************************************/
	//@{
	//!
	/*!
	 */
	void swapEdges(Dart d, Dart e);

	void splitVolume(std::vector<Dart>& vd);

	Dart cutEdge(Dart d) ;
untereiner's avatar
untereiner committed
137

138 139 140 141 142 143 144 145 146 147 148 149
	void splitFace(Dart d, Dart e) ;
	//@}

	/*! @name Subdivision
	 *
	 *************************************************************************/
	//@{
	//! Subdivide the edge of d to the next level
	/*! @param d Dart from the edge
	 */
	void subdivideEdge(Dart d) ;

untereiner's avatar
untereiner committed
150 151 152 153 154
	//!
	/*!
	 */
	void coarsenEdge(Dart d);

155 156 157 158
	//! Subdivide the edge of d to the next level
	/*! @param d Dart frome the face
	 */
	void subdivideFace(Dart d, bool triQuad) ;
159

untereiner's avatar
untereiner committed
160 161 162 163 164
	//!
	/*!
	 */
	void coarsenFace(Dart d);

165
public:
166 167 168 169 170
	//! Subdivide the volume of d to hexahedral cells
	/*! @param d Dart from the volume
	 */
	unsigned int subdivideVolume(Dart d, bool triQuad = true, bool OneLevelDifference = true);

untereiner's avatar
untereiner committed
171 172 173 174 175 176 177 178
	/*!
	 * \brief subdivideHexa
	 *
	 * Detailed description of the function
	 * \param d
	 * \param OneLevelDifference
	 * \return
	 */
179 180
	unsigned int subdivideHexa(Dart d, bool OneLevelDifference = true);

181 182 183 184
	//! Subdivide the volume of d to hexahedral cells
	/*! @param d Dart from the volume
	 */
	void subdivideVolumeTetOcta(Dart d) ;
185 186 187 188 189 190 191 192 193 194 195 196 197
	//@}

	/*! @name Vertices Attributes management
	 *
	 *************************************************************************/
	//@{
	void setVertexVertexFunctor(FunctorType* f) { vertexVertexFunctor = f ; }
	void setEdgeVertexFunctor(FunctorType* f) { edgeVertexFunctor = f ; }
	void setFaceVertexFunctor(FunctorType* f) { faceVertexFunctor = f ; }
	void setVolumeVertexFunctor(FunctorType* f) { volumeVertexFunctor = f ; }
	//@}
};

198 199 200 201 202 203
} // namespace Adaptive

} // namespace Primal

} // namespace MR

204 205
} // namespace Volume

206 207 208 209
} // namespace Algo

} // namespace CGoGN

untereiner's avatar
untereiner committed
210
#include "Algo/Multiresolution/Map3MR/map3MR_PrimalAdapt.hpp"
211 212

#endif /* __MAP3MR_PRIMAL__ */