Source code for serge.blocks.directions
"""Utilities to do with cardinal directions"""
from serge.simplevecs import Vec2d
N = 'n'
S = 's'
E = 'e'
W = 'w'
NE = 'ne'
NW = 'nw'
SE = 'se'
SW = 'sw'
_directions = {
'': (0, 0),
'n': (0, -1),
'ne': (1, -1),
'e': (1, 0),
'se': (1, 1),
's': (0, 1),
'sw': (-1, 1),
'w': (-1, 0),
'nw': (-1, -1),
}
_angles = {
N: 0,
E: -90,
W: +90,
S: 180,
NE: -45,
NW: +45,
SE: 135,
SW: 225,
}
_reverse_directions = dict((v, e) for e, v in _directions.iteritems())
[docs]def getVectorFromCardinal(direction):
"""Return the vector for a cardinal direction"""
return Vec2d(_directions[direction])
[docs]def getCardinalFromVector(vector):
"""Return the cardinal name from the vector"""
normalized = (vector[0]/abs(vector[0]) if vector[0] else 0, vector[1]/abs(vector[1]) if vector[1] else 0)
return _reverse_directions[normalized]
[docs]def getCardinals():
"""Return the cardinal directions by name"""
return _directions.keys()
[docs]def getOppositeVector(vector):
"""Return the opposite vector"""
return vector[0]*-1, vector[1]*-1
[docs]def getOppositeCardinal(cardinal):
"""Return the opposite cardinal direction"""
return getCardinalFromVector(getOppositeVector(getVectorFromCardinal(cardinal)))
[docs]def getAngleFromCardinal(direction):
"""Return the angle for a cardinal direction"""
return _angles[direction]
[docs]def getAngleFromVector(vector):
"""Return the angle for a vector"""
return getAngleFromCardinal(getCardinalFromVector(vector))
[docs]def getCardinalFromAngle(angle):
"""Return the cardinal for an angle"""
for c, a in _angles.iteritems():
if angle == int(a) or angle-360 == int(a) or angle+360 == int(a):
return c
raise KeyError('Angle not a cardinal: %s' % angle)