Основа анимации в Scilab. Имитация движения объекта
Рассмотрим простой случай создания имитации движения в Scilab, чтобы продемонстрировать основную идею реализации.
Итак, будем работать с точкой, которая движется по оси \(x\). В каждый момент времени \(t_i\) у этой точки задаётся положение \((x_i,y_i)\). Так как по оси \(y\) положение у объекта постоянное, оно опущено в иллюстрации ниже:
Создание анимации движения этого кружочка из точки \((x_i,y_i)\) в точку \((x_{i+1},y_{i+1})\) будет происходить следующим образом:
Рисуем точку в момент времени \(t_i\) с координатами \((x_{i},y_{i})\)
Стираем точку с координатами \((x_{i},y_{i})\)
Инкремируем момент времени \(t_{i+1}\)
Рисуем точку в момент времени \(t_{i+1}\) с координатами \((x_{i+1},y_{i+1})\)
Программная реализация
Сформируем массивы данных: временной промежуток и соответствующее положение точки на оси \(x\).
// входные данные
t = 0:1e-2:1; // временной отрезок
x = sin(2*%pi*t); // положение точки на оси х
время и координата.
Добавим начальную точку на графике
// Рисуем точку в первый момент времени
plot(x(1), 0);
Точка в первый момент времени.
Далее заведём переменные для координатной сетки, сцены, на которой происходит анимаци и самого анимированного элемента:
point_axes = gca(); //сетка координат
point_scene = gce(); //объекты на сетке
point = point_scene.children; //наша точка
Зарезервируем переменные для создания анимации
Несколько стилизуем наши элементы: добавим подпись оси и заголовок сетки координат, а также увеличим размер точки и её покрасим её в синий цвет:
point_axes.data_bounds = [-1.5, -1.5; 1.5, 1.5]; //границы координатных осей
point_axes.grid = [1,1]; //вспомогательная разметка
point_axes.x_label.text = "x"; //подпись горизонтальной оси
point_axes.x_label.font_size = 4; //размер шрифта подписи по оси х
point_axes.title.text = "Движущаяся точка" //Заголовок
point_axes.title.font_size = 4; //размер шрифта заголовка графика
point.mark_style = 0; //тип соединительных элементов - кружок
point.mark_size = 20; //размер соединительных элементов
point.mark_foreground = color(0,0,255); //цвет кружка в формате rgb - синий
Стилизуем изображаемые данные на графике в Scilab
А далее - организуем цикл по всем значениям массива, отвечающего за положение токи на плоскости и итерационно будем рисовать и стирать точку в каждый из моментов времени:
// цикл для анимации
for i = 1:length(x)
drawlater();
point.data = [x(i), 0];
drawnow();
end
Цикл для создания анимации
В итоге, программа, реализующая передвижение точки с анимацией движения будет выглядеть следующим образом:
clc; clf();
// входные данные
t = 0:1e-2:1; // временной отрезок
x = sin(2*%pi*t); // положение точки на оси х
// Рисуем точку в первый момент времени
plot(x(1), 0);
point_axes = gca(); //сетка координат
point_scene = gce(); //объекты на сетке
point = point_scene.children; //наша точка
point_axes.data_bounds = [-1.5, -1.5; 1.5, 1.5]; //границы координатных осей
point_axes.grid = [1,1]; //вспомогательная разметка
point_axes.x_label.text = "x"; //подпись горизонтальной оси
point_axes.x_label.font_size = 4; //размер шрифта подписи по оси х
point_axes.title.text = "Движущаяся точка" //Заголовок
point_axes.title.font_size = 4; //размер шрифта заголовка графика
point.mark_style = 0; //тип соединительных элементов - кружок
point.mark_size = 20; //размер соединительных элементов
point.mark_foreground = color(0,0,255); //цвет кружка в формате rgb - синий
// цикл для анимации
for i = 1:length(x)
drawlater();
point.data = [x(i), 0];
drawnow();
end
Создание анимации в Scilab
Комментарии