Редактирование: Фрактал(2-ая версия программы)

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
<b>Первая версия программы:</b> http://tm.spbstu.ru/Фрактал
+
Программа позволяет строить фрактальные и простые структуры при заданных начальных условиях.
<br>Данная программа осуществляет один из возможных алгоритмов нахождения нерегулярных областей. Понятие <b><i>регулярной</i></b> и <b><i>нерегулярной</i></b> области введено в разделе <b>"Направление исследований"</b> на странице первой программы.
+
<br><b>Первая версия программы:</b> http://tm.spbstu.ru/Фрактал
 
+
==Принцип работы==
==Принцип работы программы==
+
В отличие от первой программы, данная программа требует только задания коэффициентов a11,a12,a21,a22. Дальше происходит следующее:
Аналогично начальным условиям 1-ой версии программы: дан единичный квадрат <b>А</b>, отображаемый программой с разрешением 100x100 пикселей.
+
<br>1. Единичный квадрат разбивается сеткой 100x100 пикселей.
<br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/2_sposob16_01_21.png | width =301 | height = 301| border = 0}}
+
<br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/setka.jpg | width =348 | height = 348| border = 0}}
<br>Также имеется единичный квадрат <b>Б</b>, не видимый пользователю, с разрешением 30x30 пикселей.  
+
<br>2. Программа прогоняет каждую точку этого квадрата, считая координаты точки равными координатам узла соответствующего квадрата сетки, по следующему алгоритму:
<br>Для каждой из точек, соответствующих "пикселям" квадрата <b>А</b> программа осуществляет следующий алгоритм:  
+
<br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/kv2.png | width =100 | height = 100| border = 0}}
<br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/algoritm-3.png | width =738 | height = 188| border = 0}}
+
<br>а) Единичный квадрат разбивается сеткой 30x30 пикселей, i-ой точке квадрата с сеткой 100x100 сопоставляется точка на квадрате с сеткой 30x30 пикселей.
<br>Таким образом, программа упрощенно проверяет каждую точку квадрата на то, к какой области фрактала она относится: регулярной или нерегулярной, и отображает лишь нерегулярные области, наиболее интересные для рассмотрения.
+
<br>б) Программа производит 450 итераций расчета координат новых точек, ставя им в соответствие "квадраты" сетки 30x30 пикселей.
{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/Fractals02_02_21.html | width =1500 | height = 350| border = 0}}
+
<br>в) Подсчитывается площадь, занятая "закрашенными" квадратами 30x30 пикселей. "Закрашенным" квадрат считается, если вычисленная точка попадает в этот квадрат.
Для более детального рассмотрения какой-либо области следует воспользоваться 1-ой программой.
+
<br>г) Если закрашено менее 20 процентов единичного квадрата, делается вывод, что данная точка является частью регулярной области - крупного эллипса, если закрашено более 20 процентов - считается, что это нерегулярная область, которая в большей степени прорисовывает фрактал и является наиболее интересной. Во втором случае точка с данными координатами подсвечивается на экране.
 +
<br>Таким образом программа "отсеивает" регулярные области, оставляя наиболее интересные для рассмотрения.
  
 +
{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/Fractals17_11_20.html | width =1500 | height = 400| border = 0}}
 
==Код программы==
 
==Код программы==
 
<div class="mw-collapsible mw-collapsed">
 
<div class="mw-collapsible mw-collapsed">
Строка 27: Строка 29:
 
var numb1; var numb2; var decim;
 
var numb1; var numb2; var decim;
 
var interv;
 
var interv;
 +
var way;
 
var clear;
 
var clear;
 
var start_draw = document.getElementById('to_start');
 
var start_draw = document.getElementById('to_start');
Строка 37: Строка 40:
 
a_21 = 1;
 
a_21 = 1;
 
a_22 = 1;
 
a_22 = 1;
 +
var angle = 0;
 
var x_min = 0; var y_min = 0;
 
var x_min = 0; var y_min = 0;
 
var x_max = 1; var y_max = 1;
 
var x_max = 1; var y_max = 1;
Строка 44: Строка 48:
 
var y_oldmin = 0;
 
var y_oldmin = 0;
 
var y_oldmax = scale;
 
var y_oldmax = scale;
var x_relativemin = 0;
 
var x_relativemax = scale;
 
var y_relativemin = 0;
 
var y_relativemax = scale;
 
 
var intermid;
 
var intermid;
 
var imageData = ctx.createImageData(w,h);
 
var imageData = ctx.createImageData(w,h);
Строка 56: Строка 56:
 
var RGB = []   
 
var RGB = []   
 
var numbclr; var nz = z;
 
var numbclr; var nz = z;
var Nn = 600;
 
 
x_minim.onchange = function () {
 
x_min = parseFloat(document.getElementById('x_minim').value);
 
z = 1/(x_max - x_min);
 
z2 = 1;
 
y_max = y_min + x_max - x_min;
 
x_relativemin = 0;
 
x_relativemax = scale;
 
y_relativemin = 0;
 
y_relativemax = scale;
 
}
 
x_maxim.onchange = function () {
 
x_max = parseFloat(document.getElementById('x_maxim').value);
 
z = 1/(x_max - x_min);
 
z2 = 1;
 
y_max = y_min + x_max - x_min;
 
x_relativemin = 0;
 
x_relativemax = scale;
 
y_relativemin = 0;
 
y_relativemax = scale;
 
}
 
y_minim.onchange = function () {
 
y_min = parseFloat(document.getElementById('y_minim').value);
 
z = 1/(x_max - x_min);
 
z2 = 1;
 
y_max = y_min + x_max - x_min;
 
x_relativemin = 0;
 
x_relativemax = scale;
 
y_relativemin = 0;
 
y_relativemax = scale;
 
}
 
  
 
for (d = 0; d<24; d++) {
 
for (d = 0; d<24; d++) {
Строка 105: Строка 73:
 
ctx.putImageData(imageData,0,0);
 
ctx.putImageData(imageData,0,0);
 
start_draw.onclick = function () {  
 
start_draw.onclick = function () {  
x_relativemin = 0;
 
x_relativemax = 1;
 
y_relativemin = 0;
 
y_relativemax = 1;
 
 
zoom = document.getElementById('zoom_check');
 
zoom = document.getElementById('zoom_check');
 
if (!zoom.checked) {
 
if (!zoom.checked) {
Строка 114: Строка 78:
 
square = 0;
 
square = 0;
 
SQ = [];
 
SQ = [];
 +
if (angle != 0) {
 +
a_11 = Math.cos(angle);
 +
a_22 = a_11;
 +
a_12 = Math.sin(angle);
 +
a_21 = -a_12;
 +
document.getElementById('a11').value = a_11;
 +
document.getElementById('a12').value = a_12;
 +
document.getElementById('a21').value = a_21;
 +
document.getElementById('a22').value = a_22;
 +
}
 
checking(x_min,y_min,x_max,y_max);
 
checking(x_min,y_min,x_max,y_max);
 
} else {
 
} else {
Строка 122: Строка 96:
 
a11.onchange = function() {
 
a11.onchange = function() {
 
a_11 = parseFloat(document.getElementById('a11').value);
 
a_11 = parseFloat(document.getElementById('a11').value);
 +
document.getElementById('angle_rad').value = 0;
 
document.getElementById('num').value = 0;
 
document.getElementById('num').value = 0;
 +
angle = 0;
 
}
 
}
 
a12.onchange = function() {
 
a12.onchange = function() {
 
a_12 = parseFloat(document.getElementById('a12').value);
 
a_12 = parseFloat(document.getElementById('a12').value);
 +
document.getElementById('angle_rad').value = 0;
 
document.getElementById('num').value = 0;
 
document.getElementById('num').value = 0;
 +
angle = 0;
 
}
 
}
 
a21.onchange = function() {
 
a21.onchange = function() {
 
a_21 = parseFloat(document.getElementById('a21').value);
 
a_21 = parseFloat(document.getElementById('a21').value);
 +
document.getElementById('angle_rad').value = 0;
 
document.getElementById('num').value = 0;
 
document.getElementById('num').value = 0;
 +
angle = 0;
 
}
 
}
 
a22.onchange = function() {
 
a22.onchange = function() {
 
a_22 = parseFloat(document.getElementById('a22').value);
 
a_22 = parseFloat(document.getElementById('a22').value);
 +
document.getElementById('angle_rad').value = 0;
 
document.getElementById('num').value = 0;
 
document.getElementById('num').value = 0;
 +
angle = 0;
 
}
 
}
check2.onchange = function() {
+
Nn = parseFloat(document.getElementById('check2').value);
+
angle_rad.onchange = function() {
 +
angle = parseFloat(document.getElementById('angle_rad').value);
 +
document.getElementById('num').value = 0;
 
}
 
}
 +
 
cnv.onmousedown = function() {
 
cnv.onmousedown = function() {
 
var zoom = document.getElementById('zoom_check');
 
var zoom = document.getElementById('zoom_check');
Строка 202: Строка 187:
 
checking(x_min,y_min,x_max,y_max);
 
checking(x_min,y_min,x_max,y_max);
 
}
 
}
    x_minim.innerHTML = x_min.toFixed(parseInt(Math.pow(z,1/2)));
 
y_minim.innerHTML = y_min.toFixed(parseInt(Math.pow(z,1/2)))
 
x_maxim.innerHTML = x_max.toFixed(parseInt(Math.pow(z,1/2)))
 
 
}
 
}
  
Строка 213: Строка 195:
 
 
 
function coord() {
 
function coord() {
numb1 = a_11*x+a_12*y;
+
way = document.getElementsByName('ways');
x = Func(numb1);
+
if (way[0].checked == true) {
numb2 = a_21*x+a_22*y;
+
numb1 = a_11*x+a_12*y;
y = Func(numb2);
+
numb2 = a_21*x+a_22*y;
 +
x = Func(numb1);
 +
y = Func(numb2);
 +
}
 +
if (way[1].checked == true) {
 +
numb1 = a_11*x+a_12*y;
 +
x = Func(numb1);
 +
numb2 = a_21*x+a_22*y;
 +
y = Func(numb2);
 +
}
 
}
 
}
  
Строка 257: Строка 248:
 
}
 
}
 
ctx.putImageData(imageData,0,0);
 
ctx.putImageData(imageData,0,0);
document.getElementById('x_minim').value = x_min;
 
document.getElementById('y_minim').value = y_min;
 
document.getElementById('x_maxim').value = x_max;
 
 
}
 
}
 
 
Строка 266: Строка 254:
 
SECCANV[ind] = 1;
 
SECCANV[ind] = 1;
 
square += 1;
 
square += 1;
for (k = 0; k<parseInt(Nn*nz); k++) {
+
for (k = 0; k<parseInt(600*nz); k++) {
 
coord();
 
coord();
 
idx = Math.floor(x*scale2)*Math.floor(scale2) + Math.floor(y*scale2);
 
idx = Math.floor(x*scale2)*Math.floor(scale2) + Math.floor(y*scale2);
 
if (SECCANV[idx] != 1) { SECCANV[idx] = 1; square+= 1;}
 
if (SECCANV[idx] != 1) { SECCANV[idx] = 1; square+= 1;}
 
}
 
}
if (square >=parseInt(Nn*2/10*nz)) {
+
if (square >=parseInt(180*nz)) {
 
if (SQ == []) {
 
if (SQ == []) {
 
SQ.push(square);
 
SQ.push(square);
Строка 281: Строка 269:
 
return(1);
 
return(1);
 
} else { return(0); }
 
} else { return(0); }
 
 
}
 
}
 
 
Строка 289: Строка 276:
 
clearcanv ();
 
clearcanv ();
 
SQ = [];
 
SQ = [];
if (N_exp == 1) {a_11 = 1; a_12 = 0.5;     a_21 = -0.5; a_22 = 1; }
+
if (N_exp == 1) { document.getElementsByName('ways')[1].checked = true; angle = 0; a_11 = 1; a_12 = 0.5;     a_21 = -0.5; a_22 = 1; }
if (N_exp == 2) {a_11 = 1; a_12 = 1;     a_21 = -0.9; a_22 = 1;  }
+
if (N_exp == 2) { document.getElementsByName('ways')[0].checked = true; angle = 0; a_11 = -0.05;   a_12 = -0.95;   a_21 = 1.1; a_22 = 0.65; }
if (N_exp == 3) {a_11 = 1; a_12 = 0.5;     a_21 = -0.5; a_22 = 1; x_min = 0.6680; y_min = 0.5460; x_max = 0.7240; y_max = 0.6020;  }
 
if (N_exp == 4) {a_11 = 1; a_12 = 0.5;     a_21 = -0.5; a_22 = 1; x_min = 0.50; y_min = 0.31; x_max = 0.71; y_max = 0.51;}
 
if (N_exp == 5) {a_11 = 1; a_12 = 0.5;     a_21 = -0.5; a_22 = 1; x_min = 0.2757; y_min = 0.3343; x_max = 0.3268; y_max = 0.3854;}
 
 
if (N_exp) {
 
if (N_exp) {
z = 1/Math.abs(x_max-x_min);
+
document.getElementById('x_minim').value = x_min;
+
a11.value = a_11;   angle_rad.value = angle;  
document.getElementById('y_minim').value = y_min;
 
document.getElementById('x_maxim').value = x_max;
 
some_span.innerHTML = "Увеличение в "+z.toFixed(2)+" раз";
 
a11.value = a_11;
 
 
a12.value = a_12;     
 
a12.value = a_12;     
 
a21.value = a_21;   
 
a21.value = a_21;   
Строка 319: Строка 299:
 
<meta charset="UTF-8">
 
<meta charset="UTF-8">
 
<title> Fractals </title>
 
<title> Fractals </title>
<script src = 'Fractals25_01_21.js'>
+
<script src = 'Fractals25_12_1.js'>
 
  </script>
 
  </script>
 
</head>
 
</head>
Строка 325: Строка 305:
 
<p align = 'left'><canvas id = 'cnv' width = 100 height = 100 style='border: 1px solid black;'></canvas></p>
 
<p align = 'left'><canvas id = 'cnv' width = 100 height = 100 style='border: 1px solid black;'></canvas></p>
 
<span id=some_span></span>
 
<span id=some_span></span>
<br><b>Рассматриваемая область: x_min = <input type = 'text' id = 'x_minim' style = "width:70px;height:10px" value ='0'> , x_max = <input type = 'text' style = "width:70px;height:10px" id = 'x_maxim' value ='1'>, y_min = <input type = 'text' style = "width:70px;height:10px" id = 'y_minim' value = '0'>
+
<br><b>(*) Задайте коэффициенты (в графе угла должен стоять "0"):</b>
<br><b>(*) Задайте коэффициенты: </b>
+
<label><input type='text' id='a11' value='1' ><b>A_11</b></label>  
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&hairsp;&hairsp;<label><input type='text' id='a11' value='1' ><b>A_11</b></label>
 
 
<label><input type='text' id='a12' value='1' ><b>A_12</b></label>
 
<label><input type='text' id='a12' value='1' ><b>A_12</b></label>
 
<br><b>(*) Включить очистку холста после клика? </b>
 
<br><b>(*) Включить очистку холста после клика? </b>
Строка 335: Строка 314:
 
<label><input type='text' id='a22' value='1' ><b>A_22</b></label>
 
<label><input type='text' id='a22' value='1' ><b>A_22</b></label>
 
</br>
 
</br>
 +
<br><b> Или меняйте коэффициенты с помощью ползунков:</b>
 
&emsp;&emsp;&hairsp;&hairsp;<label><b>Режим <I>ZOOM'а</I><input type = 'checkbox' id = 'zoom_check'></b></label>
 
&emsp;&emsp;&hairsp;&hairsp;<label><b>Режим <I>ZOOM'а</I><input type = 'checkbox' id = 'zoom_check'></b></label>
<label>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&hairsp;&hairsp;<b>Задайте количество итераций для проверки на меньшем холсте:&hairsp;&hairsp;</b><input type='text' id='check2' value='600' ></label>
 
 
<br><b> Выберите номер эксперимента:</b>
 
<br><b> Выберите номер эксперимента:</b>
<input type='number' size='1' id = 'num' min='1' max='5' value='0' step='1'>
+
<input type='number' size='1' id = 'num' min='1' max='2' value='0' step='1'>
 +
<br>
 +
<b>Способ вычисления новых точек:</b>
 +
<input type = 'radio' name='ways' value = 'old'> <b>1-ый</b>
 +
<input type = 'radio' name='ways' value = 'new' checked><b> 2-ой</b>
 
<input type = 'button' style="width:200px;height:40px" id = 'to_start' value = 'Запуск '></b></br>
 
<input type = 'button' style="width:200px;height:40px" id = 'to_start' value = 'Запуск '></b></br>
 +
<br>
 +
<b>Рисование с помощью поворота точки на заданный угол</b>
 +
<label><input type='text' id='angle_rad' value ='0'><b> Угол поворота (в <I> радианах</I>)</b></label>
 
</body>
 
</body>
 
</html>
 
</html>
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)