C'est parfaitement réalisable. Je ne l'ai qu'en C++, je passerai ca en php plus tard peut-être.
Le principe est simple: à partir de p, numéro absolu du point, on cherche combien de points sont dans les carrés des spirales précédentes (n). Ensuite, on sait combien de point il y a dans le carré (n+1), carré dans lequel se trouve le point p. De là, on a 4 cas (4 cotés), qui permettent de placer le point p dans le carré (n+1).
Bon, sans schéma, c'est trash... mais ca marche ^^
Voilà, en PHP:
La fonction "calc(p)" renvoie un tableau 3x1, avec:
u[0] => coordonnée x du point p
u[1] => coordonnée y du point p
u[2] => 0 si on est dans le triangle de droite (noir), 1 dans le triangle bas (rouge), 2 pour le triangle gauche (vert), et 3 pour le triangle du haut (bleu). Cette dernière valeur n'est pas franchement utile, mais elle permet de savoir quelle est la "direction" du prochain point:
si u[2] = 0, le prochain point est à y-1
si u[2] = 1, le prochain point est à x-1
si u[2] = 2, le prochain point est à y+1
si u[2] = 3, le prochain point est à x+1
p=0 désigne le point central de la spirale (0,0)
p=1 désigne le premier point.
Calcul non récursif (le "for", c'est pour calculer les coords de chaque point de la spirale pour afficher toute la spirale, elle ne fait pas aprtie de la fonction "calc()").
Libre à toi d'ajouter ensuite un "delta", de la forme x € ]-0.5 ; 0.5[ et y € ] -0.5 ; 0.5 [ pour que la forme de la spirale ait un peu d'aléatoire.
Le principe est simple: à partir de p, numéro absolu du point, on cherche combien de points sont dans les carrés des spirales précédentes (n). Ensuite, on sait combien de point il y a dans le carré (n+1), carré dans lequel se trouve le point p. De là, on a 4 cas (4 cotés), qui permettent de placer le point p dans le carré (n+1).
Bon, sans schéma, c'est trash... mais ca marche ^^
Voilà, en PHP:
Code :
<?php
function calc($p)
{
if ($p != 0)
{
$n = floor((sqrt($p)-1.0)/2.0); // n° du dernier carré remplis (je suis dans le n+1)
$m = $n+1; // n° du carré actuel dans lequel je suis
$l = $p - (2*$n+1)*(2*$n+1); // n° du point dans ce carré
$lp = $l%(2*$m); // numéro du point sur le coté courant du carré courant
if ($l < 2*$m)
$u = Array($m, $n-$lp, 0);
else if ($l < 4*$m)
$u = Array($n-$lp, -$m, 1);
else if ($l < 6*$m)
$u = Array(-$m, -$n + $lp, 2);
else
$u = Array(-$n + $lp, $m, 3);
}
else
$u = Array(0, 0, 0); // Cas aprticulier
return $u;
}
$NMAX = 8;$MMAX = 2*$NMAX+1;
$matrice = Array();
for ($i=0;$i<$MMAX*$MMAX;$i++)
{
$v = calc($i);
$matrice[$v[0]][$v[1]] = Array($i, $v[2]);
}
$c = Array("#000000", "#D00000", "#00D000", "#0000D0");
echo('<table border=1>');
for ($y=$NMAX;$y>=-$NMAX;$y--)
{
echo('<tr>');
for ($x=-$NMAX;$x<=$NMAX;$x++)
{
echo('<td style="color:'.$c[$matrice[$x][$y][1]].';">' . $matrice[$x][$y][0] . '</td>');
}
echo('</tr>');
}
echo('</table>');
?>
La fonction "calc(p)" renvoie un tableau 3x1, avec:
u[0] => coordonnée x du point p
u[1] => coordonnée y du point p
u[2] => 0 si on est dans le triangle de droite (noir), 1 dans le triangle bas (rouge), 2 pour le triangle gauche (vert), et 3 pour le triangle du haut (bleu). Cette dernière valeur n'est pas franchement utile, mais elle permet de savoir quelle est la "direction" du prochain point:
si u[2] = 0, le prochain point est à y-1
si u[2] = 1, le prochain point est à x-1
si u[2] = 2, le prochain point est à y+1
si u[2] = 3, le prochain point est à x+1
p=0 désigne le point central de la spirale (0,0)
p=1 désigne le premier point.
Calcul non récursif (le "for", c'est pour calculer les coords de chaque point de la spirale pour afficher toute la spirale, elle ne fait pas aprtie de la fonction "calc()").
Libre à toi d'ajouter ensuite un "delta", de la forme x € ]-0.5 ; 0.5[ et y € ] -0.5 ; 0.5 [ pour que la forme de la spirale ait un peu d'aléatoire.