Редактирование: Фрактал(2-ая версия программы)
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | <b>Первая версия программы:</b> http://tm.spbstu.ru/Фрактал | + | Программа позволяет строить фрактальные и простые структуры при заданных начальных условиях. |
− | + | <br><b>Первая версия программы:</b> http://tm.spbstu.ru/Фрактал | |
− | + | ==Принцип работы== | |
− | ==Принцип работы | + | В отличие от первой программы, данная программа требует только задания коэффициентов a11,a12,a21,a22. Дальше происходит следующее: |
− | + | <br>1. Единичный квадрат разбивается сеткой 100x100 пикселей. | |
− | <br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/ | + | <br>{{#widget:Iframe |url = http://tm.spbstu.ru/htmlets/js2020/Borisenkov/fotos/setka.jpg | width =348 | height = 348| border = 0}} |
− | <br> | + | <br>2. Программа прогоняет каждую точку этого квадрата, считая координаты точки равными координатам узла соответствующего квадрата сетки, по следующему алгоритму: |
− | + | <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/ | + | <br>а) Единичный квадрат разбивается сеткой 30x30 пикселей, i-ой точке квадрата с сеткой 100x100 сопоставляется точка на квадрате с сеткой 30x30 пикселей. |
− | <br> | + | <br>б) Программа производит 450 итераций расчета координат новых точек, ставя им в соответствие "квадраты" сетки 30x30 пикселей. |
− | + | <br>в) Подсчитывается площадь, занятая "закрашенными" квадратами 30x30 пикселей. "Закрашенным" квадрат считается, если вычисленная точка попадает в этот квадрат. | |
− | + | <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 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; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
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 () { | ||
− | |||
− | |||
− | |||
− | |||
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; | ||
} | } | ||
− | + | ||
− | + | 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); | ||
} | } | ||
− | |||
− | |||
− | |||
} | } | ||
Строка 213: | Строка 195: | ||
function coord() { | function coord() { | ||
− | numb1 = a_11*x+a_12*y; | + | way = document.getElementsByName('ways'); |
− | + | if (way[0].checked == true) { | |
− | + | numb1 = a_11*x+a_12*y; | |
− | + | 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); | ||
− | |||
− | |||
− | |||
} | } | ||
Строка 266: | Строка 254: | ||
SECCANV[ind] = 1; | SECCANV[ind] = 1; | ||
square += 1; | square += 1; | ||
− | for (k = 0; k<parseInt( | + | 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( | + | 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) { | + | 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) { 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 == | ||
− | |||
if (N_exp) { | if (N_exp) { | ||
− | + | ||
− | + | a11.value = a_11; angle_rad.value = angle; | |
− | |||
− | |||
− | |||
− | |||
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 = ' | + | <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>(*) Задайте коэффициенты (в графе угла должен стоять "0"):</b> | |
− | <br><b>(*) Задайте коэффициенты: </b> | + | <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> | ||
    <label><b>Режим <I>ZOOM'а</I><input type = 'checkbox' id = 'zoom_check'></b></label> |     <label><b>Режим <I>ZOOM'а</I><input type = 'checkbox' id = 'zoom_check'></b></label> | ||
− | |||
<br><b> Выберите номер эксперимента:</b> | <br><b> Выберите номер эксперимента:</b> | ||
− | <input type='number' size='1' id = 'num' min='1' max=' | + | <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> |