- •1. Постановка задачи
- •Математический аппарат:
- •2. Математическое моделирование
- •2.1. Математические модели геометрических объектов
- •2.7. Определение вхождения точки в многоугольник (Ray Casting)
- •2.8. Сортировка точек на прямой (Скалярное произведение)
- •2.9. Расчет угла поворота (Арктангенс)
- •2.10. Вычисление центроида группы
- •3. Структура и Архитектура приложения
- •3.1. Слой Математического Ядра
- •3.2. Взаимодействие приложения с математикой (Interaction Pipeline)
- •3.3. Абстракция Системы Координат
- •4. Организация данных
- •5. Руководство пользователя
- •Список использованных источников
- •Заключение
- •Приложение а Реализация математического ядра
- •Реализация матричных преобразований
- •Парсинг и сохранение данных
- •Логика отрисовки и взаимодействия
3.1. Слой Математического Ядра
Вся теоретическая база, описанная в разделе 2, инкапсулирована в двух ключевых TypeScript-модулях, которые не имеют зависимостей от графического интерфейса.
А. Модуль Линейной Алгебры (src/core/math/Matrix.ts)
Этот модуль реализует механизм аффинных преобразований.
Реализация: Класс Matrix представляет
собой матрицу
(хранится
как одномерный массив из 9 чисел).
Связь с теорией:
Метод multiply(other: Matrix) реализует перемножение матриц по правилу «строка на столбец» для композиции трансформаций.
Методы static translation(dx, dy) и static rotation(angle) генерируют матрицы преобразований согласно формулам из п. 2.4.
Метод transformPoint(p: Point) реализует умножение матрицы на вектор-столбец точки , возвращая новые координаты.
Б. Модуль Вычислительной Геометрии (src/core/math/Geometry.ts)
Здесь реализованы алгоритмы анализа и модификации геометрических форм.
Связь с теорией:
Функция getLineCoefficients(line): Преобразует объект отрезка в коэффициенты
общего уравнения прямой.Функция evaluatePoint(...): Реализует подстановку координат точки в уравнение прямой для определения полуплоскости (знак результата).
Функция getIntersection(...): Программно реализует Метод Крамера для решения системы двух линейных уравнений. Вычисляет детерминант матрицы и возвращает точку пересечения.
Функция isPointInPolygon(...): Реализует алгоритм Ray Casting (Трассировка луча) для проверки вхождения точки в многоугольник (используется при тесте мостов).
Функция cutPolygon(poly, line): Агрегирует вышеописанные методы для реализации графового алгоритма отсечения (Chains & Bridges). Принимает на вход исходный полигон и возвращает массивы вершин для новых фигур.
3.2. Взаимодействие приложения с математикой (Interaction Pipeline)
Взаимодействие между пользователем и математическим ядром происходит через событийную модель. Рассмотрим цепочки вызовов для основных операций:
Сценарий 1: Вращение фигуры (Rotate)
View (PixiCanvas.vue): Событие onStageMove перехватывает координаты курсора (экранные пиксели).
Utils: Вызывается CoordinateSystem.toWorld(), переводящая пиксели в декартову систему координат.
Math Call: Вычисляется текущий угол через Math.atan2(dy, dx).
Model Update: Вызывается метод polygon.rotateAround(angle, center).
Matrix Execution: Внутри модели создается цепочка матриц
,
которая применяется ко всем вершинам
массива vertices.
Координаты обновляются.
Сценарий 2: Динамическое отсечение (Clipping)
Операция отсечения выполняется реактивно (в реальном времени) при каждом кадре отрисовки:
Controller (App.vue): Изменение положения секущей линии или полигонов вызывает реактивное обновление sceneData.
View Loop (drawScene): Компонент отрисовки начинает цикл обновления канваса.
Math Request: Для каждого полигона вызывается Geometry.checkPolygonPosition().
Conditional Logic:
Если полигон не пересекается – он отрисовывается как есть.
Если пересекается – вызывается основной алгоритм Geometry.cutPolygon().
Calculation: Алгоритм решает СЛАУ для всех ребер, строит граф пересечений и возвращает набор новых контуров (Point[][]).
Rendering: PixiJS отрисовывает полученные контуры разными цветами, не изменяя исходный объект в памяти.
