Клеточная вселенная.

А.К. Дьюдни, "Клеточная вселенная и ее развитие во времени и пространстве"
В Мире науки, Октябрь 1989

"Клеточные автоматы - это стилизованные, синтетические вселенные... У них свой вид материи, кажущейся в своем пространстве и времени."
Г.Тоффоли и Н.Марголас
"Машины на клеточных автоматах"



Ну а лучший пример такой миниатюрной вселенной дает нам новый тип клеточного автомата, открытый Дейвидом Гриффитом из Висконсинского университета в Мэдисоне. Стартуя из произвольно выбранного исходного состояния, автомат демонстрирует четыре различные фазы, завершающиеся причудливыми кристаллическими образованиями, сильно напоминающими примитивные формы жизни.

Клеточный автомат состоит из бесконечной решетки клеток, каждая из которых находится в одном из нескольких возможных состояний. Каждая клетка меняет свое состояние синхронно с очередным тактом воображаемого часового механизма и в соответствии с набором несложных правил. Реализованные на компьютере клетки представляют собой пикселы (точечные элементы изображения) на экране; различным состояниям клеток соответствуют различные по окраске пикселы. При правильно выбранном наборе правил и исходных состояний компьютерный клеточный автомат может порождать чрезвычайно интересные цветные фигуры, изменяющиеся во времени.

Изобретение Гриффита основано на чрезвычайно простом правиле. Оно заключается в том, чтобы пронумеровать возможные состояния от 0 до n - 1 и считать, что если клетка находится на данном такте в состоянии k, то на следующем такте она должна "съесть" любые соседние клетки, находящиеся в состоянии k - 1. Съедение проявляется в том, что съеденная соседняя клетка переходит из состояния k - 1 в состояние k; клетка в состоянии 0 может поедать соседние клетки в состоянии n - 1.

Клеточная вселенная Клеточная вселенная. Анимация

На рисунке представлена эволюция поля 80x80 клеточного автомата для n = 17. Каждый фрагмент разделяют 12 итераций.


#include <graphics.h>
#include <bios.h>
#include <stdlib.h>
#include <stdio.h>
#include &<alloc.h>

#define N_X     (640UL)
#define N_Y     (350UL)
#define NT      (N_X*N_Y)
char far *old, far *nw;

main() {
        int i,j,k,l, c, dr = EGA, md = EGAHI, x, y ;

        if((old = farcalloc(1,NT)) == NULL) {
                printf(":(.\n");
                exit(1);
        }
        if((nw = farcalloc(1,NT)) == NULL) {
                printf(":((.\n");
                exit(1);
        }
        randomize();
                for(j = 0; j < N_Y; j++) for(i=0;i= N_X) x = 0;
                        y = j + l;
                        if (y < 0) y = N_Y - 1;
                        if (y >= N_Y) y = 0;
                        if (old[N_X * x + y] == (old[N_X*i+j] + 1)&15 )
                                        nw[N_X*i+j] = old[N_X * x + y];
                }
          }
                for(j = 0; j < N_Y; j++) for(i = 0; i < N_X; i++) {
                        c = old[N_X*i+j] = nw[N_X*i+j];
                        putpixel(i,j, c);
                }
        } while (bioskey(1) == 0);
        bioskey(0);
        return 0;
}

Изменена 19.03.2011 06:45 MSK Яндекс цитирования Рейтинг@Mail.ru