JavaScript-mechanics — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Денис (обсуждение | вклад) |
Денис (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | Если у вас отображается старая версия программы - нажмите '''Ctrl + F5''' | + | Если у вас отображается старая версия программы - нажмите "'''Ctrl + F5'''" |
<addscript src=ocanvas-251/> | <addscript src=ocanvas-251/> | ||
<addscript src=Vector2D/> | <addscript src=Vector2D/> | ||
<addscript src=mechanics/> | <addscript src=mechanics/> | ||
<htmlet nocache="yes">mechanics_TM</htmlet> | <htmlet nocache="yes">mechanics_TM</htmlet> | ||
− | |||
Текст программы на языке JavaScript (разработчик [[Цветков Денис]], использована библиотека [http://ocanvas.org/ oCanvas]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> | Текст программы на языке JavaScript (разработчик [[Цветков Денис]], использована библиотека [http://ocanvas.org/ oCanvas]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> | ||
Строка 11: | Строка 10: | ||
function MainMech(canvas) { | function MainMech(canvas) { | ||
var context = canvas.getContext("2d"); | var context = canvas.getContext("2d"); | ||
− | |||
var w = canvas.width; | var w = canvas.width; | ||
var h = canvas.height; | var h = canvas.height; | ||
− | + | const g0 = 1; // масштаб ускорения | |
− | + | const r0 = h; // масштаб длины - высота окна | |
− | + | const t0 = Math.sqrt(2*r0/g0); // масштаб времени - за сколько времени шар пролетит весь экран по вертикали | |
− | + | const v0 = g0*t0; // масштаб скорости - скорость в нижней точке экрана | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | const | ||
− | |||
− | |||
− | const | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | const r = r0 / 40; // радиус шара | |
− | + | const g = g0*20000; // 9.8 px, а не метров | |
− | + | const dt = 1/(t0*2); // шаг интегрирования | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | var count = true; // проводить ли расчет системы | ||
− | + | // создаем объект, связанный с элементом canvas на html странице | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
var ocanvas = oCanvas.create({ | var ocanvas = oCanvas.create({ | ||
− | canvas: "#canvasMech", | + | canvas: "#canvasMech", // canvasMech - id объекта canvas на html странице |
− | fps: | + | fps: t0*2 // сколько кадров в секунду |
}); | }); | ||
+ | // создаем шар | ||
var arc = ocanvas.display.arc({ | var arc = ocanvas.display.arc({ | ||
x: 4*r, | x: 4*r, | ||
− | y: | + | y: r0/2, |
radius: r, | radius: r, | ||
start: 0, | start: 0, | ||
end: 360, | end: 360, | ||
− | fill: "rgba(0, 0, 255, 1)" | + | fill: "rgba(0, 0, 255, 1)" // цвет |
}).add(); | }).add(); | ||
− | var m0x = 0; var m0y = 0; | + | // захват шара мышью |
− | var mx = 0; | + | var m0x = 0; var m0y = 0; // предыдущая позиция мыши |
+ | var mx = 0; var my = 0; // актуальная позиция мыши | ||
arc.dragAndDrop({ | arc.dragAndDrop({ | ||
− | changeZindex: true, | + | changeZindex: true, // если много шариков - захваченный будет нарисован спереди |
start: function () { | start: function () { | ||
− | this.fill = "rgba(0, 0, 255, 0.5)"; | + | count = false; // на время захвата - отключить расчет |
− | + | this.fill = "rgba(0, 0, 255, 0.5)"; // пока держим шарик - он полупрозрачен | |
− | m0x = 0; m0y = 0; | + | m0x = 0; m0y = 0; |
− | mx = 0; | + | mx = 0; my = 0; |
}, | }, | ||
move: function () { | move: function () { | ||
− | m0x = mx; m0y = my; | + | m0x = mx; m0y = my; |
mx = ocanvas.mouse.x; | mx = ocanvas.mouse.x; | ||
my = ocanvas.mouse.y; | my = ocanvas.mouse.y; | ||
}, | }, | ||
end: function () { | end: function () { | ||
− | |||
count = true; | count = true; | ||
− | vx = (mx-m0x)*100; vy = (my-m0y)*100; | + | this.fill = "rgba(0, 0, 255, 1)"; // отпускаем шарик - полупрозрачность убирается |
+ | // толкаем шарик по направлению движения мыши | ||
+ | vx = (mx-m0x)*100; | ||
+ | vy = (my-m0y)*100; | ||
} | } | ||
}); | }); | ||
+ | ocanvas.bind("mousedown", function () {count = false;}); // заморозить фигуру при клике на поле | ||
− | + | var vvx = 0; var vvy = g; // ускорение | |
+ | var vx = 0; var vy = 0; // скорость | ||
+ | function physics(){ // то, что происходит каждый шаг времени | ||
+ | if (!count) return; | ||
− | + | vx += vvx*dt; vy += vvy*dt; | |
− | + | var dx = vx*dt; var dy = vy*dt; | |
− | + | arc.x += dx; arc.y += dy; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | var | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// проверка граничных условий | // проверка граничных условий | ||
− | if ( | + | if (arc.y + r > r0) { // нижняя граница (ось "y" направлена вниз) |
− | + | arc.y = r0-r; | |
− | + | vy = -vy; | |
− | |||
} | } | ||
− | if ( | + | if (arc.y - r < 0) { // верхняя граница |
− | + | arc.y = r; | |
− | + | vy = -vy; | |
− | |||
} | } | ||
− | if ( | + | |
− | + | if (arc.x + r > w) { // правая граница | |
− | + | arc.x = w-r; | |
− | + | vx = -vx; | |
} | } | ||
− | if ( | + | if (arc.x - r + dx < 0) { // левая граница |
− | + | arc.x = r; | |
− | + | vx = -vx; | |
− | |||
} | } | ||
− | |||
− | |||
} | } | ||
+ | ocanvas.setLoop(physics).start(); // функция, выполняющаяся на каждом шаге | ||
} | } | ||
</source> | </source> |
Версия 21:40, 24 февраля 2014
Если у вас отображается старая версия программы - нажмите "Ctrl + F5" <addscript src=ocanvas-251/> <addscript src=Vector2D/> <addscript src=mechanics/>
Не удается найти HTML-файл mechanics_TM.html
Текст программы на языке JavaScript (разработчик Цветков Денис, использована библиотека oCanvas): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "mechanics.js"
function MainMech(canvas) {
var context = canvas.getContext("2d");
var w = canvas.width;
var h = canvas.height;
const g0 = 1; // масштаб ускорения
const r0 = h; // масштаб длины - высота окна
const t0 = Math.sqrt(2*r0/g0); // масштаб времени - за сколько времени шар пролетит весь экран по вертикали
const v0 = g0*t0; // масштаб скорости - скорость в нижней точке экрана
const r = r0 / 40; // радиус шара
const g = g0*20000; // 9.8 px, а не метров
const dt = 1/(t0*2); // шаг интегрирования
var count = true; // проводить ли расчет системы
// создаем объект, связанный с элементом canvas на html странице
var ocanvas = oCanvas.create({
canvas: "#canvasMech", // canvasMech - id объекта canvas на html странице
fps: t0*2 // сколько кадров в секунду
});
// создаем шар
var arc = ocanvas.display.arc({
x: 4*r,
y: r0/2,
radius: r,
start: 0,
end: 360,
fill: "rgba(0, 0, 255, 1)" // цвет
}).add();
// захват шара мышью
var m0x = 0; var m0y = 0; // предыдущая позиция мыши
var mx = 0; var my = 0; // актуальная позиция мыши
arc.dragAndDrop({
changeZindex: true, // если много шариков - захваченный будет нарисован спереди
start: function () {
count = false; // на время захвата - отключить расчет
this.fill = "rgba(0, 0, 255, 0.5)"; // пока держим шарик - он полупрозрачен
m0x = 0; m0y = 0;
mx = 0; my = 0;
},
move: function () {
m0x = mx; m0y = my;
mx = ocanvas.mouse.x;
my = ocanvas.mouse.y;
},
end: function () {
count = true;
this.fill = "rgba(0, 0, 255, 1)"; // отпускаем шарик - полупрозрачность убирается
// толкаем шарик по направлению движения мыши
vx = (mx-m0x)*100;
vy = (my-m0y)*100;
}
});
ocanvas.bind("mousedown", function () {count = false;}); // заморозить фигуру при клике на поле
var vvx = 0; var vvy = g; // ускорение
var vx = 0; var vy = 0; // скорость
function physics(){ // то, что происходит каждый шаг времени
if (!count) return;
vx += vvx*dt; vy += vvy*dt;
var dx = vx*dt; var dy = vy*dt;
arc.x += dx; arc.y += dy;
// проверка граничных условий
if (arc.y + r > r0) { // нижняя граница (ось "y" направлена вниз)
arc.y = r0-r;
vy = -vy;
}
if (arc.y - r < 0) { // верхняя граница
arc.y = r;
vy = -vy;
}
if (arc.x + r > w) { // правая граница
arc.x = w-r;
vx = -vx;
}
if (arc.x - r + dx < 0) { // левая граница
arc.x = r;
vx = -vx;
}
}
ocanvas.setLoop(physics).start(); // функция, выполняющаяся на каждом шаге
}
</toggledisplay>