Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Romain De Laage De Bellefaye
LO21-projet
Commits
0739b0fe
Verified
Commit
0739b0fe
authored
Jun 08, 2021
by
Romain De Laage De Bellefaye
🌳
Browse files
Simplify Neighbourhood
parent
a0864f60
Changes
2
Hide whitespace changes
Inline
Side-by-side
includes/voisinage.h
View file @
0739b0fe
...
...
@@ -69,43 +69,29 @@ public:
};
class
RegleVoisinage
{
private
:
public
:
unsigned
int
nbVoisin
;
void
setNbVoisins
(
unsigned
int
r
);
unsigned
int
getNbVoisin
()
{
return
nbVoisin
;}
virtual
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
);
public
:
virtual
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
=
0
;
};
class
RegleVoisinageNeumann
:
public
RegleVoisinage
{
public:
//void setNbVoisins(unsigned int r);
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
unsigned
int
rayon
);
public:
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
override
;
};
class
RegleVoisinageMoore
:
public
RegleVoisinage
{
public:
//void setNbVoisins(unsigned int r);
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
unsigned
int
rayon
);
public:
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
override
;
};
class
RegleVoisinageArbitraire
:
public
RegleVoisinage
{
//définit la règle pour le voisinage arbitraire
public:
vector
<
Coordonnees
>
coordonnees
;
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
Coordonnees
co
)
const
;
// Calcul du voisinage en fonction de la cellule centre
Coordonnees
getVoisinage
(
const
Reseau
&
r
);
// Dééfinition des coordonnées relatives pour le calcul du voisinage
private:
unsigned
int
nbVoisin
;
public:
void
setNbVoisins
(
unsigned
int
r
)
{
nbVoisin
=
r
;
}
unsigned
int
getNbVoisin
()
{
return
nbVoisin
;
}
vector
<
Coordonnees
>
coordonnees
;
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
Coordonnees
co
)
const
;
// Calcul du voisinage en fonction de la cellule centre
Coordonnees
getVoisinage
(
const
Reseau
&
r
);
// Dééfinition des coordonnées relatives pour le calcul du voisinage
};
#endif
/* voisinage_h */
src/voisinage.cpp
View file @
0739b0fe
...
...
@@ -4,207 +4,45 @@
#include
<iostream>
void
Voisinage
::
setr
(
unsigned
int
rayon
){
if
(
rayon
>=
0
)
r
=
rayon
;
else
throw
(
"Rayon incorrect !
\n
"
);
if
(
rayon
>=
0
)
r
=
rayon
;
else
throw
(
"Rayon incorrect !
\n
"
);
}
void
RegleVoisinage
::
setNbVoisins
(
unsigned
int
r
)
{
if
(
r
==
0
)
{
//voisinage arbitraire
cout
<<
"Entrez le nombre de voisins.
\n
"
;
cin
>>
nbVoisin
;
}
}
//void RegleVoisinageNeumann::setNbVoisins(unsigned int r) {
// if (r == 1) { // voisinage de von Neumann
// nbVoisin = 4;
// }
// else { // voisiange de von Neumann avec un rayon
//nbVoisin = 2 * r * (1 + r);
//}
//}
//void RegleVoisinageMoore::setNbVoisins(unsigned int r) {
// if (r == 1) { // voisinage de Moore
// nbVoisin = 8;
//}
//else { // voisiange de Moore avec un rayon
// nbVoisin = pow((2 * r + 1), 2) - 1;
//}
//}
void
RegleVoisinage
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
{
void
RegleVoisinageNeumann
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
{
v
.
voisinage
=
std
::
vector
<
Cellule
*>
();
for
(
int
k
=
0
;
k
<
nbVoisin
;
k
++
)
{
unsigned
int
i
,
j
;
while
(
i
>=
r
.
getHauteur
()
||
j
>=
r
.
getLargeur
())
{
cout
<<
"Entrez l'abscisse de la"
<<
k
<<
"ieme cellule.
\n
"
;
cin
>>
i
;
cout
<<
"Entrez l'ordonnee de la "
<<
k
<<
"ieme cellule.
\n
"
;
cin
>>
j
;
if
(
i
>=
r
.
getHauteur
()
||
j
>=
r
.
getLargeur
())
cout
<<
"Coordonnees incorrectes !
\n
"
;
}
if
(
i
<
r
.
getHauteur
()
&&
j
<
r
.
getLargeur
())
v
.
voisinage
[
k
]
=
&
r
.
getReseau
()[
i
][
j
];
}
}
void
RegleVoisinageNeumann
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
unsigned
int
rayon
)
{
v
.
voisinage
=
std
::
vector
<
Cellule
*>
();
int
nb
=
0
;
unsigned
int
abs
=
v
.
celluleCentre
->
abs
;
unsigned
int
ord
=
v
.
celluleCentre
->
ord
;
unsigned
int
hauteur
=
r
.
getHauteur
();
unsigned
int
largeur
=
r
.
getLargeur
();
if
(
rayon
==
1
)
{
// voisinage de von Neumann
nbVoisin
=
4
;
}
else
{
// voisiange de von Neumann avec un rayon
nbVoisin
=
2
*
r
*
(
1
+
r
);
}
for
(
int
i
=
0
;
i
<
v
.
r
;
i
++
)
{
for
(
int
j
=
0
;
j
<
v
.
r
;
j
++
)
{
if
((
i
+
j
)
<=
v
.
r
||
(
i
+
j
)
!=
0
)
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][(
ord
+
j
)
%
largeur
];
nb
++
;
if
((
ord
-
j
)
<
0
)
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
largeur
+
ord
-
j
];
nb
++
;
if
((
abs
-
i
>=
0
))
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][
largeur
+
ord
-
j
];
nb
++
;
}
else
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][
largeur
+
ord
-
j
];
nb
++
;
}
}
else
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
ord
-
j
];
nb
++
;
if
((
abs
-
i
>=
0
))
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][
abs
-
j
];
nb
++
;
}
else
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][
ord
-
j
];
nb
++
;
}
}
if
(
nb
>=
nbVoisin
)
{
break
;
break
;
}
}
}
}
for
(
int
i
=
-
v
.
r
;
i
<=
v
.
r
;
i
++
)
for
(
int
j
=
-
v
.
r
;
j
<=
v
.
r
;
j
++
)
if
(
abs
(
i
)
+
abs
(
j
)
<=
v
.
r
&&
i
!=
0
&&
j
!=
0
)
v
.
voisinage
.
push_back
(
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][(
ord
+
j
)
%
largeur
]);
}
void
RegleVoisinageMoore
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
,
const
unsigned
int
rayon
){
v
.
voisinage
=
std
::
vector
<
Cellule
*>
();
void
RegleVoisinageMoore
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
{
v
.
voisinage
=
std
::
vector
<
Cellule
*>
();
int
nb
=
0
;
unsigned
int
abs
=
v
.
celluleCentre
->
abs
;
unsigned
int
ord
=
v
.
celluleCentre
->
ord
;
unsigned
int
hauteur
=
r
.
getHauteur
();
unsigned
int
largeur
=
r
.
getLargeur
();
if
(
rayon
==
1
)
{
// voisinage de Moore
nbVoisin
=
8
;
}
else
{
// voisiange de Moore avec un rayon
nbVoisin
=
pow
((
2
*
r
+
1
),
2
)
-
1
;
}
for
(
int
i
=
1
;
i
<=
v
.
r
;
i
++
)
{
for
(
int
j
=
1
;
j
<=
i
;
j
++
)
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][(
ord
+
j
)
%
largeur
];
nb
++
;
if
((
abs
-
i
)
<
0
)
{
if
((
ord
-
j
)
<
0
)
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][
largeur
+
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
largeur
+
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
}
else
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
hauteur
+
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
}
}
else
{
if
((
ord
-
j
)
<
0
)
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][
largeur
+
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
largeur
+
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
}
else
{
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][
ord
-
j
];
nb
++
;
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
i
][(
ord
+
j
)
%
largeur
];
nb
++
;
}
}
}
}
for
(
int
i
=
-
v
.
r
;
i
<=
v
.
r
;
i
++
)
for
(
int
j
=
-
v
.
r
;
j
<=
v
.
r
;
j
++
)
if
(
abs
(
i
)
<=
v
.
r
&&
abs
(
j
)
<=
v
.
r
&&
i
!=
0
&&
j
!=
0
)
v
.
voisinage
.
push_back
(
&
r
.
getReseau
()[(
abs
+
i
)
%
hauteur
][(
ord
+
j
)
%
largeur
]);
}
Voisinage
::~
Voisinage
()
{
voisinage
.
clear
();
voisinage
.
clear
();
}
<<<<<<<
HEAD
void
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
r
,
Coordonnees
co
){
=======
void
RegleVoisinageArbitraire
::
calculVoisinage
(
Voisinage
&
v
,
const
Reseau
&
r
)
{
//définir get?
>>>>>>>
d78cce4e7d49623a3ddb5aa18db685438295923d
v
.
voisinage
=
std
::
vector
<
Cellule
*>
();
unsigned
int
abs
=
v
.
celluleCentre
->
abs
;
...
...
@@ -213,7 +51,7 @@ void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) {
unsigned
int
largeur
=
r
.
getLargeur
();
for
(
int
nb
=
0
;
nb
<
coordonnees
.
size
();
nb
++
){
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
co
[
nb
].
getx
()]
[
ord
-
co
[
nb
].
gety
()];
v
.
voisinage
[
nb
]
=
&
r
.
getReseau
()[
abs
-
co
ordonnees
[
nb
].
getx
()]
[
ord
-
co
ordonnees
[
nb
].
gety
()];
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment