ihm2_PrimalAdapt.h 4.89 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
/*******************************************************************************
* 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 __MAP2MR_PRIMAL_ADAPT__
#define __MAP2MR_PRIMAL_ADAPT__

28
#include "Topology/ihmap/ihm2.h"
29 30
#include "Topology/generic/traversor/traversorCell.h"
#include "Topology/generic/traversor/traversor2.h"
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

#include <cmath>

namespace CGoGN
{

namespace Algo
{

namespace MR
{

namespace Primal
{

namespace Adaptive
{

template <typename PFP>
class IHM2
{

public:
	typedef typename PFP::MAP MAP ;

protected:
	MAP& m_map;
	bool shareVertexEmbeddings ;

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

public:
	IHM2(MAP& map) ;

67 68 69 70 71 72 73 74 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
    /***************************************************
     *               CELLS INFORMATION                 *
     ***************************************************/

    /**
     * Return the level of the edge of d in the current level map
     */
    unsigned int edgeLevel(Dart d) ;

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

    /**
     * Given the face of d in the current level map,
     * return a level 0 dart of its origin face
     */
    Dart faceOrigin(Dart d) ;

    /**
     * Return the oldest dart of the face of d in the current level map
     */
    Dart faceOldestDart(Dart d) ;

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

    /**
     * Return true if the edge of d in the current level map
     * is subdivided to the next level,
     * none of its resulting edges is in turn subdivided to the next level
     * and the middle vertex is of degree 2
     */
    bool edgeCanBeCoarsened(Dart d) ;

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

    /**
     * Return true if the face of d in the current level map
     * is subdivided to the next level
     * and none of its resulting faces is in turn subdivided to the next level
     */
    bool faceIsSubdividedOnce(Dart d) ;

119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
protected:
	/***************************************************
	 *               SUBDIVISION                       *
	 ***************************************************/

	/**
	 * subdivide the edge of d to the next level
	 */
	void subdivideEdge(Dart d) ;

	/**
	 * coarsen the edge of d from the next level
	 */
	void coarsenEdge(Dart d) ;

public:
	/**
	 * subdivide the face of d to the next level
	 */
	unsigned int subdivideFace(Dart d, bool triQuad = true, bool OneLevelDifference = true);

	/**
	 * coarsen the face of d from the next level
	 */
	void coarsenFace(Dart d) ;

	/**
	 * vertices attributes management
	 */
	void setVertexVertexFunctor(FunctorType* f) { vertexVertexFunctor = f ; }
	void setEdgeVertexFunctor(FunctorType* f) { edgeVertexFunctor = f ; }
	void setFaceVertexFunctor(FunctorType* f) { faceVertexFunctor = f ; }
} ;

} // namespace Adaptive

} // namespace Primal

} // namespace MR

} // namespace Algo

} // namespace CGoGN

#include "Algo/Multiresolution/IHM2/ihm2_PrimalAdapt.hpp"

#endif