Назад к задачам
Junior — Middle+
21

Функция для анимированного отображения автомобилей на карте

Компании, где спрашивали:

ЯндексЯндекс
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Требуется реализовать метод displayCars, который отвечает за визуализацию машин на карте. Метод получает массив объектов Car. Каждый объект Car содержит уникальный идентификатор, координаты и угол поворота. Необходимо:

  • добавить новые автомобили, которых ещё нет на карте;
  • переместить уже отображённые машины к их новым координатам с плавной анимацией (для этого используется вызов updatePlacemark);
  • удалить с карты те автомобили, которые присутствуют в текущем наборе маркеров, но отсутствуют в полученном списке.

Никакой «грубой» реализации без анимации не допускается – нельзя просто удалить все маркеры и заново их добавить.

class MapController {
  // можно дописать fields если необходимо
  final MapPlugin plugin;

  MapController(this.plugin);

  void displayCars(List<Car> cars) {
    /// Необходимо написать функцию анимированного движения машинок по карте.
    /// Анимированное перемещение осуществляется вызовом updatePlacemark
    /// Наивное решение без анимации — удалить все ранее добавленные машинки и отобразить новые.
  }

  // считаем, что функция реализована
  Geometry _createGeometry(Car car) {/*...*/}
}

typedef MapPlacemarkId = int;

abstract class MapPlugin {
  // считаем, что функция реализована
  MapPlacemarkId addPlacemark(Geometry geometry);

  // считаем, что функция реализована
  void removePlacemark(MapPlacemarkId placemark);

  // считаем, что функция реализована
  void updatePlacemark(MapPlacemarkId placemark, Geometry geometry);
}

typedef CarId = String;

class Car {
  final CarId id;

  // getters [coordinate.x], [coordinate.y]
  final math.Point<double> coordinate;
  final double course;

  const Car({
    required this.id,
    required this.coordinate,
    required this.course,
  });
}

class Geometry {
  final double lat;
  final double lon;
  final double course;
  final String image;

  const Geometry({
    required this.lat,
    required this.lon,
    required this.course,
    required this.image,
  });
}