From e7c743716f1e866ecb14aec5568d90dfe38c99b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Wed, 13 Dec 2017 00:24:02 +0100 Subject: [PATCH] Fixed bad angle math when looking for ships in arc area --- src/core/ArenaLocation.spec.ts | 12 +++++++----- src/core/ArenaLocation.ts | 7 ++++--- src/core/actions/TriggerAction.ts | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/core/ArenaLocation.spec.ts b/src/core/ArenaLocation.spec.ts index d0fb030..b821e91 100644 --- a/src/core/ArenaLocation.spec.ts +++ b/src/core/ArenaLocation.spec.ts @@ -5,11 +5,13 @@ module TK.SpaceTac.Specs { check.nears(arenaAngle({ x: 0, y: 0 }, { x: 1, y: 1 }), Math.PI / 4); }) - test.case("gets an angular distance", check => { - check.equals(angularDistance(0.5, 1.5), 1.0); - check.nears(angularDistance(0.5, 1.5 + Math.PI * 6), 1.0); - check.same(angularDistance(0.5, -0.5), -1.0); - check.nears(angularDistance(0.5, -0.3 - Math.PI * 4), -0.8); + test.case("computes an angular difference", check => { + check.equals(angularDifference(0.5, 1.5), 1.0); + check.nears(angularDifference(0.5, 1.5 + Math.PI * 6), 1.0); + check.same(angularDifference(0.5, -0.5), -1.0); + check.nears(angularDifference(0.5, -0.3 - Math.PI * 4), -0.8); + check.nears(angularDifference(-3 * Math.PI / 4, 3 * Math.PI / 4), -Math.PI / 2); + check.nears(angularDifference(3 * Math.PI / 4, -3 * Math.PI / 4), Math.PI / 2); }) test.case("converts between degrees and radians", check => { diff --git a/src/core/ArenaLocation.ts b/src/core/ArenaLocation.ts index 9e0e5ee..59eed53 100644 --- a/src/core/ArenaLocation.ts +++ b/src/core/ArenaLocation.ts @@ -59,10 +59,11 @@ module TK.SpaceTac { } /** - * Get the "angular distance" between two angles in radians + * Get the "angular difference" between two angles in radians, in ]-pi,pi] range. */ - export function angularDistance(angle1: number, angle2: number): number { - return (angle2 - angle1) % (Math.PI * 2); + export function angularDifference(angle1: number, angle2: number): number { + let diff = angle2 - angle1; + return diff - Math.PI * 2 * Math.floor((diff + Math.PI) / (Math.PI * 2)); } /** diff --git a/src/core/actions/TriggerAction.ts b/src/core/actions/TriggerAction.ts index 28d527f..6694089 100644 --- a/src/core/actions/TriggerAction.ts +++ b/src/core/actions/TriggerAction.ts @@ -141,7 +141,7 @@ module TK.SpaceTac { if (dist < 0.000001 || dist > this.range) { return false; } else { - return Math.abs(angularDistance(arenaAngle(source, ship.location), angle)) < maxangle; + return Math.abs(angularDifference(arenaAngle(source, ship.location), angle)) < maxangle; } }); } else { @@ -195,7 +195,7 @@ module TK.SpaceTac { if (arenaDistance(ship.location, target) > 1e-6) { // Face the target let angle = arenaAngle(ship.location, target); - if (Math.abs(angularDistance(angle, ship.arena_angle)) > 1e-6) { + if (Math.abs(angularDifference(angle, ship.arena_angle)) > 1e-6) { let destination = new ArenaLocationAngle(ship.arena_x, ship.arena_y, angle); let engine = first(ship.listEquipment(SlotType.Engine), () => true); result.push(new ShipMoveDiff(ship, ship.location, destination, engine));