Скачиваний:
0
Добавлен:
27.12.2025
Размер:
216.59 Кб
Скачать

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)

  1. View (PixiCanvas.vue): Событие onStageMove перехватывает координаты курсора (экранные пиксели).

  2. Utils: Вызывается CoordinateSystem.toWorld(), переводящая пиксели в декартову систему координат.

  3. Math Call: Вычисляется текущий угол через Math.atan2(dy, dx).

  4. Model Update: Вызывается метод polygon.rotateAround(angle, center).

  5. Matrix Execution: Внутри модели создается цепочка матриц  , которая применяется ко всем вершинам массива vertices. Координаты обновляются.

Сценарий 2: Динамическое отсечение (Clipping)

Операция отсечения выполняется реактивно (в реальном времени) при каждом кадре отрисовки:

  1. Controller (App.vue): Изменение положения секущей линии или полигонов вызывает реактивное обновление sceneData.

  2. View Loop (drawScene): Компонент отрисовки начинает цикл обновления канваса.

  3. Math Request: Для каждого полигона вызывается Geometry.checkPolygonPosition().

  4. Conditional Logic:

    • Если полигон не пересекается – он отрисовывается как есть.

    • Если пересекается – вызывается основной алгоритм Geometry.cutPolygon().

  5. Calculation: Алгоритм решает СЛАУ для всех ребер, строит граф пересечений и возвращает набор новых контуров (Point[][]).

  6. Rendering: PixiJS отрисовывает полученные контуры разными цветами, не изменяя исходный объект в памяти.