2017-05-30 16:24:55 +00:00
|
|
|
module TS.SpaceTac {
|
|
|
|
/**
|
2017-06-22 22:37:38 +00:00
|
|
|
* Location in the arena (coordinates only)
|
2017-05-30 16:24:55 +00:00
|
|
|
*/
|
2017-06-22 22:37:38 +00:00
|
|
|
export interface IArenaLocation {
|
|
|
|
x: number
|
|
|
|
y: number
|
|
|
|
}
|
|
|
|
export class ArenaLocation implements IArenaLocation {
|
2017-05-30 16:24:55 +00:00
|
|
|
x: number
|
|
|
|
y: number
|
|
|
|
|
|
|
|
constructor(x = 0, y = 0) {
|
|
|
|
this.x = x;
|
|
|
|
this.y = y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Location in the arena, with a facing angle in radians
|
|
|
|
*/
|
2017-06-22 22:37:38 +00:00
|
|
|
export interface IArenaLocationAngle {
|
|
|
|
x: number
|
|
|
|
y: number
|
|
|
|
angle: number
|
|
|
|
}
|
|
|
|
export class ArenaLocationAngle extends ArenaLocation implements IArenaLocationAngle {
|
2017-05-30 16:24:55 +00:00
|
|
|
angle: number
|
|
|
|
|
|
|
|
constructor(x = 0, y = 0, angle = 0) {
|
|
|
|
super(x, y);
|
|
|
|
this.angle = angle;
|
|
|
|
}
|
|
|
|
}
|
2017-06-22 22:37:38 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Circle area in the arena
|
|
|
|
*/
|
|
|
|
export interface IArenaCircleArea {
|
|
|
|
x: number
|
|
|
|
y: number
|
|
|
|
radius: number
|
|
|
|
}
|
|
|
|
|
|
|
|
export class ArenaCircleArea extends ArenaLocation implements IArenaCircleArea {
|
|
|
|
radius: number
|
|
|
|
|
|
|
|
constructor(x = 0, y = 0, radius = 0) {
|
|
|
|
super(x, y);
|
|
|
|
this.radius = radius;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the normalized angle between two locations
|
|
|
|
*/
|
|
|
|
export function arenaAngle(loc1: IArenaLocation, loc2: IArenaLocation) {
|
|
|
|
return Math.atan2(loc2.y - loc1.y, loc2.x - loc1.x);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the normalized distance between two locations
|
|
|
|
*/
|
|
|
|
export function arenaDistance(loc1: IArenaLocation, loc2: IArenaLocation) {
|
|
|
|
let dx = loc2.x - loc1.x;
|
|
|
|
let dy = loc2.y - loc1.y;
|
|
|
|
return Math.sqrt(dx * dx + dy * dy);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if a location is inside an area
|
|
|
|
*/
|
|
|
|
export function arenaInside(loc1: IArenaLocation, loc2: IArenaCircleArea, border_inclusive = true) {
|
|
|
|
let dist = arenaDistance(loc1, loc2);
|
|
|
|
return border_inclusive ? (dist <= loc2.radius) : (dist < loc2.radius);
|
|
|
|
}
|
2017-05-30 16:24:55 +00:00
|
|
|
}
|