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"> | + | <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"> | ||
− | Файл '''" | + | Файл '''"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> | ||
− | Файл '''" | + | Файл '''"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>