From a5dd1755d95b2053f87bb87fc76383e5c90e0869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Jaenisch?= Date: Sun, 15 Aug 2021 14:01:44 +0200 Subject: [PATCH] feat: add new function to rotate a vector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: André Jaenisch --- src/js/vector.js | 18 ++++++++++++++++++ test/js/vector.test.js | 17 +++++++++++++++++ types/vector.d.ts | 8 ++++++++ 3 files changed, 43 insertions(+) diff --git a/src/js/vector.js b/src/js/vector.js index 5636623..1bc573d 100644 --- a/src/js/vector.js +++ b/src/js/vector.js @@ -100,3 +100,21 @@ export function distance (v, w) { export function normalize (v) { return scale(v, 1 / (length(v) || 1)) } + +/** + * Rotate a vector around a given centre for a given angle in radians. + * + * @param {Vector2D} v + * @param {Vector2D} centre + * @param {number} angle + */ +export function rotate (v, centre, angle) { + const { cos, sin } = Math + const x = v.x - centre.x + const y = v.y - centre.y + + return Vec2( + x * cos(angle) - y * sin(angle) + centre.x, + x * sin(angle) + y * cos(angle) + centre.y + ) +} diff --git a/test/js/vector.test.js b/test/js/vector.test.js index d88c52d..61fab92 100644 --- a/test/js/vector.test.js +++ b/test/js/vector.test.js @@ -7,6 +7,7 @@ import { dot, length, normalize, + rotate, scale, subtract, Vec2, @@ -140,4 +141,20 @@ describe('Vector library', function () { expect(normalized.y).to.be.approximately(0.8, 0.001) }) }) + + describe('rotate', function () { + it('should rotate a shape around its centre on given angle', function () { + // Arrange + const v = Vec2(1, 0) + const c = Vec2(0, 0) + const angle = Math.PI + + // Act + const rotated = rotate(v, c, angle) + + // Assert + expect(rotated.x).to.be.approximately(-1, 0.001) + expect(rotated.y).to.be.approximately(0, 0.001) + }) + }) }) diff --git a/types/vector.d.ts b/types/vector.d.ts index 1a2b584..b148fe7 100644 --- a/types/vector.d.ts +++ b/types/vector.d.ts @@ -73,6 +73,14 @@ export function distance(v: Vector2D, w: Vector2D): number; * @returns {Vector2D} */ export function normalize(v: Vector2D): Vector2D; +/** + * Rotate a vector around a given centre for a given angle in radians. + * + * @param {Vector2D} v + * @param {Vector2D} centre + * @param {number} angle + */ +export function rotate(v: Vector2D, centre: Vector2D, angle: number): Vector2D; export type Vector2D = { x: number; y: number;