CelAut v1 — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
[[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > [[JavaScript - Клеточный автомат|Клеточный автомат]] > '''CelAut v1''' <HR>
 
[[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > [[JavaScript - Клеточный автомат|Клеточный автомат]] > '''CelAut v1''' <HR>
  
<htmlet nocache="yes">mechanics_TM</htmlet>
+
<addscript src=CelAut_v1_release/>
 +
<htmlet nocache="yes">CelAut_v1_TM</htmlet>
  
  
 
Текст программы на языке JavaScript (разработчик [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
 
Текст программы на языке JavaScript (разработчик [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
Файл '''"mechanics.js"'''
+
Файл '''"CelAut_v1_release.js"'''
 
<source lang="javascript" first-line="1">
 
<source lang="javascript" first-line="1">
 +
function MainCelAut(canvas) {
  
 +
    // Предварительные установки
 +
 +
    var context = canvas.getContext("2d");                  // на context происходит рисование
 +
    document.oncontextmenu=function(e){return false};      // блокировка контекстного меню
 +
 +
    // *** Задание вычислительных параметров ***
 +
 +
    const fps = 5;                // frames per second - число кадров в секунду
 +
 +
    // Выполнение программы
 +
 +
    const w = canvas.width;     // ширина окна
 +
    const h = canvas.height; // высота окна
 +
    const n = 50;                  // количество клеток по горизонтали (желательно, делитель ширины окна)
 +
    const m = 50;                  // количество клеток по горизонтали (желательно, делитель высоты окна)
 +
    const cellW = w/n;              // ширина клетки
 +
    const cellH = h/m;              // высота клетки
 +
 +
    var pause = false;
 +
 +
    // "Жизнь" Конвея: [B = 000100000, L = 001100000]
 +
    const B = "000100000";            // геном рождения
 +
    const L = "001100000";            // геном выживания
 +
 +
    // Работа с массивом
 +
 +
    var cells;                      // массив клеток
 +
    var cellsBuf = [];              // буфер для расчета следующего шага
 +
    for (var i = 0; i < n; i++) cellsBuf[i] = [];
 +
    function generateRandomField(n, m) {        // каждая клетка заполняется случайным значением жива/мертва
 +
        cells = [];
 +
        for (var i = 0; i < n; i++) {
 +
            cells[i] = [];
 +
            for (var j = 0; j < m; j++) {
 +
                cells[i][j] = (Math.random() >= 0.5);
 +
            }
 +
        }
 +
    }
 +
 +
    // Основной цикл программы
 +
 +
    function control() {
 +
        step();
 +
        draw();
 +
    }
 +
 +
    MainCelAut.prototype.changePauseState = function() {          // кнопка паузы
 +
        pause = !pause;
 +
        if (pause) {
 +
            clearInterval(intervalID);
 +
            document.getElementById('pause').value = "Start";
 +
        }
 +
        else {
 +
            intervalID = setInterval(control, 1000/fps);
 +
            document.getElementById('pause').value = "Stop";
 +
        }
 +
    };
 +
 +
    // Расчетная часть программы
 +
 +
    // функции, обеспечивающие периодичность системы
 +
    function next(i, n) {if (i == (n-1)) return 0; else return i+1;}
 +
    function prev(i, n) {if (i == 0) return n-1; else return i-1;}
 +
 +
    function step(){                            // то, что происходит каждый шаг времени
 +
        // копирование массива cells в cellsBuf
 +
        for (var i0 = 0; i0 < n; i0++)
 +
            for (var j0 = 0; j0 < m; j0++)
 +
                cellsBuf[i0][j0] = cells[i0][j0];
 +
 +
        for (var i = 0; i < n; i++) {
 +
            for (var j = 0; j < m; j++) {
 +
 +
                // подсчет количества живых клеток вокруг рассматриваемой клетки
 +
                var near = 0;
 +
                if (cellsBuf[prev(i, n)] [prev(j, m)])  near++;
 +
                if (cellsBuf[prev(i, n)] [j])            near++;
 +
                if (cellsBuf[prev(i, n)] [next(j, m)])  near++;
 +
                if (cellsBuf[i]          [prev(j, m)])  near++;
 +
                if (cellsBuf[i]          [next(j, m)])  near++;
 +
                if (cellsBuf[next(i, n)] [prev(j, m)])  near++;
 +
                if (cellsBuf[next(i, n)] [j])            near++;
 +
                if (cellsBuf[next(i, n)] [next(j, m)])  near++;
 +
 +
                if (cellsBuf[i][j])                    // рассматриваемая клетка жива
 +
                    cells[i][j] = (L[near] == '1');    // проверка условия выживания по биному L
 +
                else                                    // рассматриваемая клетка мертва
 +
                    cells[i][j] = (B[near] == '1');    // проверка условия рождения по биному B
 +
 +
            }
 +
        }
 +
    }
 +
 +
    // Рисование
 +
 +
    function draw(){
 +
        context.clearRect(0, 0, w, h);          // очистить экран
 +
        for (var i = 0; i < n; i++){
 +
            for (var j = 0; j < m; j++){
 +
                if (cells[i][j]){
 +
                    context.beginPath();
 +
                    context.rect(i*cellW, j*cellH, cellW, cellH);
 +
                    context.closePath();
 +
                    context.fill();
 +
                }
 +
            }
 +
        }
 +
    }
 +
 +
    // Запуск системы
 +
    generateRandomField(n, m);                  // сгенероровать поле
 +
    var intervalID = setInterval(control, 1000/fps);
 +
 +
}
 
</source>
 
</source>
Файл '''"random_walk.html"'''
+
Файл '''"CelAut_v1_release.html"'''
 
<source lang="html" first-line="1">
 
<source lang="html" first-line="1">
 
+
<!DOCTYPE html>
 +
<html>
 +
<head>
 +
    <title>Cellular automaton</title>
 +
    <script src="CelAut_v1_release.js"></script>
 +
</head>
 +
<body>
 +
    <canvas id="canvasCelAut" width="600" height="600" style="border:1px solid #000000;"></canvas><br>
 +
    <script type="text/javascript">var app = new MainCelAut(document.getElementById('canvasCelAut'));</script>
 +
    <input id="pause" type="button" name="" style="width: 60px" onclick="app.changePauseState();return false;" value="Stop"/>
 +
</body>
 +
</html>
 
</source>
 
</source>
 
</toggledisplay>
 
</toggledisplay>

Версия 22:11, 12 апреля 2014

Кафедра ТМ > Программирование > Интернет > JavaScript > Клеточный автомат > CelAut v1

<addscript src=CelAut_v1_release/>

Не удается найти HTML-файл CelAut_v1_TM.html


Текст программы на языке JavaScript (разработчик Цветков Денис): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "CelAut_v1_release.js"

function MainCelAut(canvas) {

    // Предварительные установки

    var context = canvas.getContext("2d");                  // на context происходит рисование
    document.oncontextmenu=function(e){return false};       // блокировка контекстного меню

    // *** Задание вычислительных параметров ***

    const fps = 5;             	    // frames per second - число кадров в секунду

    // Выполнение программы

    const w = canvas.width;		    // ширина окна
    const h = canvas.height;		// высота окна
    const n = 50;                   // количество клеток по горизонтали (желательно, делитель ширины окна)
    const m = 50;                   // количество клеток по горизонтали (желательно, делитель высоты окна)
    const cellW = w/n;              // ширина клетки
    const cellH = h/m;              // высота клетки

    var pause = false;

    // "Жизнь" Конвея: [B = 000100000, L = 001100000]
    const B = "000100000";            // геном рождения
    const L = "001100000";            // геном выживания

    // Работа с массивом

    var cells;                      // массив клеток
    var cellsBuf = [];              // буфер для расчета следующего шага
    for (var i = 0; i < n; i++) cellsBuf[i] = [];
    function generateRandomField(n, m) {        // каждая клетка заполняется случайным значением жива/мертва
        cells = [];
        for (var i = 0; i < n; i++) {
            cells[i] = [];
            for (var j = 0; j < m; j++) {
                cells[i][j] = (Math.random() >= 0.5);
            }
        }
    }

    // Основной цикл программы

    function control() {
        step();
        draw();
    }

    MainCelAut.prototype.changePauseState = function() {          // кнопка паузы
        pause = !pause;
        if (pause) {
            clearInterval(intervalID);
            document.getElementById('pause').value = "Start";
        }
        else {
            intervalID = setInterval(control, 1000/fps);
            document.getElementById('pause').value = "Stop";
        }
    };

    // Расчетная часть программы

    // функции, обеспечивающие периодичность системы
    function next(i, n) {if (i == (n-1)) return 0; else return i+1;}
    function prev(i, n) {if (i == 0) return n-1; else return i-1;}

    function step(){                             // то, что происходит каждый шаг времени
        // копирование массива cells в cellsBuf
        for (var i0 = 0; i0 < n; i0++)
            for (var j0 = 0; j0 < m; j0++)
                cellsBuf[i0][j0] = cells[i0][j0];

        for (var i = 0; i < n; i++) {
            for (var j = 0; j < m; j++) {

                // подсчет количества живых клеток вокруг рассматриваемой клетки
                var near = 0;
                if (cellsBuf[prev(i, n)] [prev(j, m)])   near++;
                if (cellsBuf[prev(i, n)] [j])            near++;
                if (cellsBuf[prev(i, n)] [next(j, m)])   near++;
                if (cellsBuf[i]          [prev(j, m)])   near++;
                if (cellsBuf[i]          [next(j, m)])   near++;
                if (cellsBuf[next(i, n)] [prev(j, m)])   near++;
                if (cellsBuf[next(i, n)] [j])            near++;
                if (cellsBuf[next(i, n)] [next(j, m)])   near++;

                if (cellsBuf[i][j])                     // рассматриваемая клетка жива
                    cells[i][j] = (L[near] == '1');     // проверка условия выживания по биному L
                else                                    // рассматриваемая клетка мертва
                    cells[i][j] = (B[near] == '1');     // проверка условия рождения по биному B

            }
        }
    }

    // Рисование

    function draw(){
        context.clearRect(0, 0, w, h);          // очистить экран
        for (var i = 0; i < n; i++){
            for (var j = 0; j < m; j++){
                if (cells[i][j]){
                    context.beginPath();
                    context.rect(i*cellW, j*cellH, cellW, cellH);
                    context.closePath();
                    context.fill();
                }
            }
        }
    }

    // Запуск системы
    generateRandomField(n, m);                  // сгенероровать поле
    var intervalID = setInterval(control, 1000/fps);

}

Файл "CelAut_v1_release.html"

<!DOCTYPE html>
<html>
<head>
    <title>Cellular automaton</title>
    <script src="CelAut_v1_release.js"></script>
</head>
<body>
    <canvas id="canvasCelAut" width="600" height="600" style="border:1px solid #000000;"></canvas><br>
    <script type="text/javascript">var app = new MainCelAut(document.getElementById('canvasCelAut'));</script>
    <input id="pause" type="button" name="" style="width: 60px" onclick="app.changePauseState();return false;" value="Stop"/>
</body>
</html>

</toggledisplay>