Funcan
Math function visualizer and analyzer on ASP.NET Core
Install / Use
/learn @artemsuvorov/FuncanREADME
Funcan
Funcan -- это RESTful API web-приложение, разработанное с помощью фреймворка ASP.NET и предназначенное для визуализации графиков функций и отображения особенностей функции на графике. Данное web-приложение запускается и разворачивается как сервер, с которым можно взаимодействовать не только напрямую посредством HTTP запросов, но и с помощью .html страницы в браузере.
Проблематика
При решении математических задач может возникнуть потребность посмотреть, как выглядит график функции в той или иной области, и/или рассмотреть некоторые особенности на этом графике, например: отобразить точки экстремума функции, чтобы наглядно убедиться в том, что они были найдены студентом верно.
Использование
Funcan -- это практический целый инструмент, который можно использовать в образовательных целях. Он не только умеет визуалировать и анализровать функции, но и вести историю введенных пользователем функций для его удобства.
Использование RESTful API web-приложения происходит посредством отправки HTTP запросов. Актуальный список всех HTTP запросов, которые поддерживает сервер, с их описанием и примерами можно получить по запросу GET /swagger. Здесь мы приведем основные из них:
| Запрос | Описание |
|:--------|:------------|
| GET /Input | Получить клиентскую .html страницу (страница осуществляет все запросы ниже сама) |
| POST /Function | Получить список графиков для переданной функции (параметры описаны ниже) |
POST /Function -- ключевой запрос в логике взаимодействия пользователя с сервером, и он содержит несколько настраиваемых параметров:
| Параметр | Тип | Обязателен | Описание |
|:--------|:--------|:--------|:------------|
| input | query | да | Функция, передаваемая как string, график которой мы хотим построить и/или проанализровать |
| from | query | нет | Начало отрезка значений x, на котором будет строится график функции (по умолчанию from=-10.0) |
| to | query | нет | Конец отрезка значений x, на котором будет строится график функции (по умолчанию from=10.0) |
| analysis | body | да | Список наименований построителей графиков в формате json, которые будут строить графики (список может быть пустым) |
Приведем пример построения графика функции $$y = \dfrac{1}{x}$$ на отрезке $$[-5;5]$$ и отображения точек разрыва на нем (некоторые заголовки запроса опущены для краткости):
POST /Function?input=1/x&from=-5&to=5 HTTP/1.1
Content-Type: application/json
[ "function", "discontinuities" ]
Архитектура
Приложение построено согласно принципам DDD, в связи с чем архитектура проекта разделяется на несколько слоев: Application и Domain. В Application слое содержится пользовательская логика взаимодействия с доменом приложения посредством HTTP запросов. В слое Domain, по сути, содержится вся бизнес-логика проекта: используемые модели, сервисы простроения графиков функций, хранящий историю введенных функций репозиторий.
Ключевыми в домене являются абстракции графика функции (plot) и построителя графиков функций (plotter). Plot -- это плоская модель, которая представляет собой просто список точек (x,y). Plotter'ы занимаются построением тех или иных plot'ов по переданной функции, например: FunctionPlotter -- строит plot, в который входят все точки функции на выбранном отрезке, а ExtremaPlotter -- строит plot, в который входят лишь точки экстремума функции на выбранном отрезке.
Контроллеры из слоя Application позволяют вызывать сразу несколько plotter'ов, чтобы на выходе получить целый список графиков: график самой функции и/или графики ее особенностей.
Точки расширения
Проект поддерживает одну точку расширения, а именно расширение списка поддерживаемых приложением построителей графиков (plotter'ов).
Чтобы добавить новый plotter, который бы, например, строил график периода функции, достаточно всего лишь написать новый класс PeriodicPlotter, реализующий интерфес IPlotter, и зарегистрировать его в DI-контейнере в файле Startup.cs. В результате plotter периода функции автоматически добавится в отображаемый на клиентской странице список поддерживаемых особенностей графика, и им уже можно будет пользоваться, передавая его в POST /Function запрос.
