-
Notifications
You must be signed in to change notification settings - Fork 0
/
ServiceMapCalc.js
69 lines (57 loc) · 1.72 KB
/
ServiceMapCalc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"use strict";
function isNumeric(n)
{
return !isNaN(parseFloat(n)) && isFinite(n);
}
const Service = require('Service');
module.exports = class ServiceMapCalc extends Service
{
parseRoomName(roomName)
{
let indexOfSecondLetter;
for(indexOfSecondLetter = 1; indexOfSecondLetter <= roomName.length; indexOfSecondLetter++)
if(!isNumeric(roomName[indexOfSecondLetter]))
break;
let result =
{ name: roomName
, horizontal:
{ half: roomName[0] //"E" or "W", matching the globals EAST and WEST
, distance: roomName.substr(1, indexOfSecondLetter-1)
}
, vertical:
{ half: roomName[indexOfSecondLetter] //"N" or "S", matching the globals NORTH and SOUTH
, distance: roomName.substr(indexOfSecondLetter+1, roomName.length-indexOfSecondLetter+1)
}
};
return result;
}
IsRoomInsideArea(roomName, area)
{
let numericArea = this._areaToNumericArea(area);
let numericRoom = this._roomToNumericRoom(this.parseRoomName(roomName));
return numericRoom.vertical >= numericArea.top &&
numericRoom.vertical <= numericArea.bottom &&
numericRoom.horizontal >= numericArea.left &&
numericRoom.horizontal <= numericArea.right;
}
_areaToNumericArea(area)
{
return { top: this._toNumericCoordinate(area.top)
, bottom: this._toNumericCoordinate(area.bottom)
, left: this._toNumericCoordinate(area.left)
, right: this._toNumericCoordinate(area.right)
};
}
_roomToNumericRoom(room)
{
return { horizontal: this._toNumericCoordinate(room.horizontal)
, vertical: this._toNumericCoordinate(room.vertical)
};
}
_toNumericCoordinate(coordinate)
{
if(coordinate.half === WEST || coordinate.half === NORTH)
return -coordinate.distance;
return coordinate.distance;
}
};