Редактирование: Участник:StarfloFr

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
{{#widget:Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Natalin/Kursach1.html | width=800 | height=1080 | border=0}}
+
{{#widget:Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Natalin/Kursach1.html | width=1920 | height=1080 | border=0}}
 
 
==Код программы==
 
<div class="mw-collapsible mw-collapsed">
 
'''Код программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
 
 
class Ball {
 
constructor(x, y, r, vx, vy,color){
 
    this.x = x;
 
this.y = y;
 
this.r = r;
 
this.vx = vy;
 
this.vy = vx;
 
 
 
this.calculateMass();
 
 
 
this.color = color;
 
}
 
 
 
calculateMass() {
 
this.m = (this.r * this.r * this.r)/50 ;
 
}
 
 
 
getVx() {
 
return this.vx * Math.pow(2, timeSpeed);
 
}
 
 
 
getVy() {
 
return this.vy * Math.pow(2, timeSpeed);
 
}
 
 
 
move() {
 
this.x += this.getVx();
 
this.y += this.getVy();
 
}
 
 
}
 
 
 
var count = 50;
 
 
 
var MAX_SPEED = 20;
 
var MIN_RADIUS = 100;
 
var MAX_RADIUS = 100;
 
var WIDTH = 10000;
 
 
 
var timeSpeed = 0;
 
 
 
var balls = [];
 
 
 
var canvas;
 
var ctx;
 
var T = 300;
 
var pathx = [];
 
var pathy = [];
 
 
function random(min, max) {
 
return Math.random() * (max - min) + min;
 
}
 
 
 
function move() {
 
 
 
for (var i = 0; i < count; i++) {
 
var ball = balls[i];
 
 
 
if (ball.x < ball.r && ball.vx < 0)
 
ball.vx *=-1;
 
if (ball.x > WIDTH-ball.r && ball.vx > 0)
 
ball.vx *=-1;
 
if (ball.y < ball.r && ball.vy < 0)
 
ball.vy *=-1;
 
if (ball.y > WIDTH-ball.r && ball.vy > 0)
 
ball.vy *=-1;
 
 
for (var j = i + 1; j < count; j++) {
 
var ball2= balls[j];
 
var z = (ball.x - ball2.x) * (ball.getVx() - ball2.getVx()) + (ball.y - ball2.y) * (ball.getVy() - ball2.getVy());
 
var l = Math.pow(ball.getVx() - ball2.getVx(), 2) + Math.pow(ball.getVy() - ball2.getVy(), 2);
 
var m = Math.pow(ball.x - ball2.x, 2) + Math.pow(ball.y - ball2.y, 2) - Math.pow(ball.r + ball2.r, 2);
 
 
var d = z*z - l*m;
 
 
var t0 = -(z + Math.sqrt(d)) / l;
 
 
 
var p = Math.pow(ball.x - ball2.x, 2) + Math.pow(ball.y - ball2.y, 2);
 
 
 
if (t0 >= 0 && t0 <= 1 || p < Math.pow(ball.r + ball2.r, 2)) {
 
ball.x += t0 * ball.getVx();
 
ball.y += t0 * ball.getVy();
 
ball2.x += t0 * ball2.getVx();
 
ball2.y += t0 * ball2.getVy();
 
 
var px = ball.x - ball2.x;
 
var py = ball.y - ball2.y;
 
 
 
var q = 2 * (px * (ball2.vx - ball.vx) + py * (ball2.vy - ball.vy))
 
 
var dvx = q * px / (Math.pow(px, 2) + Math.pow(py,2)) * ball.m * ball2.m / (ball.m + ball2.m);
 
var dvy = q * py / (Math.pow(px, 2) + Math.pow(py,2)) * ball.m * ball2.m / (ball.m + ball2.m);
 
var k = 1.38 * Math.pow(10,-23);
 
 
 
ball.vx += dvx / ball.m;
 
ball.vy += dvy / ball.m;
 
ball2.vx -= dvx / ball2.m;
 
ball2.vy -= dvy / ball2.m;
 
 
}
 
 
}
 
 
ball.move();
 
}
 
 
 
 
 
draw();
 
}
 
 
 
 
 
function draw() {
 
ctx.clearRect(0, 0, canvas.width, canvas.height);
 
 
 
var c = canvas.width / WIDTH;
 
 
 
for (var i = 0; i < count; i++) {
 
var ball= balls[i];
 
ctx.beginPath();
 
ctx.arc(ball.x * c, ball.y * c, ball.r * c, 0, 2 * Math.PI, false);
 
 
if (document.getElementById('color').checked)
 
ctx.fillStyle = ball.color;
 
else
 
ctx.fillStyle = 'blue';
 
 
 
ctx.fill();
 
 
 
 
}
 
drawPath();
 
}
 
 
function start() {
 
balls[0]= new Ball( WIDTH/2  , WIDTH/2, 500, 0, 0,'red');
 
for (var i = 1; i < count; i++) {
 
var r = random(MIN_RADIUS, MAX_RADIUS);
 
balls[i] = new Ball(random(r, WIDTH - r), random(r, WIDTH - r), r, random(-MAX_SPEED, MAX_SPEED), random(-MAX_SPEED, MAX_SPEED),'blue');
 
 
}
 
 
canvas = document.getElementById('GG');
 
ctx = canvas.getContext('2d');
 
 
setInterval(move, 1);
 
}
 
 
 
function weight() {
 
 
var r = parseInt(document.getElementById('weight').value);
 
if (r > WIDTH / 2 || r < 50)
 
return;
 
 
 
var oldMass = balls[0].m;
 
balls[0].r = r;
 
balls[0].calculateMass();
 
 
 
balls[0].vx *= Math.sqrt(oldMass / balls[0].m);
 
balls[0].vy *= Math.sqrt(oldMass / balls[0].m);
 
 
 
if (balls[0].x > WIDTH - r)
 
balls[0].x = WIDTH - r;
 
if (balls[0].x < r)
 
balls[0].x = r;
 
if (balls[0].y > WIDTH - r)
 
balls[0].y = WIDTH - r;
 
if (balls[0].y < r)
 
balls[0].y = r;
 
 
}
 
 
 
function changeSize() {
 
canvas.width = document.getElementById('size').value;
 
canvas.height = document.getElementById('size').value;
 
}
 
 
 
var tander = 0;
 
 
function drawPath() {
 
tander++;
 
if (tander === 5) {
 
tander = 0;
 
if (pathx.length>=1000) {
 
pathx.shift();
 
pathy.shift();
 
}
 
 
var c = canvas.width / WIDTH;
 
pathx.push( balls[0].x*c);
 
pathy.push( balls[0].y*c);
 
}
 
ctx.beginPath();
 
ctx.lineWidth = 2;
 
        ctx.strokeStyle = 'Black';
 
ctx.moveTo(pathx[0], pathy[0]);
 
 
 
for (i=1;i<pathx.length; i++) {
 
        ctx.lineTo(pathx[i], pathy[i]);
 
}
 
 
ctx.stroke();
 
}
 
 
 
 
function add() {
 
var k = parseInt(document.getElementById('addCount').value);
 
k = Math.min(k , 250 - balls.length);
 
for (var i = 0; i < k; i++) {
 
var r = random(MIN_RADIUS, MAX_RADIUS);
 
balls[count + i] = new Ball(random(r, WIDTH - r), random(r, WIDTH - r), r, random(-MAX_SPEED, MAX_SPEED), random(-MAX_SPEED, MAX_SPEED));
 
 
}
 
count += k;
 
}
 
 
function del() {
 
var k = Math.min(count - 1, parseInt(document.getElementById('addCount').value));
 
balls = balls.slice(0, count - k);
 
count -= k;
 
}
 
 
 
function slowly() {
 
if (timeSpeed > -3)
 
timeSpeed--;
 
}
 
 
 
function faster() {
 
if (timeSpeed < 3)
 
timeSpeed++;
 
}
 
</syntaxhighlight>
 
</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:

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