Документация Engee
Notebook

Вывод графиков в полярной системе координат

В этом примере мы покажем, как вывести график в полярной системе координат для динамической модели Engee.

Полярный график в интерактивном скрипте

Графики в полярной системе координат позволяют увидеть взаимосвязи, которые не видны на графиках в прямоугольной (декартовой) системе координат: получить представление о выраженности некоторого процесса в определенных направлениях в пространстве, или отследить повторяющуюся динамику в рамках какого-то циклического процесса...

Если работа ведется в интерактивном скрипте Engee, то перевод графика в полярную систему координат осуществляется при помощи аргумента proj. Его значение :polar позволяет нам построить график в полярных координатах:

In [ ]:
Θ = range( 0, stop = 1.5π, length = 100 )
r = abs.( 0.1 * randn(100) + sin.(3Θ) )
plot( Θ, r, proj = :polar, m = 2 )
Out[0]:

В то время как параметр ortho строит график в прямоугольной системе координат

In [ ]:
plot( Θ, r, proj = :ortho, m = 2 )
Out[0]:

Попробуем построить график в полярной системе координат, пользуясь только холстом и инструментом вывода графиков для динамических моделей ().

Полярный график для динамической модели

Чтобы построить полярный график для динамической модели, не прибегая к инструментам интерактивных скриптов, нам нужно будет преобразовать векторы из прямоугольной системы координат в полярную систему.

Рассмотрим следующую модель (draw_polar_engee_logo.engee):

image.png

Если запустить ее при помощи кнопки , она построит следующий график:

engee_logo_plot.png

Проанализируем эту модель при помощи средств программного управления моделированием.

In [ ]:
modelName = "draw_polar_engee_logo";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");

Мы можем изучить, какие кусочно-линейные зависимости заданы в каждом блоке LUT, не запуская симуляцию, а просто обратившись к свойствам каждого блока.

In [ ]:
# Анализируем первую таблицу подстановок
x1 = engee.get_param( modelName*"/LUT1", "BreakpointsForDimension1" );
y1 = engee.get_param( modelName*"/LUT1", "Table" );

# Анализируем вторую таблицу подстановок
x2 = engee.get_param( modelName*"/LUT2", "BreakpointsForDimension1" );
y2 = engee.get_param( modelName*"/LUT2", "Table" );

# Построим график
plot(
    plot( x1, y1, legend=false ),
    plot( x2, y2, legend=false )
)
Out[0]:

В результате работы, модель строит график в прямоугольной системе координат, но выводит их после преобразования, которое интерпретирует входные сигналы как данные в полярной системе координат.

Выводимый график является суммой двух графиков в полярной системе координат. Первый задает положение центральной линии каждой из двух кривых, составляющий логотип (кривая LUT2, его радиус 1.0). Второй компонент (кривая LUT1, выводимая с радиусом 0.25) моделирует отклонение от центральной линии.

Преобразование координат сделано двумя разными способами. Оба варианта взаимозаменяемы. В первом случае мы преобразуем координаты при помощи простых блоков из базовой палитры:

image.png

Во втором случае мы используем блок Engee Function со следующим кодом, осуществляющим те же операции:

struct Block <: AbstractCausalComponent
    # Нет параметров
end

function (c::Block)(t::Real, α, r)
    x = r * sin( α )
    y = r * cos( α )
    return (x,y)
end

Выведем график, который строит наша модель:

In [ ]:
gr()
s = engee.run( modelName, verbose=false );
plot( s["y"].value, s["x"].value, aspect_ratio=:equal )
Out[0]:

Заключение

В Engee постепенно появляются всё более сложные инструменты построения графиков, с которыми можно работать не прибегая к программированию.

В этой демонстрации мы показали, как построить график в полярных координатах, не прибегая к программированию (или, альтернативно, как сделать это используя блок Engee Function).

В отличие от графиков в интерактивном скрипте, графики динамических моделей могут обновляться прямо по ходу симуляции, что создает интересные возможности для интерактивной симуляции моделей.

Блоки, использованные в примере