Перейти к публикации

dennisx

Старожилы форума
  • Публикации

    3
  • Зарегистрирован

  • Посещение

Информация

  • Пол
    Мужчина

dennisx's Achievements

  1. Я из тех пользователей которые пользуются режимом "север вверху". Считаю его самым оптимальным т.к. он позволяет не только доехать до места но еще и легко понимать где ты в целом находишься не теряя ориентацию в пространстве. (Если это имеет какое-то отношение к этой теме: я пользуюсь htc legend - android 2.2 - недавно обновился до NN5 - и там опять таки не реализована моя идея). На данный момент при использовании этого режима позиционирование карты происходит так: текущее местонахождение ВСЕГДА в центре экрана. Что очевидно не удобно т.к. на экране отображается только очень маленькая часть предстояещего маршрута. Предположим у нас есть вот такой вот маршрут: Вот серия картинок которая иллюстрирует текущее позиционирование: ->->->-> ---------------------------------------------------------------------------------------------------------------------------------------------------------- ->->->-> Это можно сделать намного лучше: нужно пизиционировать экран так чтобы в него входила максимально возможная часть маршрута + текущее местонахождение должно иметь небольшой отступ от края экрана - пикселов 50 например. В конце поста я подробно опишу простой алгоритм который стоит применить в данной ситуации. Вот серия картинок которая иллюстрирует предлагаемый мной способ позиционирования экрана: ->->->-> ---------------------------------------------------------------------------------------------------------------------------------------------------------- ->->->-> Что видно из двух серий картинок: - в первом(текущем) варианте мы постоянно видимо очень маленькую часть маршрута в основном только с одним грядущим поворотом. Весь оставшийся маршрут с конечной точкой мы начинаем видеть только с 9-ой картинки - почти в самом конце маршрута. - в первом варианте в случае движения справа налево иконки которые показывают время прибытия и расстояние до конечной точки будут почти полностью закрывать будущий маршрут! - во втором варианте мы видим значительно большую часть маршрута всегда. Весь оставшийся маршрут с конечной точкой мы начинаем видеть уже только с 4-ой - картинки почти в самом начале пути! По моему вывод очевиден - второй вариант значительно превосходит первый по удобству пользования! Описание алгоритма: Дано: - допустим размер экрана у нас: x в ширину и y в высоту. - допустим текущее положение не должно быть ближе к краю экрана чем на B пикселей (B - border) - допустим мы знаем координаты(географические) всех точек маршрута начиная с текущего положения машины: 0..N (а мы их конечно знаем): (lon0, lat0)...(lonN, latN) - мы знаем текущий масштаб - M (а мы его знаем - он сейчас вычисляется от скорости движения на сколько я понял) - необходимо определить координаты(географические) центра экрана Что делаем: 1) вычисляем размеры экрана (x - B ) на (y - B ) в географических координатах при текущем масштабе M (при небольших маштабах погрешность от того что земля не плоская - будет минимальна) допустим получилось (lonM на latM) 2) создаем объект "прямоугольник" - rect (условный - суть - 2 пары координат) с обеми парам координат равными (lon0, lat0) 3) цикл I от 1 до N по всем точкам маршрута. В нем делаем следующее: - сохраняем текущий прямоугольник в rect_bak - расширяем нашь прямоугольник rect на координату (lonI, latI) - проверяем является ли получившийся прямоугольник rect размерами больше чем (lonM на latM) -- если да тогда: находим пересечение последнего отрезка маршрута с одной из границ прямоугольника размером (lonM на latM), точка пересечения - это наша последняя точка маршрута которая поместится на экран. Расширяем rect_bak на эту координату и записываем это в rect -- если нет тогда: продолжаем цикл. в результате цикла получаем 2 пары координат rect((lonFinal1, latFinal1) и (lonFinal2, latFinal2)) - это координаты прямоугольника центр которого должен быть в центре экрана. Если же помещение этого прямоугольника в центр экрана приводит к тому что текущее положение находится ближе чем B пикселей от края экрана тогда мы должны сдвинуть центр на максимум B/2 пикселей в необходимую(в высоту и/или в ширину) сторону так чтобы текущее положение находилось ровно в B пикселей от края. Что вы думаете об этом?
×
×
  • Создать...