Фрактал — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Nickendsm (обсуждение | вклад) (→Код программы) |
Nickendsm (обсуждение | вклад) (→Код программы) |
||
Строка 12: | Строка 12: | ||
var h = cnv.height; | var h = cnv.height; | ||
var w = cnv.width; | var w = cnv.width; | ||
− | var scale = | + | var scale = 1000; |
− | var a_11;var a_12;var a_21; var a_22; | + | var a_11; var a_12; var a_21; var a_22; |
var numb1; var numb2; var decim; | var numb1; var numb2; var decim; | ||
− | |||
var interv; | var interv; | ||
a_11 = 1; | a_11 = 1; | ||
Строка 21: | Строка 20: | ||
a_21 = 1; | a_21 = 1; | ||
a_22 = 1; | a_22 = 1; | ||
− | var | + | const N = 200000; |
− | var | + | var angle = 0; |
+ | var way; | ||
var clear; | var clear; | ||
var butt = document.getElementById("addButton"); | var butt = document.getElementById("addButton"); | ||
Строка 35: | Строка 35: | ||
a11.onchange = function () { | a11.onchange = function () { | ||
a_11 = parseFloat(document.getElementById('a11').value); | a_11 = parseFloat(document.getElementById('a11').value); | ||
− | |||
− | |||
} | } | ||
a12.onchange = function() { | a12.onchange = function() { | ||
a_12 = parseFloat(document.getElementById('a12').value); | a_12 = parseFloat(document.getElementById('a12').value); | ||
− | |||
− | |||
} | } | ||
a21.onchange = function () { | a21.onchange = function () { | ||
a_21 = parseFloat(document.getElementById('a21').value); | a_21 = parseFloat(document.getElementById('a21').value); | ||
− | |||
− | |||
} | } | ||
a22.onchange = function () { | a22.onchange = function () { | ||
a_22 = parseFloat(document.getElementById('a22').value); | a_22 = parseFloat(document.getElementById('a22').value); | ||
− | |||
− | |||
} | } | ||
− | + | angle_rad.onchange = function() { | |
− | + | angle = parseFloat(document.getElementById('angle_rad').value); | |
− | |||
− | |||
} | } | ||
cnv.onmousedown = function () { | cnv.onmousedown = function () { | ||
var rect = cnv.getBoundingClientRect(); | var rect = cnv.getBoundingClientRect(); | ||
− | x = (event.clientX - rect.left); | + | x = (event.clientX - rect.left)/scale; |
− | y = (event.clientY - rect.top); | + | y = (event.clientY - rect.top)/scale; |
− | clear = document.getElementsByName(' | + | clear = document.getElementsByName('clear_rect'); |
− | if (clear[ | + | if (clear[1].checked == true) { |
+ | ctx.strokeStyle = "rgb("+ | ||
+ | Math.floor(Math.random()*256)+","+ | ||
+ | Math.floor(Math.random()*256)+","+ | ||
+ | Math.floor(Math.random()*256)+")"; | ||
+ | } else { | ||
ctx.clearRect(0,0,w,h); | ctx.clearRect(0,0,w,h); | ||
ctx.beginPath(); | ctx.beginPath(); | ||
− | ctx.arc(x,y,3,0,2*Math.PI); | + | ctx.arc(x*scale,y*scale,3,0,2*Math.PI); |
ctx.fillStyle = 'blue'; | ctx.fillStyle = 'blue'; | ||
ctx.fill(); | ctx.fill(); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | ||
− | + | if (angle != 0) { | |
− | + | a_11 = Math.cos(angle); | |
− | |||
− | if ( | ||
− | |||
− | |||
− | a_11 = Math.cos( | ||
a_22 = a_11; | a_22 = a_11; | ||
− | a_12 = Math.sin( | + | a_12 = Math.sin(angle); |
a_21 = -a_12; | 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; | |
− | |||
− | |||
− | |||
} | } | ||
+ | control(); | ||
+ | |||
} | } | ||
− | + | ||
function Func (numb) { | function Func (numb) { | ||
− | + | decim = parseFloat(numb) - Math.floor(numb); | |
− | + | return(decim); | |
− | |||
− | |||
− | decim = parseFloat(numb) - | ||
− | return (decim); | ||
− | |||
} | } | ||
+ | |||
function coord() { | function coord() { | ||
− | + | way = document.getElementsByName('ways'); | |
− | + | if (way[0].checked == true) { | |
− | |||
− | if ( | ||
numb1 = a_11*x+a_12*y; | numb1 = a_11*x+a_12*y; | ||
numb2 = a_21*x+a_22*y; | numb2 = a_21*x+a_22*y; | ||
Строка 118: | Строка 96: | ||
y = Func(numb2); | y = Func(numb2); | ||
} | } | ||
− | if ( | + | if (way[1].checked == true) { |
numb1 = a_11*x+a_12*y; | numb1 = a_11*x+a_12*y; | ||
x = Func(numb1); | x = Func(numb1); | ||
Строка 124: | Строка 102: | ||
y = Func(numb2); | y = Func(numb2); | ||
} | } | ||
− | |||
− | |||
} | } | ||
function draw() { | function draw() { | ||
ctx.beginPath(); | ctx.beginPath(); | ||
− | ctx.rect(x,y,1,1); | + | ctx.rect(x*scale,y*scale,1,1); |
ctx.stroke(); | ctx.stroke(); | ||
} | } | ||
function control () { | function control () { | ||
+ | for (j = 0;j<=N; j++){ | ||
coord(); | coord(); | ||
draw(); | draw(); | ||
+ | } | ||
} | } | ||
− | + | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 152: | Строка 130: | ||
</head> | </head> | ||
<body> | <body> | ||
− | <p align = ' | + | <p align = 'left'><canvas id = 'cnv' width = 1000 height = 1000 style='border: 1px solid black;'></canvas></p> |
− | + | <b>(*) Задайте коэффициенты (в графе угла должен стоять "0"):</b> | |
− | + | <label><input type='text' id='a11' value='1' ><b>A_11</b></label> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | <b> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
<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> | ||
− | <label><input type='text' id='a21' value='1' ><b>A_21</b></label> | + | <br><b>(*) Включить очистку холста после клика? </b> |
+ | <label><input type = 'radio' name = 'clear_rect' value = 'yes'><b>Да</b></label> | ||
+ | <label><input type = 'radio' name = 'clear_rect' value = 'no' checked><b>Нет</b></label> | ||
+ |     <label><input type='text' id='a21' value='1' ><b>A_21</b></label> | ||
<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> <input type="button" id="addButton" value="Сменить цвет рисовки"> | ||
+ | <b>Способ вычисления новых точек:</b> | ||
+ | <input type = 'radio' name='ways' value = 'old' checked> <b>1-ый</b> | ||
+ | <input type = 'radio' name='ways' value = 'new'><b> 2-ой</b></br> | ||
+ | <br> | ||
+ | <b>Рисование с помощью поворота точки на заданный угол | ||
+ | <label><input type='text' id='angle_rad' value ='0'><b> Угол поворота (в <I> радианах</I>)</b></label> | ||
</body> | </body> |
Версия 23:54, 17 июля 2020
Программа позволяет строить фрактальные и простые структуры при заданных начальных условиях: координат "x" и "y" исходной точки, от которой будут высчитываться координаты остальных, и коэффициентах, участвующих в расчетах. Или же расчет новых точек можно задать с помощью задания угла поворота исходной
Код программы
Код программы на языке JavaScript:
1 window.addEventListener('load',main,false);
2 function main () {
3 var x; var y;
4 var ctx = cnv.getContext('2d');
5 var h = cnv.height;
6 var w = cnv.width;
7 var scale = 1000;
8 var a_11; var a_12; var a_21; var a_22;
9 var numb1; var numb2; var decim;
10 var interv;
11 a_11 = 1;
12 a_12 = 1;
13 a_21 = 1;
14 a_22 = 1;
15 const N = 200000;
16 var angle = 0;
17 var way;
18 var clear;
19 var butt = document.getElementById("addButton");
20
21 butt.onclick = function () {
22 ctx.strokeStyle = "rgb("+
23 Math.floor(Math.random()*256)+","+
24 Math.floor(Math.random()*256)+","+
25 Math.floor(Math.random()*256)+")";
26 }
27
28 a11.onchange = function () {
29 a_11 = parseFloat(document.getElementById('a11').value);
30 }
31 a12.onchange = function() {
32 a_12 = parseFloat(document.getElementById('a12').value);
33 }
34 a21.onchange = function () {
35 a_21 = parseFloat(document.getElementById('a21').value);
36 }
37 a22.onchange = function () {
38 a_22 = parseFloat(document.getElementById('a22').value);
39 }
40
41 angle_rad.onchange = function() {
42 angle = parseFloat(document.getElementById('angle_rad').value);
43 }
44
45 cnv.onmousedown = function () {
46 var rect = cnv.getBoundingClientRect();
47 x = (event.clientX - rect.left)/scale;
48 y = (event.clientY - rect.top)/scale;
49 clear = document.getElementsByName('clear_rect');
50 if (clear[1].checked == true) {
51 ctx.strokeStyle = "rgb("+
52 Math.floor(Math.random()*256)+","+
53 Math.floor(Math.random()*256)+","+
54 Math.floor(Math.random()*256)+")";
55 } else {
56 ctx.clearRect(0,0,w,h);
57 ctx.beginPath();
58 ctx.arc(x*scale,y*scale,3,0,2*Math.PI);
59 ctx.fillStyle = 'blue';
60 ctx.fill();
61 }
62
63 if (angle != 0) {
64 a_11 = Math.cos(angle);
65 a_22 = a_11;
66 a_12 = Math.sin(angle);
67 a_21 = -a_12;
68 document.getElementById('a11').value = a_11;
69 document.getElementById('a12').value = a_12;
70 document.getElementById('a21').value = a_21;
71 document.getElementById('a22').value = a_22;
72 }
73
74 control();
75
76 }
77
78 function Func (numb) {
79 decim = parseFloat(numb) - Math.floor(numb);
80 return(decim);
81 }
82
83 function coord() {
84 way = document.getElementsByName('ways');
85 if (way[0].checked == true) {
86 numb1 = a_11*x+a_12*y;
87 numb2 = a_21*x+a_22*y;
88 x = Func(numb1);
89 y = Func(numb2);
90 }
91 if (way[1].checked == true) {
92 numb1 = a_11*x+a_12*y;
93 x = Func(numb1);
94 numb2 = a_21*x+a_22*y;
95 y = Func(numb2);
96 }
97 }
98 function draw() {
99 ctx.beginPath();
100 ctx.rect(x*scale,y*scale,1,1);
101 ctx.stroke();
102 }
103
104 function control () {
105 for (j = 0;j<=N; j++){
106 coord();
107 draw();
108 }
109 }
110
111 }
html - файл:
1 <html>
2 <head>
3 <meta charset="UTF-8">
4 <title> Fractals </title>
5 <script src = '1_zad.js'>
6 </script>
7 </head>
8 <body>
9 <p align = 'left'><canvas id = 'cnv' width = 1000 height = 1000 style='border: 1px solid black;'></canvas></p>
10 <b>(*) Задайте коэффициенты (в графе угла должен стоять "0"):</b>
11 <label><input type='text' id='a11' value='1' ><b>A_11</b></label>
12 <label><input type='text' id='a12' value='1' ><b>A_12</b></label>
13 <br><b>(*) Включить очистку холста после клика? </b>
14 <label><input type = 'radio' name = 'clear_rect' value = 'yes'><b>Да</b></label>
15 <label><input type = 'radio' name = 'clear_rect' value = 'no' checked><b>Нет</b></label>
16     <label><input type='text' id='a21' value='1' ><b>A_21</b></label>
17 <label><input type='text' id='a22' value='1' ><b>A_22</b></label>
18 </br>
19 <br><b> <input type="button" id="addButton" value="Сменить цвет рисовки">
20 <b>Способ вычисления новых точек:</b>
21 <input type = 'radio' name='ways' value = 'old' checked> <b>1-ый</b>
22 <input type = 'radio' name='ways' value = 'new'><b> 2-ой</b></br>
23 <br>
24 <b>Рисование с помощью поворота точки на заданный угол
25 <label><input type='text' id='angle_rad' value ='0'><b> Угол поворота (в <I> радианах</I>)</b></label>
26
27 </body>
28 </html>