Moka kernel
Main Page
Related Pages
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
gmv-dual.cc
Go to the documentation of this file.
1
/*
2
* lib-gmapkernel : Un noyau de 3-G-cartes et des opérations.
3
* Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4
* http://www.sic.sp2mi.univ-poitiers.fr/
5
* Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6
* guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7
*
8
* This file is part of lib-gmapkernel
9
*
10
* This program is free software: you can redistribute it and/or modify
11
* it under the terms of the GNU Lesser General Public License as published by
12
* the Free Software Foundation, either version 3 of the License, or
13
* (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU Lesser General Public License for more details.
19
*
20
* You should have received a copy of the GNU Lesser General Public License
21
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
*/
23
24
//******************************************************************************
25
#include "
g-map-vertex.hh
"
26
using namespace
GMap3d;
27
//******************************************************************************
28
#define DUP(D) (getDirectInfoAsDart(D, directInfoIndex))
29
//******************************************************************************
30
int
CGMapVertex::dualOfMarkedDarts
(
int
ADim,
int
AMarkNumber)
31
{
32
assert((2 <= ADim) && (ADim <= 3));
33
34
int
directInfoIndex =
getNewDirectInfo
();
35
int
treated =
getNewMark
();
36
37
// Duplication des brins:
38
duplicateMarkedDarts
(AMarkNumber,
this
, directInfoIndex,
false
,
39
ADim>=0, ADim>=1, ADim>=2, ADim>=3);
40
41
// Mise à jour des coutures (algo. local):
42
int
nbDuplicated = 0;
43
int
middle = (ADim-1)/2;
44
45
CDynamicCoverageAll
it(
this
);
46
47
for
(; it.
cont
(); ++it)
48
if
(!
isMarked
(*it, treated))
49
{
50
setMark
(*it, treated);
51
52
if
(
isMarked
(*it, AMarkNumber))
53
{
54
CDart
* dup =
DUP
(*it);
55
56
++nbDuplicated;
57
58
setDirectInfo
(dup, directInfoIndex, *it);
59
60
for
(
int
dim = 0; dim <= middle; ++dim)
61
{
62
// Permutation:
63
CDart
* tmp =
alpha
(dup, dim);
64
dup->
setAlpha
(
alpha
(dup, ADim-dim), dim);
65
dup->
setAlpha
(tmp, ADim-dim);
66
}
67
}
68
}
69
70
negateMaskMark
(treated);
71
72
// Maintenant on affecte le plongement sommet des nouveaux brins:
73
for
(it.
reinit
(); it.
cont
(); ++it)
74
if
(!
isMarked
(*it, treated))
75
{
76
if
(
isMarked
(*it, AMarkNumber))
77
{
78
// À optimiser car le barycentre peut être calculé plusieurs fois...
79
setVertex
(
DUP
(*it),
barycenter
(*it,
ORBIT_CELL
[ADim]));
80
81
for
(
CDynamicCoverageVertex
vertex(
this
,
DUP
(*it));
82
vertex.
cont
(); ++vertex)
83
setMark
(
DUP
(*vertex), treated);
84
}
85
else
86
setMark
(*it, treated);
87
}
88
89
negateMaskMark
(treated);
90
91
// Libérations:
92
freeDirectInfo
(directInfoIndex);
93
freeMark
(treated);
94
95
return
nbDuplicated;
96
}
97
//******************************************************************************
98
#undef DUP
99
//******************************************************************************
lib-gmapkernel
g-map-vertex
gmv-dual.cc
Generated on Tue Apr 9 2013 09:51:35 for Moka kernel by
1.8.2