xa = 0.00 ; ya = 0.00 ; za = 0.0 do i=1, ubound(array, 1) xb = sin(coefs(1)*ya) - za*cos(coefs(2)*xa) yb = za*sin(coefs(3)*xa) - cos(coefs(4)*ya) zb = sin(xa) array(i)%x = xb array(i)%y = yb array(i)%z = zb xa = xb ; ya = yb ; za = zb enddo |
Clifford Alan Pickover (born August 15, 1957) is an American author, editor, and columnist in the fields of science, mathematics, science fiction, innovation, and creativity. For many years, he was employed at the IBM Thomas J. Watson Research Center in Yorktown, New York where he was Editor-in-Chief of the IBM Journal of Research and Development. ( From Wikipedia ) |
Comme vous pouvez le voir dans le code plus haut, les calculs sont pilotés par un tableau de quatre valeurs, nommé coefs dont l'indice est dans [1..4], parce que c'est du Fortran. Les valeurs canoniques sont juste à coté. Maintenant, que se passe-t-il quand on fait varier ces paramètres ? Voici une question qui ne peut que se traiter avec quelques lignes de code. L'idée première est de prendre deux jeux de paramètres et de faire une interpolation temporelle entre eux deux. Le premier résultat est à la fois décevant et intrigant. Décevant à cause de nombreux temps morts, et intrigant par ce qui se passe dans les "trous" entre ces temps morts. |
coefs(1) = 2.24 coefs(2) = 0.43 coefs(3) = -0.65 coefs(4) = -2.43 |
! and now, we loop over all the pre-computed ! points of the attractor ! do foo=1, nbr_points call fcoor2icoor(points(foo)%x, ix) call fcoor2icoor(points(foo)%y, iy) call fcoor2icoor(points(foo)%z, iz) cube(ix,iy,iz) = cube(ix,iy,iz) + 1 enddo |
Au lieu d'enregistrer et d'afficher les coordonnées des points de l'attracteur dans l'espace 3D continu, nous discrétisons cet espace en un cube NxNxN dont chaque case contient un nombre, un compteur, qui représente sa population, le nombre de points "tombés" dans cette case. La valeur de ce compteur servira alors à controler le rendu povray, dans notre cas, la mise à l'échelle du voxe cubique. |