Назад к задачам
ЯндексПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Middle+
21
Функция для анимированного отображения автомобилей на карте
Компании, где спрашивали:
Условие задачи
Требуется реализовать метод 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,
});
}