Фрактал — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Nickendsm (обсуждение | вклад) (→Код программы) |
Nickendsm (обсуждение | вклад) (→Код программы) |
||
Строка 139: | Строка 139: | ||
} | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | <div class="mw-collapsible mw-collapsed"> | ||
+ | '''html - файл:''' <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="html" line start="1" enclose="div"> | ||
+ | <html> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title> Fractals </title> | ||
+ | <script src = '1_zad.js'> | ||
+ | </script> | ||
+ | </head> | ||
+ | <body> | ||
+ | <p align = 'center'><canvas id = 'cnv' width = 1000 height = 1000 style='border: 1px solid black;'></canvas></p> | ||
+ | <label><input type='text' id='degree' value ='0'><b>Угол поворота</b></label> | ||
+ | <br><b> Включить очистку холста после клика? </b> | ||
+ | <label><input type = 'radio' name = 'clear' value = 'yes'><b>Да</b></label> | ||
+ | <label><input type = 'radio' name = 'clear' value = 'no' checked><b>Нет</b></label> | ||
+ | <b> <input type="button" id="addButton" value="Сменить цвет рисовки"> | ||
+ | </br> | ||
+ | <br> | ||
+ | <b>Способ вычисления новых точек: (оба способа вычисляют по заданному углу в <I> радианах</I>)</b> | ||
+ | <input type = 'radio' name='sposob' value = 'star' checked> <b>1-ый</b> | ||
+ | <input type = 'radio' name='sposob' value = 'nov'><b> 2-ой</b> | ||
+ | </br> | ||
+ | <b>Или задайте коэффициенты самостоятельно (в графе угла должен стоять "0"):</b> | ||
+ | <br><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='a21' value='1' ><b>A_21</b></label> | ||
+ | <label><input type='text' id='a22' value='1' ><b>A_22</b></label> | ||
+ | </br> | ||
+ | |||
+ | </body> | ||
+ | </html> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> |
Версия 10:52, 15 июля 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 = 1/w;
8 var a_11;var a_12;var a_21; var a_22;
9 var numb1; var numb2; var decim;
10 var on = false;
11 var interv;
12 a_11 = 1;
13 a_12 = 1;
14 a_21 = 1;
15 a_22 = 1;
16 var degrees = 0;
17 var sposob;
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 clearInterval(interv);
31 on = false;
32 }
33 a12.onchange = function() {
34 a_12 = parseFloat(document.getElementById('a12').value);
35 clearInterval(interv);
36 on = false;
37 }
38 a21.onchange = function () {
39 a_21 = parseFloat(document.getElementById('a21').value);
40 clearInterval(interv);
41 on = false;
42 }
43 a22.onchange = function () {
44 a_22 = parseFloat(document.getElementById('a22').value);
45 clearInterval(interv);
46 on = false;
47 }
48
49 degree.onchange = function() {
50 degrees = parseFloat(document.getElementById('degree').value);
51 clearInterval(interv);
52 on = false;
53 }
54
55 cnv.onmousedown = function () {
56 var rect = cnv.getBoundingClientRect();
57 x = (event.clientX - rect.left);
58 y = (event.clientY - rect.top);
59 clear = document.getElementsByName('clear');
60 if (clear[0].checked == true) {
61 ctx.clearRect(0,0,w,h);
62 ctx.beginPath();
63 ctx.arc(x,y,3,0,2*Math.PI);
64 ctx.fillStyle = 'blue';
65 ctx.fill();
66 } else {
67 ctx.strokeStyle = "rgb("+
68 Math.floor(Math.random()*256)+","+
69 Math.floor(Math.random()*256)+","+
70 Math.floor(Math.random()*256)+")";
71 }
72 if (on == false) {
73 interv = setInterval(control,0.000001);
74 on = true;
75 }
76 if (degrees != 0) {
77 sposob = document.getElementsByName('sposob');
78 if (sposob[0].checked == true) {
79 a_11 = Math.cos(degrees);
80 a_22 = a_11;
81 a_12 = Math.sin(degrees);
82 a_21 = -a_12;
83 }
84 if (sposob[1].checked == true) {
85 a_11 = Math.cos(degrees*2*Math.PI/360);
86 a_12 = Math.sin(degrees*2*Math.PI/360);
87 a_21 = -(a_12/a_11);
88 a_22 = a_11 - a_21*a_12;
89 }
90 }
91
92 }
93
94 function Func (numb) {
95 if (numb>=0) {
96 decim = parseFloat(numb) - parseInt(numb);
97 return (decim);
98 } else {
99 decim = parseFloat(numb) - (parseInt(numb) - 1);
100 return (decim);
101 }
102 }
103 function coord() {
104 x = (x)*scale;
105 y = (y)*scale;
106 sposob = document.getElementsByName('sposob');
107 if (sposob[0].checked == true) {
108 numb1 = a_11*x+a_12*y;
109 numb2 = a_21*x+a_22*y;
110 x = Func(numb1);
111 y = Func(numb2);
112 }
113 if (sposob[1].checked == true) {
114 numb1 = a_11*x+a_12*y;
115 x = Func(numb1);
116 numb2 = a_21*x+a_22*y;
117 y = Func(numb2);
118 }
119 y = y/scale;
120 x = x/scale;
121 }
122 function draw() {
123 ctx.beginPath();
124 ctx.rect(x,y,1,1);
125 ctx.stroke();
126 }
127
128 function control () {
129 coord();
130 draw();
131 }
132
133 }
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 = 'center'><canvas id = 'cnv' width = 1000 height = 1000 style='border: 1px solid black;'></canvas></p>
10 <label><input type='text' id='degree' value ='0'><b>Угол поворота</b></label>
11 <br><b> Включить очистку холста после клика? </b>
12 <label><input type = 'radio' name = 'clear' value = 'yes'><b>Да</b></label>
13 <label><input type = 'radio' name = 'clear' value = 'no' checked><b>Нет</b></label>
14 <b> <input type="button" id="addButton" value="Сменить цвет рисовки">
15 </br>
16 <br>
17 <b>Способ вычисления новых точек: (оба способа вычисляют по заданному углу в <I> радианах</I>)</b>
18 <input type = 'radio' name='sposob' value = 'star' checked> <b>1-ый</b>
19 <input type = 'radio' name='sposob' value = 'nov'><b> 2-ой</b>
20 </br>
21 <b>Или задайте коэффициенты самостоятельно (в графе угла должен стоять "0"):</b>
22 <br><label><input type='text' id='a11' value='1' ><b>A_11</b></label>
23 <label><input type='text' id='a12' value='1' ><b>A_12</b></label>
24 <label><input type='text' id='a21' value='1' ><b>A_21</b></label>
25 <label><input type='text' id='a22' value='1' ><b>A_22</b></label>
26 </br>
27
28 </body>
29 </html>