JavaScript-mechanics — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Строка 1: Строка 1:
 +
[[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > '''Механика''' <HR>
 +
 
Если у вас отображается старая версия программы - нажмите "'''Ctrl + F5'''"
 
Если у вас отображается старая версия программы - нажмите "'''Ctrl + F5'''"
  

Версия 18:09, 1 марта 2014

Кафедра ТМ > Программирование > Интернет > JavaScript > Механика

Если у вас отображается старая версия программы - нажмите "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;                     // 9.8 px, а не метров
    const dt = t0* 0.08;              // шаг интегрирования

    var count = true;                 // проводить ли расчет системы

    // создаем объект, связанный с элементом canvas на html странице
    var ocanvas = oCanvas.create({
        canvas: "#canvasMech",        // canvasMech - id объекта canvas на html странице
        fps: 60                       // сколько кадров в секунду
    });

    // создаем шар
    var arc = ocanvas.display.arc({
        x: 4*r,
        y: r0/2,
        radius: r,
        end: 360,                     // круг 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)*2/dt;
            vy = (my-m0y)*2/dt;
        }
    });
    ocanvas.bind("mousedown", function () {count = false;});    // заморозить фигуру при клике на поле

    var wx = 0;            var wy = g;              // ускорение
    var vx = 0;             var vy = 0;             // скорость
    function physics(){                             // то, что происходит каждый шаг времени
        if (!count) return;

        vx += wx*dt;       vy += wy*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>

См. также