Point класс

Класс Point в MapLibre GL JS представляет собой базовую математическую структуру для работы с двумерными координатами в экранном пространстве. Он используется на низком уровне для вычислений, связанных с отрисовкой карты, преобразованием координат, обработкой жестов, интерполяцией и геометрическими операциями внутри рендерингового конвейера.

Point применяется везде, где требуется представление позиции в пикселях или абстрактных 2D-векторах. В отличие от географических координат (longitude/latitude), Point оперирует декартовой системой координат, где:

  • x — горизонтальная ось (обычно в пикселях)
  • y — вертикальная ось (обычно в пикселях)

Эта структура критична для слоёв отрисовки, тайловой системы, обработки событий мыши и касаний, а также вычислений смещений камеры.

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

Структура и внутренние поля

Базовая структура класса предельно минималистична:

  • x: number
  • y: number

Эти значения могут представлять:

  • координаты на экране
  • векторы смещения
  • разности между точками
  • результаты трансформаций

Такой унифицированный подход позволяет использовать Point как универсальный векторный тип.

Конструктор и создание экземпляров

Создание объекта Point обычно происходит через передачу двух числовых значений:

const p = new Point(10, 20);

Где:

  • 10 — координата по оси X
  • 20 — координата по оси Y

Внутри библиотеки такие объекты создаются массово, особенно при обработке тайлов, пересчёте позиций слоёв и взаимодействии с матрицами трансформации камеры.

Базовые операции над точками

Point реализует набор векторных операций, позволяющих рассматривать его как математический вектор в 2D-пространстве.

Сложение

Операция сложения используется для объединения смещений:

p.add(q)

Результат:

  • x = p.x + q.x
  • y = p.y + q.y

Применение:

  • суммирование движений камеры
  • накопление смещений при анимации

Вычитание

p.sub(q)

Результат:

  • x = p.x - q.x
  • y = p.y - q.y

Используется для вычисления разницы между координатами, например:

  • вектора направления жеста
  • расстояния между объектами

Умножение на скаляр

p.mult(k)

Результат:

  • x = p.x * k
  • y = p.y * k

Применение:

  • масштабирование скорости
  • изменение длины вектора

Деление на скаляр

p.div(k)

Результат:

  • x = p.x / k
  • y = p.y / k

Используется в нормализации и усреднении значений.

Геометрические операции

Длина вектора

Длина (или модуль) вычисляется как:

  • √(x² + y²)

Эта операция важна для определения:

  • скорости движения
  • расстояния между точками
  • нормализации векторов

Нормализация

Нормализованный вектор имеет длину 1 и сохраняет направление:

p / |p|

Применяется при:

  • вычислении направления жестов
  • интерполяции движения камеры
  • обработке инерции

Расстояние между точками

Расстояние между двумя Point используется в обработке взаимодействий:

  • жесты pinch-to-zoom
  • drag-события
  • вычисление области видимости

Векторные свойства и поведение

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

Основные свойства:

  • коммутативность сложения
  • линейность операций
  • возможность масштабирования
  • сохранение направления при нормализации

Это делает Point удобным для построения цепочек вычислений без промежуточных объектов.

Использование в системе MapLibre GL JS

Point активно применяется в нескольких ключевых подсистемах:

1. Обработка пользовательского ввода

При работе с мышью и касаниями координаты событий преобразуются в Point:

  • позиция курсора
  • смещение при drag
  • векторы жестов

2. Камера и трансформации

Камера карты использует Point для:

  • смещения центра
  • расчёта панорамирования
  • интерполяции движения

3. Тайловая система

При расчёте видимых тайлов используются Point для:

  • позиционирования тайлов в пиксельной сетке
  • вычисления границ видимой области
  • оптимизации отрисовки

4. Рендеринг слоёв

Во время отрисовки каждый слой может использовать Point для:

  • позиционирования символов
  • вычисления оффсетов
  • трансформации координат вершин

Математическая интерпретация

Point можно рассматривать как элемент векторного пространства ℝ². Это позволяет применять стандартные операции линейной алгебры:

  • сложение векторов
  • умножение на скаляр
  • вычисление нормы
  • скалярное произведение (в расширенных реализациях)

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

Производительность и особенности реализации

Point является легковесным объектом. В высоконагруженных участках кода:

  • создаётся большое количество экземпляров
  • минимизируется аллокация памяти
  • операции реализуются максимально просто

Это важно для WebGL-рендеринга, где даже небольшие издержки в математических операциях могут влиять на плавность анимации.

Роль в композиции вычислений

Point часто используется как промежуточный тип в цепочках вычислений:

  • преобразование координат
  • вычисление смещений камеры
  • интерполяция между состояниями

Такая композиционность позволяет строить сложные математические модели поведения карты из простых операций над точками.