CelAut v1 — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Денис (обсуждение | вклад) (Новая страница: «Кафедра ТМ > Программирование > [[Программирование и моделирование в Интернет|Интер...») |
Денис (обсуждение | вклад) |
||
(не показано 10 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
− | [[ | + | [[Виртуальная лаборатория]] > [[Игра "Жизнь"]] > [[Клеточный автомат - версии]] > [[CelAut v1]] <HR> |
− | < | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/CelAut/CelAut_v1_release/CelAut_v1_release.html |width=630 |height=650 |border=0 }} |
+ | |||
+ | Скачать программу: [[Медиа:CelAut_v1_release.zip|CelAut_v1_release.zip]] | ||
+ | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
+ | '''Текст программы на языке JavaScript (разработчик [[Цветков Денис]]):''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"CelAut_v1_release.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | function MainCelAut(canvas) { | ||
+ | |||
+ | // Предварительные установки | ||
+ | |||
+ | var context = canvas.getContext("2d"); // на context происходит рисование | ||
+ | document.oncontextmenu=function(e){return false}; // блокировка контекстного меню | ||
+ | |||
+ | // *** Задание вычислительных параметров *** | ||
+ | |||
+ | var fps = 5; // frames per second - число кадров в секунду | ||
+ | |||
+ | // Выполнение программы | ||
+ | |||
+ | var w = canvas.width; // ширина окна | ||
+ | var h = canvas.height; // высота окна | ||
+ | var n = 50; // количество клеток по горизонтали (желательно, делитель ширины окна) | ||
+ | var m = 50; // количество клеток по горизонтали (желательно, делитель высоты окна) | ||
+ | var cellW = w/n; // ширина клетки | ||
+ | var cellH = h/m; // высота клетки | ||
+ | |||
+ | var pause = false; | ||
+ | |||
+ | // "Жизнь" Конвея: [B = 000100000, L = 001100000] | ||
+ | var B = "000100000"; // геном рождения | ||
+ | var 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"; | ||
+ | pause1.value = "Start"; | ||
+ | } | ||
+ | else { | ||
+ | intervalID = setInterval(control, 1000/fps); | ||
+ | document.getElementById('pause1').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); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Файл '''"CelAut_v1_release.html"''' | ||
+ | <syntaxhighlight lang="html5" line start="1" enclose="div"> | ||
+ | <!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="pause1" type="button" name="" style="width: 60px" onclick="app.changePauseState();return false;" value="Stop"/> | ||
+ | </body> | ||
+ | </html> | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | [[Category: Виртуальная лаборатория]] | ||
+ | [[Category: Программирование]] |
Текущая версия на 08:41, 11 марта 2015
Виртуальная лаборатория > Игра "Жизнь" > Клеточный автомат - версии > CelAut v1
Скачать программу: CelAut_v1_release.zip
Текст программы на языке JavaScript (разработчик Цветков Денис):
Файл "CelAut_v1_release.js"
1 function MainCelAut(canvas) {
2
3 // Предварительные установки
4
5 var context = canvas.getContext("2d"); // на context происходит рисование
6 document.oncontextmenu=function(e){return false}; // блокировка контекстного меню
7
8 // *** Задание вычислительных параметров ***
9
10 var fps = 5; // frames per second - число кадров в секунду
11
12 // Выполнение программы
13
14 var w = canvas.width; // ширина окна
15 var h = canvas.height; // высота окна
16 var n = 50; // количество клеток по горизонтали (желательно, делитель ширины окна)
17 var m = 50; // количество клеток по горизонтали (желательно, делитель высоты окна)
18 var cellW = w/n; // ширина клетки
19 var cellH = h/m; // высота клетки
20
21 var pause = false;
22
23 // "Жизнь" Конвея: [B = 000100000, L = 001100000]
24 var B = "000100000"; // геном рождения
25 var L = "001100000"; // геном выживания
26
27 // Работа с массивом
28
29 var cells; // массив клеток
30 var cellsBuf = []; // буфер для расчета следующего шага
31 for (var i = 0; i < n; i++) cellsBuf[i] = [];
32 function generateRandomField(n, m) { // каждая клетка заполняется случайным значением жива/мертва
33 cells = [];
34 for (var i = 0; i < n; i++) {
35 cells[i] = [];
36 for (var j = 0; j < m; j++) {
37 cells[i][j] = (Math.random() >= 0.5);
38 }
39 }
40 }
41
42 // Основной цикл программы
43
44 function control() {
45 step();
46 draw();
47 }
48
49 MainCelAut.prototype.changePauseState = function() { // кнопка паузы
50 pause = !pause;
51 if (pause) {
52 clearInterval(intervalID);
53 // document.getElementById('pause').value = "Start";
54 pause1.value = "Start";
55 }
56 else {
57 intervalID = setInterval(control, 1000/fps);
58 document.getElementById('pause1').value = "Stop";
59 }
60 };
61
62 // Расчетная часть программы
63
64 // функции, обеспечивающие периодичность системы
65 function next(i, n) {if (i == (n-1)) return 0; else return i+1;}
66 function prev(i, n) {if (i == 0) return n-1; else return i-1;}
67
68 function step(){ // то, что происходит каждый шаг времени
69 // копирование массива cells в cellsBuf
70 for (var i0 = 0; i0 < n; i0++)
71 for (var j0 = 0; j0 < m; j0++)
72 cellsBuf[i0][j0] = cells[i0][j0];
73
74 for (var i = 0; i < n; i++) {
75 for (var j = 0; j < m; j++) {
76
77 // подсчет количества живых клеток вокруг рассматриваемой клетки
78 var near = 0;
79 if (cellsBuf[prev(i, n)] [prev(j, m)]) near++;
80 if (cellsBuf[prev(i, n)] [j]) near++;
81 if (cellsBuf[prev(i, n)] [next(j, m)]) near++;
82 if (cellsBuf[i] [prev(j, m)]) near++;
83 if (cellsBuf[i] [next(j, m)]) near++;
84 if (cellsBuf[next(i, n)] [prev(j, m)]) near++;
85 if (cellsBuf[next(i, n)] [j]) near++;
86 if (cellsBuf[next(i, n)] [next(j, m)]) near++;
87
88 if (cellsBuf[i][j]) // рассматриваемая клетка жива
89 cells[i][j] = (L[near] == '1'); // проверка условия выживания по биному L
90 else // рассматриваемая клетка мертва
91 cells[i][j] = (B[near] == '1'); // проверка условия рождения по биному B
92
93 }
94 }
95 }
96
97 // Рисование
98
99 function draw(){
100 context.clearRect(0, 0, w, h); // очистить экран
101 for (var i = 0; i < n; i++){
102 for (var j = 0; j < m; j++){
103 if (cells[i][j]){
104 context.beginPath();
105 context.rect(i*cellW, j*cellH, cellW, cellH);
106 context.closePath();
107 context.fill();
108 }
109 }
110 }
111 }
112
113 // Запуск системы
114 generateRandomField(n, m); // сгенероровать поле
115 var intervalID = setInterval(control, 1000/fps);
116
117 }
Файл "CelAut_v1_release.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>Cellular automaton</title>
5 <script src="CelAut_v1_release.js"></script>
6 </head>
7 <body>
8 <canvas id="canvasCelAut" width="600" height="600" style="border:1px solid #000000;"></canvas><br>
9 <script type="text/javascript">var app = new MainCelAut(document.getElementById('canvasCelAut'));</script>
10 <input id="pause1" type="button" name="" style="width: 60px" onclick="app.changePauseState();return false;" value="Stop"/>
11 </body>
12 </html>