2017-09-24 22:23:22 +00:00
|
|
|
module TK.SpaceTac {
|
2017-05-30 16:24:55 +00:00
|
|
|
/**
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-10-03 16:11:30 +00:00
|
|
|
* Get the normalized angle (in radians) between two locations
|
2017-06-22 22:37:38 +00:00
|
|
|
*/
|
2017-10-03 16:11:30 +00:00
|
|
|
export function arenaAngle(loc1: IArenaLocation, loc2: IArenaLocation): number {
|
2017-06-22 22:37:38 +00:00
|
|
|
return Math.atan2(loc2.y - loc1.y, loc2.x - loc1.x);
|
|
|
|
}
|
|
|
|
|
2017-10-03 16:11:30 +00:00
|
|
|
/**
|
|
|
|
* Get the "angular distance" between two angles in radians
|
|
|
|
*/
|
|
|
|
export function angularDistance(angle1: number, angle2: number): number {
|
|
|
|
return (angle2 - angle1) % (Math.PI * 2);
|
|
|
|
}
|
|
|
|
|
2017-06-22 22:37:38 +00:00
|
|
|
/**
|
|
|
|
* Get the normalized distance between two locations
|
|
|
|
*/
|
2017-10-03 16:11:30 +00:00
|
|
|
export function arenaDistance(loc1: IArenaLocation, loc2: IArenaLocation): number {
|
2017-06-22 22:37:38 +00:00
|
|
|
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
|
|
|
|
*/
|
2017-10-03 16:11:30 +00:00
|
|
|
export function arenaInside(loc1: IArenaLocation, loc2: IArenaCircleArea, border_inclusive = true): boolean {
|
2017-06-22 22:37:38 +00:00
|
|
|
let dist = arenaDistance(loc1, loc2);
|
|
|
|
return border_inclusive ? (dist <= loc2.radius) : (dist < loc2.radius);
|
|
|
|
}
|
2017-10-03 20:56:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert radians angle to degrees
|
|
|
|
*/
|
|
|
|
export function degrees(angle: number): number {
|
|
|
|
return angle * 180 / Math.PI;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert degrees angle to radians
|
|
|
|
*/
|
|
|
|
export function radians(angle: number): number {
|
|
|
|
return angle * Math.PI / 180;
|
|
|
|
}
|
2017-05-30 16:24:55 +00:00
|
|
|
}
|