- Разработать приложение, проверяющее попадание точки в полигон. Должна быть возможность задать произвольное количество точек полигона и саму контрольную точку.
- Алгоритм попадания точки в полигон можно и нужно искать в интернете.
- Будет плюсом графическое отображение полигона и контрольной точки.
- Приложение может быть на любой из следующих технологий: ASP.NET MVC, ASP.NET CORE. Выбирайте, что больше нравится.
- Плюсом будет наличие тестов проверяющих основную логику приложения.
- Приложение готово. Имеется возможность задавать вершины полигона и контрольные точки щелчками мыши в графической области. Количество вершин многоугольника и контрольных точек, теоретически не ограничено.
- Алгоритм взят отсюда.
- графическое отображение полигона и контрольных точек есть.
- Приложение построено на ASP.NET CORE.
- Есть тесты для тестирования алгоритма попадания точки в многоугольник.
После запуска приложения в браузере откроется страница с графической областью, обведённой тёмно-серым бордюром. Щёлкая мышью внутри этой области, можно установить нужное количество вершин многоугольника. Чтобы замкнуть многоугольник, необходимо нажать на кнопку "Замкнуть" над графической областью. Кнопка станет неактивной, а графическая область перейдёт в режим ввода контрольных точек. При установке каждой контрольной точки, на сервер отправляются данные, содержащие массив вершин многоугольника. координаты текущей контрольной точки и её назвние (для простоты - её номер). На сервере производится вычисление, результат которого отправляется обратно в браузер. В зависимости от результата, браузер выводит строку с сообщением, лежит ли точка внутри многоугольника, либо вне его.
Вычислениями занимается сервис IPolyService
с методом InPolygon
, реализация которого находится в классе PolyService
. Unit-тесты написаны как раз для этого сервиса.
Было решено реализовать графическую область с помощью svg
, а не с помощью canvas
, т.к. с одной стороны, в ходе работы мне приходилось сталкиваться с svg
, а с другой, он имеет чёткую иерархию элементов (DOM), что значительно упрощает отладку.
Изначально я планировал организовать ввод координат точек посредством элементов input type="text"
, добавляемых на страницу динамически. Но в ходе обдумывания реализации решил, что "прямой ввод" мышью будет значительно более удобным.
Для работы с svg
использовал библиотеку SVG.js.
Дизайн и вёрстка приложения очень примитивны, т.к. никогда не приходилось работать ни дизайнером, ни верстальщиком. Что не мешало внедрять готовую вёрстку в приложения.