Анимация: груз вертикально колеблется на пружине - Pascal ABC
Формулировка задачи:
Есть задача по физике. В условии груз вертикально колеблется на пружине. Как в Pascal ABC сделать такую анимацию??
Решение задачи: «Анимация: груз вертикально колеблется на пружине»
textual
Листинг программы
uses GraphABC,Events; const a = 2; k = 0.01; // Жёсткость пружины turns = 20; // Количество витков пружины friction = 0.99; // Часть энергии рассеивается в виде тепла var stop: boolean; procedure KeyDown(Key: integer); begin stop := true; end; var xc,y,i: integer; // Положение маятника v: real; // Скорость маятника begin OnKeyDown := KeyDown; xc:=windowwidth div 2; LockDrawing; repeat Clearwindow; v := v * friction + a - (k * y); y := round(y + v); Ellipse(xc - 10, y - 10, xc + 10, y + 10); MoveTo(xc - 10, 0); for i := 1 to turns do LineTo(xc + 10 * -(i and 1), round(y / turns * i)); redraw; sleep(100); until stop; end.
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки GraphABC и Events.
- Далее объявляются константы: a = 2, k = 0.01, turns = 20, friction = 0.99.
- Переменная stop инициализируется значением true.
- В процедуре KeyDown(Key: integer) переменной stop присваивается значение true.
- Далее объявляются переменные xc, y и i, которые будут использоваться для отслеживания положения маятника. Значение переменной v будет использоваться для вычисления скорости маятника.
- В блоке OnKeyDown := KeyDown(Key) указывается, что при нажатии клавиши будет вызываться процедура KeyDown(Key).
- Затем вычисляется среднее положение маятника xc := windowwidth div 2.
- Выполняется блокировка рисования LockDrawing.
- Запускается цикл repeat, который будет выполняться до тех пор, пока переменная stop не станет равной false.
- Внутри цикла каждый кадр анимации маятника выполняется следующим образом:
- Очищается окно Clearwindow.
- Вычисляется новая скорость маятника v := v friction + a - (k y).
- Вычисляется новое положение маятника y := round(y + v).
- Рисуется эллипс Ellipse(xc - 10, y - 10, xc + 10, y + 10).
- Массив линий LineTo(xc + 10 -(i and 1), round(y / turns i)) используется для рисования следа маятника на протяжении i-го полного оборота.
- Выполняется команда redraw для обновления окна.
- Выполняется пауза sleep(100) для задержки между кадрами.
- Цикл повторяется до тех пор, пока переменная stop не станет равной false.
- Конец программы.