map1.hpp 7.08 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
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

namespace CGoGN
{

/// INLINE FUNCTIONS

30
31
template <class MAP>
inline void Map1<MAP>::init()
Pierre Kraemer's avatar
Pierre Kraemer committed
32
{
33
	MAP::addPermutation() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
34
35
}

36
37
template <class MAP>
inline Map1<MAP>::Map1() : MAP()
38
39
40
41
{
	init() ;
}

42
43
template <class MAP>
inline std::string Map1<MAP>::mapTypeName() const
Pierre Kraemer's avatar
Pierre Kraemer committed
44
{
45
	return "Map1" ;
Pierre Kraemer's avatar
Pierre Kraemer committed
46
47
}

48
49
template <class MAP>
inline unsigned int Map1<MAP>::dimension() const
Pierre Kraemer's avatar
Pierre Kraemer committed
50
{
51
52
53
	return 1 ;
}

54
55
template <class MAP>
inline void Map1<MAP>::clear(bool removeAttrib)
56
{
57
	MAP::clear(removeAttrib) ;
Sylvain Thery's avatar
Sylvain Thery committed
58
59
	if (removeAttrib)
		init() ;
Pierre Kraemer's avatar
Pierre Kraemer committed
60
61
}

62
63
template <class MAP>
inline void Map1<MAP>::update_topo_shortcuts()
Sylvain Thery's avatar
Sylvain Thery committed
64
{
65
66
67
	MAP::update_topo_shortcuts();
	m_phi1 = MAP::getRelation("phi1");
	m_phi_1 = MAP::getRelation("phi_1");
Sylvain Thery's avatar
Sylvain Thery committed
68
69
}

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

74
75
template <class MAP>
inline Dart Map1<MAP>::newDart()
Pierre Kraemer's avatar
Pierre Kraemer committed
76
77
{
	Dart d = GenericMap::newDart() ;
78
	unsigned int d_index = MAP::dartIndex(d) ;
79
80
	(*m_phi1)[d_index] = d ;
	(*m_phi_1)[d_index] = d ;
81
82
83
84
85
86
87
88
89
90
91
92
//	if(m_isMultiRes)
//	{
//		pushLevel() ;
//		for(unsigned int i = m_mrCurrentLevel + 1;  i < m_mrDarts.size(); ++i)
//		{
//			setCurrentLevel(i) ;
//			unsigned int d_index = dartIndex(d) ;
//			(*m_phi1)[d_index] = d ;
//			(*m_phi_1)[d_index] = d ;
//		}
//		popLevel() ;
//	}
Pierre Kraemer's avatar
Pierre Kraemer committed
93
94
95
	return d ;
}

96
97
template <class MAP>
inline Dart Map1<MAP>::phi1(Dart d) const
Pierre Kraemer's avatar
Pierre Kraemer committed
98
{
99
	return MAP::getPermutation<0>(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
100
101
}

102
103
template <class MAP>
inline Dart Map1<MAP>::phi_1(Dart d) const
Pierre Kraemer's avatar
Pierre Kraemer committed
104
{
105
	return MAP::getPermutationInv<0>(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
106
107
}

108
template <class MAP>
Pierre Kraemer's avatar
Pierre Kraemer committed
109
template <int N>
110
inline Dart Map1<MAP>::phi(Dart d) const
Pierre Kraemer's avatar
Pierre Kraemer committed
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
{
	assert((N > 0) || !"negative parameters not allowed in template multi-phi");
	if (N < 10)
	{
		switch(N)
		{
			case 1 : return phi1(d) ;
			default : assert(!"Wrong multi-phi relation value") ; return d ;
		}
	}
	switch(N%10)
	{
		case 1 : return phi1(phi<N/10>(d)) ;
		default : assert(!"Wrong multi-phi relation value") ; return d ;
	}
}

128
129
template <class MAP>
inline Dart Map1<MAP>::alpha1(Dart d) const
Pierre Kraemer's avatar
Pierre Kraemer committed
130
131
132
133
{
	return phi1(d) ;
}

134
135
template <class MAP>
inline Dart Map1<MAP>::alpha_1(Dart d) const
Pierre Kraemer's avatar
Pierre Kraemer committed
136
137
138
139
{
	return phi_1(d) ;
}

140
141
template <class MAP>
inline void Map1<MAP>::phi1sew(Dart d, Dart e)
Pierre Kraemer's avatar
Pierre Kraemer committed
142
{
143
	MAP::permutationSew<0>(d,e);
Pierre Kraemer's avatar
Pierre Kraemer committed
144
145
}

146
147
template <class MAP>
inline void Map1<MAP>::phi1unsew(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
148
{
149
	MAP::permutationUnsew<0>(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
150
151
152
153
154
155
}

/*! @name Topological Operators
 *  Topological operations on 1-maps
 *************************************************************************/

156
157
template <class MAP>
inline Dart Map1<MAP>::cutEdge(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
158
159
{
	Dart e = newDart() ;	// Create a new dart
Pierre Kraemer's avatar
Pierre Kraemer committed
160
	phi1sew(d, e) ;			// Insert dart e between d and phi1(d)
Sylvain Thery's avatar
Sylvain Thery committed
161

162
163
	if (this->isBoundaryMarked2(d))
		MAP::boundaryMark2(e);
Pierre Kraemer's avatar
Pierre Kraemer committed
164

165
166
	if (MAP::isBoundaryMarked3(d))
		MAP::boundaryMark3(e);
167

Pierre Kraemer's avatar
Pierre Kraemer committed
168
	return e ;
Pierre Kraemer's avatar
Pierre Kraemer committed
169
170
}

171
172
template <class MAP>
inline void Map1<MAP>::uncutEdge(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
173
174
{
	Dart d1 = phi1(d) ;
175
176
	phi1unsew(d) ;			// Dart d is linked to the successor of its successor
	MAP::deleteDart(d1) ;	// Dart d1 is erased
Pierre Kraemer's avatar
Pierre Kraemer committed
177
178
}

179
180
template <class MAP>
inline void Map1<MAP>::collapseEdge(Dart d)
Pierre Kraemer's avatar
Pierre Kraemer committed
181
182
{
	phi1unsew(phi_1(d)) ;	// Dart before d is linked to its successor
183
	MAP::deleteDart(d) ;	// Dart d is erased
Pierre Kraemer's avatar
Pierre Kraemer committed
184
185
}

186
187
template <class MAP>
inline void Map1<MAP>::splitCycle(Dart d, Dart e)
Pierre Kraemer's avatar
Pierre Kraemer committed
188
{
189
190
	assert(d != e && sameCycle(d, e)) ;
	phi1sew(phi_1(d), phi_1(e)) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
191
192
}

193
194
template <class MAP>
inline void Map1<MAP>::mergeCycles(Dart d, Dart e)
Thomas's avatar
Thomas committed
195
{
196
197
	assert(!sameCycle(d, e)) ;
	phi1sew(phi_1(d), phi_1(e)) ;
Thomas's avatar
Thomas committed
198
199
}

200
201
template <class MAP>
inline void Map1<MAP>::linkCycles(Dart d, Dart e)
Pierre Kraemer's avatar
Pierre Kraemer committed
202
{
203
	assert(d != e && !sameCycle(d, e)) ;
204
205
	Map1<MAP>::cutEdge(phi_1(d));		// cut the edge before d (insert a new dart before d)
	Map1<MAP>::cutEdge(phi_1(e));		// cut the edge before e (insert a new dart before e)
206
	phi1sew(phi_1(d), phi_1(e)) ;	// phi1sew between the 2 new inserted darts
Pierre Kraemer's avatar
Pierre Kraemer committed
207
208
209
210
211
212
}

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

213
214
template <class MAP>
inline bool Map1<MAP>::sameCycle(Dart d, Dart e) const
Pierre Kraemer's avatar
Pierre Kraemer committed
215
{
216
217
218
219
220
221
222
223
224
225
	Dart it = d ;
	do
	{
		if(it == e)
			return true ;
		it = phi1(it) ;
	} while(it != d) ;
	return false ;
}

226
227
template <class MAP>
inline unsigned int Map1<MAP>::cycleDegree(Dart d) const
228
229
230
231
{
	unsigned int count = 0 ;
	Dart it = d ;
	do
232
    {
233
234
235
236
237
238
		++count ;
		it = phi1(it) ;
	} while (it != d) ;
	return count ;
}

239
240
template <class MAP>
inline int Map1<MAP>::checkCycleDegree(Dart d, unsigned int degree) const
241
242
243
244
245
246
247
248
249
250
251
252
{
	unsigned int count = 0 ;
	Dart it = d ;
	do
	{
		++count ;
		it = phi1(it) ;
	} while ((count<=degree) && (it != d)) ;

	return count-degree;
}

253
254
template <class MAP>
inline bool Map1<MAP>::isCycleTriangle(Dart d) const
255
256
{
	return (phi1(d) != d) && (phi1(phi1(phi1(d))) == d) ;
Pierre Kraemer's avatar
Pierre Kraemer committed
257
258
259
260
261
262
}

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

263
264
template <class MAP>
inline bool Map1<MAP>::foreach_dart_of_vertex(Dart d, FunctorType& f, unsigned int /*thread*/) const
Pierre Kraemer's avatar
Pierre Kraemer committed
265
266
267
268
{
	return f(d) ;
}

269
270
template <class MAP>
inline bool Map1<MAP>::foreach_dart_of_edge(Dart d, FunctorType& f, unsigned int /*thread*/) const
Pierre Kraemer's avatar
Pierre Kraemer committed
271
272
273
274
{
	return f(d) ;
}

275
276
template <class MAP>
inline bool Map1<MAP>::foreach_dart_of_cc(Dart d, FunctorType& f, unsigned int /*thread*/) const
277
278
279
280
281
282
283
284
285
286
287
{
	Dart it = d ;
	do
	{
		if (f(it))
			return true ;
		it = phi1(it) ;
	} while (it != d) ;
	return false ;
}

Pierre Kraemer's avatar
Pierre Kraemer committed
288
289

} // namespace CGoGN