Нам нужно определить, в каком направлении нужно двигаться, чтобы при движении из центра города попасть в отель. Координаты центра города и отеля нам известны.
Для решения задачи:
- Ставим точку центра города на бумажке.
- Строим через эту точку вертикальную и горизонтальную линии (оси x и y координат)
- Строим конечную точку (отель)
- Определяем в какой зоне координат находится конечная точка (в --, ++, -+, +-)
- Далее определяем угол между осью x и y
- Смотрим чему равен угол, < 45 - 45/2, > 45 + 45/2 или находится между
Код на языке python:
import math
def get_direction_name((lng_city, lat_city), (lng_hotel, lat_hotel)):
    direction = get_direction((lng_city, lat_city), (lng_hotel, lat_hotel))
    name = dict(DIRECTIONS)[direction]
    return name
def get_direction((lng_city, lat_city), (lng_hotel, lat_hotel)):
    diff_lat = lat_hotel - lat_city
    diff_lng = lng_hotel - lng_city
    if math.fabs(diff_lng) > 180:
        diff_lng -= 360*diff_lng/math.fabs(diff_lng)
    is_mm = (diff_lat < 0) and (diff_lng < 0) and 1 or 0
    is_pp = (diff_lat > 0) and (diff_lng > 0) and 1 or 0
    is_mp = (diff_lat > 0) and (diff_lng < 0) and 1 or 0
    is_pm = (diff_lat < 0) and (diff_lng > 0) and 1 or 0
    if diff_lng:
        arg = math.fabs(diff_lat/diff_lng)
        degree = math.atan(arg)*180/math.pi
    else:
        degree = 90
    on_diagonal = 45 - 45.0/2 < degree < 45 + 45.0/2 and 1 or 0
    below_diagonal = degree < 45 - 45.0/2 and 1 or 0
    above_diagonal = degree > 45 + 45.0/2 and 1 or 0
    print is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal
    direction_key = '{0}-{1}-{2}-{3}-{4}-{5}-{6}'.format(
        is_pp, is_mm, is_pm, is_mp, on_diagonal, below_diagonal, above_diagonal,
    )
    direction = _direction_map[direction_key]
    return direction
NORTH_EAST = 'north-east'
NORTH_WEST = 'north-west'
SOUTH_EAST = 'south-east'
SOUTH_WEST = 'south-west'
NORTH = 'north'
SOUTH = 'south'
EAST = 'east'
WEST = 'west'
DIRECTIONS = [
   (NORTH_EAST, _(u'северо-восток')),
   (NORTH_WEST, _(u'северо-запад')),
   (SOUTH_EAST, _(u'юго-восток')),
   (SOUTH_WEST, _(u'юго-запад')),
   (NORTH, _(u'север')),
   (SOUTH, _(u'юг')),
   (EAST, _(u'восток')),
   (WEST, _(u'запад')),
]
# Key: is_pp-is_mm-is_pm-is_mp-on_diagonal-below_diagonal-above_diagonal
_direction_map = {
    '1-0-0-0-1-0-0': NORTH_EAST,
    '1-0-0-0-0-1-0': EAST,
    '1-0-0-0-0-0-1': NORTH,
    '0-1-0-0-1-0-0': SOUTH_WEST,
    '0-1-0-0-0-1-0': WEST,
    '0-1-0-0-0-0-1': SOUTH,
    '0-0-1-0-1-0-0': SOUTH_EAST,
    '0-0-1-0-0-1-0': EAST,
    '0-0-1-0-0-0-1': SOUTH,
    '0-0-0-1-1-0-0': NORTH_WEST,
    '0-0-0-1-0-1-0': WEST,
    '0-0-0-1-0-0-1': NORTH,
}
 
Комментариев нет:
Отправить комментарий