Фрактал — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Код программы)
(Код программы)
Строка 12: Строка 12:
 
var h = cnv.height;
 
var h = cnv.height;
 
var w = cnv.width;
 
var w = cnv.width;
var scale = 1/w;
+
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 on = false;
 
 
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 degrees = 0;
+
const N = 200000;
var sposob;
+
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);
clearInterval(interv);
 
on = false;
 
 
}
 
}
 
a12.onchange = function() {
 
a12.onchange = function() {
 
a_12 = parseFloat(document.getElementById('a12').value);
 
a_12 = parseFloat(document.getElementById('a12').value);
clearInterval(interv);
 
on = false;
 
 
}
 
}
 
a21.onchange = function () {
 
a21.onchange = function () {
 
a_21 = parseFloat(document.getElementById('a21').value);
 
a_21 = parseFloat(document.getElementById('a21').value);
clearInterval(interv);
 
on = false;
 
 
}
 
}
 
a22.onchange = function () {
 
a22.onchange = function () {
 
a_22 = parseFloat(document.getElementById('a22').value);
 
a_22 = parseFloat(document.getElementById('a22').value);
clearInterval(interv);
 
on = false;
 
 
}
 
}
 
 
degree.onchange = function() {
+
angle_rad.onchange = function() {
degrees = parseFloat(document.getElementById('degree').value);
+
angle = parseFloat(document.getElementById('angle_rad').value);
clearInterval(interv);
 
on = false;
 
 
}
 
}
 
 
 
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');
+
clear = document.getElementsByName('clear_rect');
if (clear[0].checked == true) {
+
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();
} else {
 
ctx.strokeStyle = "rgb("+
 
            Math.floor(Math.random()*256)+","+
 
            Math.floor(Math.random()*256)+","+
 
            Math.floor(Math.random()*256)+")";
 
 
}
 
}
if (on == false) {
+
interv = setInterval(control,0.000001);
+
if (angle != 0) {
on = true;
+
a_11 = Math.cos(angle);
}
 
if (degrees != 0) {
 
sposob = document.getElementsByName('sposob');
 
if (sposob[0].checked == true) {
 
a_11 = Math.cos(degrees);
 
 
a_22 = a_11;
 
a_22 = a_11;
a_12 = Math.sin(degrees);
+
a_12 = Math.sin(angle);
 
a_21 = -a_12;
 
a_21 = -a_12;
}
+
document.getElementById('a11').value = a_11;
if (sposob[1].checked == true) {
+
document.getElementById('a12').value = a_12;
a_11 = Math.cos(degrees*2*Math.PI/360);
+
document.getElementById('a21').value = a_21;
a_12 = Math.sin(degrees*2*Math.PI/360);
+
document.getElementById('a22').value = a_22;
a_21 = -(a_12/a_11);
 
a_22 = a_11 - a_21*a_12;
 
}
 
 
}
 
}
 
 
 +
control();
 +
 
}
 
}
+
 
 
function Func (numb) {
 
function Func (numb) {
if (numb>=0) {
+
decim = parseFloat(numb) - Math.floor(numb);
decim = parseFloat(numb) - parseInt(numb);
+
return(decim);
    return (decim);
 
} else {
 
decim = parseFloat(numb) - (parseInt(numb) - 1);
 
return (decim);
 
}
 
 
}
 
}
 +
 
function coord() {
 
function coord() {
x = (x)*scale;
+
way = document.getElementsByName('ways');
y = (y)*scale;
+
if (way[0].checked == true) {  
sposob = document.getElementsByName('sposob');
 
if (sposob[0].checked == true) {  
 
 
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 (sposob[1].checked == true) {
+
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);
 
}
 
}
y = y/scale;
 
x = x/scale;
 
 
}
 
}
 
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 = 'center'><canvas id = 'cnv' width = 1000 height = 1000 style='border: 1px solid black;'></canvas></p>
+
<p align = 'left'><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>
+
<b>(*) Задайте коэффициенты (в графе угла должен стоять "0"):</b>
<br><b> Включить очистку холста после клика? </b>
+
<label><input type='text' id='a11' value='1' ><b>A_11</b></label>  
<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='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>
 +
&emsp;&emsp;&hairsp;&hairsp;<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 &emsp;&emsp;&hairsp;&hairsp;<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>