15-08-2011, 12:30 PM
(Modification du message : 30-09-2011, 02:26 PM par Sephi-Chan.)
Voici une fonction permettant de généré le prochain point d'un carré fictif dans une grille formant une spirale carrée.
La fonction prends en paramètre les coordonnées d'un des points du carré fictif précédent et la taille des carrés fictifs, calcul son origine (point supérieur gauche), et renvoi les coordonnées du point d'origine du carré fictifs suivant avec ou sans un niveau d'aléatoire.
Voir l'illustration ici de la fonction bouclé x300 pour des carrés fictifs de taille 21 avec un niveau d'aléatoire de 10: http://mazdesign.free.fr/spiralecarre/new.php
c x x 3 x x 4 x x 5 x x
x x x x x x x x x x x x
x x x x x x x x x x x x
x x x 2 x x 1 x x 6 x x
b x x x x x x x x x x x
x x x x x x x x x x x x
a x x 9 x x 8 x x 7 x x
x x x x x x x x x x x x
x x x x x x x x x x x x
Si l'on appel la fonction en donnant les coordonnée du point 1 avec un $size = 3, elle renverras celles du point 2, avec les coordonnées du point 2, elle renverras celles du point 3, etc...
L'utilité n'est pas évidente, personnellement je m'en sert pour généré la position de départ des joueurs dans un jeu de gestion de ville et ainsi positionner les joueurs de façon concentré avec un peu d'aléatoire (deux rand(0,3) pour généré les coordonnée x et y à ajouter au point d'origine du carré fictif pour placé aléatoirement le joueur dans le carré fictif).
Edit 15/08/2011 à 21h54: fix d'un bug et ajout du paramètre randomLevel permettant la génération aléatoire du point dans le carré fictif.
Edit 26/09/2011 à 22h35: amélioration du code, merci Xenos.
La fonction prends en paramètre les coordonnées d'un des points du carré fictif précédent et la taille des carrés fictifs, calcul son origine (point supérieur gauche), et renvoi les coordonnées du point d'origine du carré fictifs suivant avec ou sans un niveau d'aléatoire.
Voir l'illustration ici de la fonction bouclé x300 pour des carrés fictifs de taille 21 avec un niveau d'aléatoire de 10: http://mazdesign.free.fr/spiralecarre/new.php
<?php
function nextPlace($x, $y, $size, $randomLevel = null) {
$denominateurX = floor($x/$size);
$denominateurY = floor($y/$size);
$currentCenter = array($denominateurX*$size, $denominateurY*$size);
if($denominateurX == $denominateurY){
$axe = "x";
$sens = ($denominateurX < 0)*2-1; // 1 si x<0, -1 si x>=0
} else if(abs($denominateurX) == abs($denominateurY)) {
$axe = ($denominateurY > 0) ? "x" : "y";
$sens = -($denominateurY > 0)*2+1;
} else if(abs($denominateurX) > abs($denominateurY)) {
$axe = "y";
$sens = ($denominateurX > 0)*2-1;
} else if(abs($denominateurY) > abs($denominateurX)) {
$axe = "x";
$sens = -($denominateurY > 0)*2+1;
}
$x = $denominateurX*$size;
$y = $denominateurY*$size;
$$axe += $size*$sens;
// Pour des valeurs aléatoires:
if (!is_null($randomLevel)) {
if($randomLevel >= $size)
$randomLevel = $size-1;
$x += rand(0, $randomLevel);
$y += rand(0, $randomLevel);
}
return array($x, $y);
}
?>
Petite illustration:c x x 3 x x 4 x x 5 x x
x x x x x x x x x x x x
x x x x x x x x x x x x
x x x 2 x x 1 x x 6 x x
b x x x x x x x x x x x
x x x x x x x x x x x x
a x x 9 x x 8 x x 7 x x
x x x x x x x x x x x x
x x x x x x x x x x x x
Si l'on appel la fonction en donnant les coordonnée du point 1 avec un $size = 3, elle renverras celles du point 2, avec les coordonnées du point 2, elle renverras celles du point 3, etc...
L'utilité n'est pas évidente, personnellement je m'en sert pour généré la position de départ des joueurs dans un jeu de gestion de ville et ainsi positionner les joueurs de façon concentré avec un peu d'aléatoire (deux rand(0,3) pour généré les coordonnée x et y à ajouter au point d'origine du carré fictif pour placé aléatoirement le joueur dans le carré fictif).
Edit 15/08/2011 à 21h54: fix d'un bug et ajout du paramètre randomLevel permettant la génération aléatoire du point dans le carré fictif.
Edit 26/09/2011 à 22h35: amélioration du code, merci Xenos.