From e3d5621212a163b89fd75144e6ffe027f5f139d3 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Sun, 4 Sep 2022 18:50:59 +0300 Subject: [PATCH 01/26] impl vec2.unit vec3.unit --- lib/vec2/index.js | 2 ++ lib/vec2/unit.js | 29 +++++++++++++++++++++++++++++ lib/vec3/index.js | 1 + lib/vec3/unit.js | 31 +++++++++++++++++++++++++++++++ test/vec2/index.test.js | 1 + test/vec2/unit.test.js | 20 ++++++++++++++++++++ test/vec3/index.test.js | 1 + test/vec3/unit.test.js | 20 ++++++++++++++++++++ 8 files changed, 105 insertions(+) create mode 100644 lib/vec2/unit.js create mode 100644 lib/vec3/unit.js create mode 100644 test/vec2/unit.test.js create mode 100644 test/vec3/unit.test.js diff --git a/lib/vec2/index.js b/lib/vec2/index.js index 519728f7..013f1ad2 100644 --- a/lib/vec2/index.js +++ b/lib/vec2/index.js @@ -65,4 +65,6 @@ exports.toPolar = require('./toPolar') exports.transitFrom = require('./transitFrom') exports.transitTo = require('./transitTo') +exports.unit = require('./unit') + exports.validate = require('./validate') diff --git a/lib/vec2/unit.js b/lib/vec2/unit.js new file mode 100644 index 00000000..1735bc9e --- /dev/null +++ b/lib/vec2/unit.js @@ -0,0 +1,29 @@ +const magnitude = require('./magnitude') + +module.exports = (v) => { + // affineplane.vec2.unit(v) + // + // Get unit vector parallel to the given vector. + // The magnitude of unit vector is equal to one. + // If zero vector is given, assume direction towards positive x. + // + // Parameters: + // v + // a vec2 + // + // Return + // a vec2, magnitude of one. + // + const m = magnitude(v) + + if (m > 0) { + return { + x: v.x / m, + y: v.y / m + } + } + return { + x: 1, + y: 0 + } +} diff --git a/lib/vec3/index.js b/lib/vec3/index.js index ffc13801..fa9dccb2 100644 --- a/lib/vec3/index.js +++ b/lib/vec3/index.js @@ -31,4 +31,5 @@ exports.toPolar = require('./toPolar') exports.toSpherical = require('./toSpherical') exports.transitFrom = require('./transitFrom') exports.transitTo = require('./transitTo') +exports.unit = require('./unit') exports.validate = require('./validate') diff --git a/lib/vec3/unit.js b/lib/vec3/unit.js new file mode 100644 index 00000000..a8f412b8 --- /dev/null +++ b/lib/vec3/unit.js @@ -0,0 +1,31 @@ +const magnitude = require('./magnitude') + +module.exports = (v) => { + // affineplane.vec3.unit(v) + // + // Get unit vector parallel to the given vector. + // The magnitude of unit vector is equal to one. + // If zero vector is given, assume direction towards positive x. + // + // Parameters: + // v + // a vec3 + // + // Return + // a vec3, magnitude of one. + // + const m = magnitude(v) + + if (m > 0) { + return { + x: v.x / m, + y: v.y / m, + z: v.z / m + } + } + return { + x: 1, + y: 0, + z: 0 + } +} diff --git a/test/vec2/index.test.js b/test/vec2/index.test.js index e110f115..651f1e19 100644 --- a/test/vec2/index.test.js +++ b/test/vec2/index.test.js @@ -23,6 +23,7 @@ const units = { toPolar: require('./toPolar.test'), transitFrom: require('./transitFrom.test'), transitTo: require('./transitTo.test'), + unit: require('./unit.test'), validate: require('./validate.test') } diff --git a/test/vec2/unit.test.js b/test/vec2/unit.test.js new file mode 100644 index 00000000..6502188a --- /dev/null +++ b/test/vec2/unit.test.js @@ -0,0 +1,20 @@ +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic unit vector', (t) => { + t.almostEqual( + vec2.unit({ x: 0, y: 0 }), + { x: 1, y: 0 }, + 'zero vector towards x' + ) + + t.almostEqual( + vec2.unit({ x: 3, y: 4 }), // orig.len. 5 + { x: 3 / 5, y: 4 / 5 }, + 'direction does not change' + ) + + t.end() + }) +} diff --git a/test/vec3/index.test.js b/test/vec3/index.test.js index 916571aa..e2734908 100644 --- a/test/vec3/index.test.js +++ b/test/vec3/index.test.js @@ -16,6 +16,7 @@ const units = { toSpherical: require('./toSpherical.test'), transitFrom: require('./transitFrom.test'), transitTo: require('./transitTo.test'), + unit: require('./unit.test'), validate: require('./validate.test') } diff --git a/test/vec3/unit.test.js b/test/vec3/unit.test.js new file mode 100644 index 00000000..5f8f2fab --- /dev/null +++ b/test/vec3/unit.test.js @@ -0,0 +1,20 @@ +const affineplane = require('../../index') +const vec3 = affineplane.vec3 + +module.exports = (ts) => { + ts.test('case: basic unit vector', (t) => { + t.almostEqual( + vec3.unit({ x: 0, y: 0, z: 0 }), + { x: 1, y: 0, z: 0 }, + 'zero vector towards x' + ) + + t.almostEqual( + vec3.unit({ x: 3, y: 4, z: 12 }), // orig.len. 13 + { x: 3 / 13, y: 4 / 13, z: 12 / 13 }, + 'direction does not change' + ) + + t.end() + }) +} From a3affb3ace3e9514edb728cce5bb762e3267d4cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 13:44:02 +0300 Subject: [PATCH 02/26] restrict travis to main branch --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 475d5187..ad6dc084 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,6 @@ node_js: - 10 - 12 - lts/* +branches: + only: + - main From 7dabe6242988639bc548e21ff3c728ad5e8d008f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:03:23 +0300 Subject: [PATCH 03/26] improve api docs intro --- docs/generate.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/generate.js b/docs/generate.js index 3ad2ca82..fe50b838 100644 --- a/docs/generate.js +++ b/docs/generate.js @@ -13,7 +13,11 @@ yamdog.generate({ // Main title of the document title: 'Affineplane API Documentation v' + version, // Introduction; the initial paragraph - intro: 'Welcome to affineplane API reference documentation.', + intro: 'Welcome to affineplane API reference documentation. ' + + 'See also [Usage](https://axelpale.github.io/affineplane/) and ' + + '[GitHub](https://github.com/axelpale/affineplane) for ' + + 'introduction and source code. The docs are generated with ' + + '[yamdog](https://axelpale.github.io/yamdog/).', // Styling; decorate the docs decorators: [ decor.aliases(), From e9dc98d6bd6046a866dd3f561ab4fdacfd17fe4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:03:38 +0300 Subject: [PATCH 04/26] render api docs --- docs/API.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/API.md b/docs/API.md index ddc6cdb7..682a6a7b 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,7 +1,7 @@ # Affineplane API Documentation v2.3.0 -Welcome to affineplane API reference documentation. +Welcome to affineplane API reference documentation. See also [Usage](https://axelpale.github.io/affineplane/) and [GitHub](https://github.com/axelpale/affineplane) for introduction and source code. The docs are generated with [yamdog](https://axelpale.github.io/yamdog/). @@ -3485,6 +3485,7 @@ Aliases: [affineplane.vector2](#affineplanevector2) - [affineplane.vec2.toPolar](#affineplanevec2toPolar) - [affineplane.vec2.transitFrom](#affineplanevec2transitFrom) - [affineplane.vec2.transitTo](#affineplanevec2transitTo) +- [affineplane.vec2.unit](#affineplanevec2unit) - [affineplane.vec2.validate](#affineplanevec2validate) @@ -3904,6 +3905,22 @@ Translation of the plane does not affect the vector. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/transitTo.js) + +## affineplane.vec2.unit(v) + +Get unit vector parallel to the given vector. +The magnitude of unit vector is equal to one. +If zero vector is given, assume direction towards positive x. + +**Parameters:** +- *v* + - a [vec2](#affineplanevec2) + +**Returns:** +- a [vec2](#affineplanevec2), magnitude of one. + +Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/unit.js) + ## affineplane.vec2.validate(v) @@ -3952,6 +3969,7 @@ Aliases: [affineplane.vector3](#affineplanevector3) - [affineplane.vec3.toSpherical](#affineplanevec3toSpherical) - [affineplane.vec3.transitFrom](#affineplanevec3transitFrom) - [affineplane.vec3.transitTo](#affineplanevec3transitTo) +- [affineplane.vec3.unit](#affineplanevec3unit) - [affineplane.vec3.validate](#affineplanevec3validate) @@ -4402,6 +4420,22 @@ without losing information. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/transitTo.js) + +## affineplane.vec3.unit(v) + +Get unit vector parallel to the given vector. +The magnitude of unit vector is equal to one. +If zero vector is given, assume direction towards positive x. + +**Parameters:** +- *v* + - a [vec3](#affineplanevec3) + +**Returns:** +- a [vec3](#affineplanevec3), magnitude of one. + +Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/unit.js) + ## affineplane.vec3.validate(v) From 5e598450eeabf62a34a1d79c48c5feff629d7bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:20:07 +0300 Subject: [PATCH 05/26] test vec2 difference, magnitude --- test/vec2/difference.test.js | 35 +++++++++++++++++++++++++---------- test/vec2/index.test.js | 4 ++-- test/vec2/magnitude.test.js | 22 +++++++++++++++++++--- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/test/vec2/difference.test.js b/test/vec2/difference.test.js index db0aea61..6cc54ec6 100644 --- a/test/vec2/difference.test.js +++ b/test/vec2/difference.test.js @@ -1,11 +1,26 @@ -module.exports = (p, q) => { - // A vector between from point p to point q - // - // Return - // vector - // - return { - x: p.x - q.x, - y: p.y - q.y - } +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic diff', (t) => { + t.almostEqual( + vec2.difference( + { x: 0, y: 0 }, + { x: 0, y: 0 } + ), + { x: 0, y: 0 }, + 'zero vectors' + ) + + t.almostEqual( + vec2.difference( + { x: 1, y: 0 }, + { x: 2, y: 1 } + ), + { x: -1, y: -1 }, + 'simple diff a - b' + ) + + t.end() + }) } diff --git a/test/vec2/index.test.js b/test/vec2/index.test.js index 651f1e19..6158411d 100644 --- a/test/vec2/index.test.js +++ b/test/vec2/index.test.js @@ -6,12 +6,12 @@ const units = { copy: require('./copy.test'), create: require('./create.test'), cross: require('./cross.test'), - // difference: require('./difference.test'), + difference: require('./difference.test'), dot: require('./dot.test'), // equal: require('./equal.test'), // fromPolar: require('./fromPolar.test'), // inverse: require('./inverse.test'), - // magnitude: require('./magnitude.test'), + magnitude: require('./magnitude.test'), // max: require('./max.test'), // min: require('./min.test'), projectTo: require('./projectTo.test'), diff --git a/test/vec2/magnitude.test.js b/test/vec2/magnitude.test.js index 3c0f9594..e29dafe7 100644 --- a/test/vec2/magnitude.test.js +++ b/test/vec2/magnitude.test.js @@ -1,4 +1,20 @@ -module.exports = (v) => { - // Return float - return Math.sqrt(v.x * v.x + v.y * v.y) +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic magnitude', (t) => { + t.equal( + vec2.magnitude({ x: 0, y: 0 }), + 0, + 'zero vector' + ) + + t.almostEqual( + vec2.magnitude({ x: 3, y: 4 }), + 5, + 'simple magnitude' + ) + + t.end() + }) } From 90c2d98e09323eb1100336ea30e1cb2fadb92e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:25:36 +0300 Subject: [PATCH 06/26] test vec2 equal invert --- test/vec2/equal.test.js | 36 +++++++++++++++++++++++------------- test/vec2/index.test.js | 4 ++-- test/vec2/inverse.test.js | 24 +++++++++++++++++++----- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/test/vec2/equal.test.js b/test/vec2/equal.test.js index 1cc59749..986f7606 100644 --- a/test/vec2/equal.test.js +++ b/test/vec2/equal.test.js @@ -1,14 +1,24 @@ -module.exports = (p, q) => { - // Test if points p,q equal - // - // Parameters - // p - // a point - // q - // a point - // - // Return - // boolean - // - return p.x === q.x && p.y === q.y +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: zeroes and ones', (t) => { + t.ok( + vec2.equal( + { x: 0, y: 0 }, + { x: 0, y: 0 } + ), + 'zero vectors equal' + ) + + t.notOk( + vec2.equal( + { x: 1, y: 1 }, + { x: 2, y: 1 } + ), + 'vectors different' + ) + + t.end() + }) } diff --git a/test/vec2/index.test.js b/test/vec2/index.test.js index 6158411d..be07a62e 100644 --- a/test/vec2/index.test.js +++ b/test/vec2/index.test.js @@ -8,9 +8,9 @@ const units = { cross: require('./cross.test'), difference: require('./difference.test'), dot: require('./dot.test'), - // equal: require('./equal.test'), + equal: require('./equal.test'), // fromPolar: require('./fromPolar.test'), - // inverse: require('./inverse.test'), + inverse: require('./inverse.test'), magnitude: require('./magnitude.test'), // max: require('./max.test'), // min: require('./min.test'), diff --git a/test/vec2/inverse.test.js b/test/vec2/inverse.test.js index bfd721a9..605e0a14 100644 --- a/test/vec2/inverse.test.js +++ b/test/vec2/inverse.test.js @@ -1,6 +1,20 @@ -module.exports = (v) => { - return { - x: -v.x, - y: -v.y - } +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: vector negation', (t) => { + t.almostEqual( + vec2.invert({ x: 0, y: 0 }), + { x: 0, y: 0 }, + 'invert zero vector' + ) + + t.almostEqual( + vec2.negate({ x: 1, y: -1 }), + { x: -1, y: 1 }, + 'negate ones' + ) + + t.end() + }) } From 0ed7f9a4d09bca4085c56a5e47b4a343f02fc815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:25:44 +0300 Subject: [PATCH 07/26] add missing equal require --- lib/vec2/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/vec2/index.js b/lib/vec2/index.js index 013f1ad2..c2975a91 100644 --- a/lib/vec2/index.js +++ b/lib/vec2/index.js @@ -23,6 +23,8 @@ exports.difference = require('./difference') exports.dot = require('./dot') +exports.equal = require('./equal') + exports.fromArray = require('./fromArray') exports.fromPolar = require('./fromPolar') From 146d203395eaa7125b7f80f14f86e4f19bd6a7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:39:46 +0300 Subject: [PATCH 08/26] test vec2 fromPolar max min --- test/vec2/fromPolar.test.js | 33 +++++++++++++++++++-------------- test/vec2/index.test.js | 6 +++--- test/vec2/max.test.js | 31 +++++++++++++++++++++++++------ test/vec2/min.test.js | 31 +++++++++++++++++++++++++------ 4 files changed, 72 insertions(+), 29 deletions(-) diff --git a/test/vec2/fromPolar.test.js b/test/vec2/fromPolar.test.js index ac472d4d..14790735 100644 --- a/test/vec2/fromPolar.test.js +++ b/test/vec2/fromPolar.test.js @@ -1,15 +1,20 @@ -module.exports = (magnitude, direction) => { - // Parameters - // magnitude - // number - // direction - // number, angle in radians - // - // Return - // a vector - // - return { - x: magnitude * Math.cos(direction), - y: magnitude * Math.sin(direction) - } +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic fromPolar', (t) => { + t.almostEqual( + vec2.fromPolar(2, 0), + { x: 2, y: 0 }, + 'zero angle' + ) + + t.almostEqual( + vec2.fromPolar(2, Math.PI / 2), + { x: 0, y: 2 }, + 'angle of +90deg' + ) + + t.end() + }) } diff --git a/test/vec2/index.test.js b/test/vec2/index.test.js index be07a62e..c6666f99 100644 --- a/test/vec2/index.test.js +++ b/test/vec2/index.test.js @@ -9,11 +9,11 @@ const units = { difference: require('./difference.test'), dot: require('./dot.test'), equal: require('./equal.test'), - // fromPolar: require('./fromPolar.test'), + fromPolar: require('./fromPolar.test'), inverse: require('./inverse.test'), magnitude: require('./magnitude.test'), - // max: require('./max.test'), - // min: require('./min.test'), + max: require('./max.test'), + min: require('./min.test'), projectTo: require('./projectTo.test'), rotateBy: require('./rotateBy.test'), rotateTo: require('./rotateTo.test'), diff --git a/test/vec2/max.test.js b/test/vec2/max.test.js index d4c845f9..df69483e 100644 --- a/test/vec2/max.test.js +++ b/test/vec2/max.test.js @@ -1,7 +1,26 @@ -module.exports = (v, w) => { - // Element-wise maximum of two vectors - return { - x: Math.max(v.x, w.x), - y: Math.max(v.y, w.y) - } +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic elem-wise max', (t) => { + t.almostEqual( + vec2.max( + { x: 2, y: 0 }, + { x: -3, y: -1 } + ), + { x: 2, y: 0 }, + 'absolute magnitude should not matter' + ) + + t.almostEqual( + vec2.max( + { x: 2, y: -2 }, + { x: -2, y: 2 } + ), + { x: 2, y: 2 }, + 'mixed' + ) + + t.end() + }) } diff --git a/test/vec2/min.test.js b/test/vec2/min.test.js index a99ac19a..0b92f4ac 100644 --- a/test/vec2/min.test.js +++ b/test/vec2/min.test.js @@ -1,7 +1,26 @@ -module.exports = (v, w) => { - // Element-wise minimum of two vectors - return { - x: Math.min(v.x, w.x), - y: Math.min(v.y, w.y) - } +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic elem-wise min', (t) => { + t.almostEqual( + vec2.min( + { x: 4, y: 2 }, + { x: -3, y: -1 } + ), + { x: -3, y: -1 }, + 'absolute magnitude should not matter' + ) + + t.almostEqual( + vec2.min( + { x: 2, y: -2 }, + { x: -2, y: 2 } + ), + { x: -2, y: -2 }, + 'mixed' + ) + + t.end() + }) } From c0bbdcaf0a168faafd36744ec5d4ffcc488b21ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Mon, 5 Sep 2022 14:41:32 +0300 Subject: [PATCH 09/26] test vec3 equal --- test/vec3/equal.test.js | 24 ++++++++++++++++++++++++ test/vec3/index.test.js | 1 + 2 files changed, 25 insertions(+) create mode 100644 test/vec3/equal.test.js diff --git a/test/vec3/equal.test.js b/test/vec3/equal.test.js new file mode 100644 index 00000000..64c5340a --- /dev/null +++ b/test/vec3/equal.test.js @@ -0,0 +1,24 @@ +const affineplane = require('../../index') +const vec3 = affineplane.vec3 + +module.exports = (ts) => { + ts.test('case: zeroes and ones', (t) => { + t.ok( + vec3.equal( + { x: 0, y: 0, z: 0 }, + { x: 0, y: 0, z: 0 } + ), + 'zero vectors equal' + ) + + t.notOk( + vec3.equal( + { x: 1, y: 1, z: 1 }, + { x: 1, y: 1, z: 2 } + ), + 'vectors different' + ) + + t.end() + }) +} diff --git a/test/vec3/index.test.js b/test/vec3/index.test.js index e2734908..e4313bc7 100644 --- a/test/vec3/index.test.js +++ b/test/vec3/index.test.js @@ -2,6 +2,7 @@ const units = { cross: require('./cross.test'), dot: require('./dot.test'), + equal: require('./equal.test'), fromPolar: require('./fromPolar.test'), fromSpherical: require('./fromSpherical.test'), invert: require('./invert.test'), From 40691984cad1506f3cd5e0149bb5f1cb95ce728a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:06:57 +0300 Subject: [PATCH 10/26] improve vector docs --- README.md | 2 +- lib/vec2/dot.js | 3 ++- lib/vec2/scaleBy.js | 1 + lib/vec3/dot.js | 3 ++- lib/vec3/scaleBy.js | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 75f5271e..26f51af6 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ The functions are grouped in *namespaces*, each focusing on a certain geometry. ## Coordinate systems and directions -Affineplane uses right-handed coordinate system where the axes are perpendicular to each other. All rotations happen around z-axis and the rotation angle grows from the positive x-axis towards positive y-axis. Because affineplane is primarily intented for web applications, it is customary that, under zero rotation, the x-axis grows right, y-axis grows down, and z-axis grows away from the viewer, as illustrated below. +Affineplane uses right-handed, orthonormal coordinate system. Due to orthonormality the axes are perpendicular to each other. All rotations happen around z-axis and the rotation angle grows from the positive x-axis towards positive y-axis. Because affineplane is primarily intented for web applications, it is customary that, under zero rotation, the x-axis grows right, y-axis grows down, and z-axis grows away from the viewer, as illustrated below. ![Right-handed coordinate system](docs/coordinates-directions-3d.png) diff --git a/lib/vec2/dot.js b/lib/vec2/dot.js index a641ec05..6f9a5923 100644 --- a/lib/vec2/dot.js +++ b/lib/vec2/dot.js @@ -1,7 +1,8 @@ module.exports = (v, w) => { // affineplane.vec2.dot(v, w) // - // Dot product of two vectors. + // The dot product of two vectors, + // also called the scalar product. // // Parameters: // v diff --git a/lib/vec2/scaleBy.js b/lib/vec2/scaleBy.js index ddb2398b..8cc46edf 100644 --- a/lib/vec2/scaleBy.js +++ b/lib/vec2/scaleBy.js @@ -1,6 +1,7 @@ module.exports = (vec, multiplier) => { // affineplane.vec2.scaleBy(vec, multiplier) // + // The scalar multiplication of a vector. // Scale the vector by a multiplier. // The direction of the vector does not change. // diff --git a/lib/vec3/dot.js b/lib/vec3/dot.js index db4669b1..d86d21f3 100644 --- a/lib/vec3/dot.js +++ b/lib/vec3/dot.js @@ -1,7 +1,8 @@ module.exports = (v, w) => { // affineplane.vec3.dot(v, w) // - // Dot product of two vectors. + // Dot product of two vectors, + // also called the scalar product. // // Parameters: // v diff --git a/lib/vec3/scaleBy.js b/lib/vec3/scaleBy.js index d302e719..0872a7a8 100644 --- a/lib/vec3/scaleBy.js +++ b/lib/vec3/scaleBy.js @@ -1,6 +1,7 @@ module.exports = (vec, multiplier) => { // affineplane.vec3.scaleBy(vec, multiplier) // + // The scalar multiplication of a vector. // Scale the vector by a multiplier. // The direction of the vector does not change. // From ddbc445de7f7ddbf14d73889279bb7e59ef3350a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:08:42 +0300 Subject: [PATCH 11/26] reserve new geometry: ray3 --- lib/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/index.js b/lib/index.js index 5a9588ae..5cd16d89 100644 --- a/lib/index.js +++ b/lib/index.js @@ -32,6 +32,9 @@ exports.plane3 = require('./plane3') exports.point2 = require('./point2') exports.point3 = require('./point3') +// TODO Ray. A line but into one direction only. +// exports.ray3 = require('./ray3') + // TODO Rectangle on a two-dimensional plane. // exports.rect2 = require('./rect2') From 788253b81d4588bad5be11c58a6d3fa5fc84b215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:18:03 +0300 Subject: [PATCH 12/26] impl plane3.getNormal --- lib/plane3/getNormal.js | 16 ++++++++++++++++ lib/plane3/index.js | 1 + test/plane3/getNormal.test.js | 13 +++++++++++++ test/plane3/index.test.js | 1 + 4 files changed, 31 insertions(+) create mode 100644 lib/plane3/getNormal.js create mode 100644 test/plane3/getNormal.test.js diff --git a/lib/plane3/getNormal.js b/lib/plane3/getNormal.js new file mode 100644 index 00000000..3986c9a5 --- /dev/null +++ b/lib/plane3/getNormal.js @@ -0,0 +1,16 @@ +// affineplane.plane3.getNormal(plane) +// +// Get a unit vector perpendicular to the plane. +// +// Parameters: +// plane +// a plane3 on the reference plane +// +// Return: +// a vec3, the plane normal vector. +// +module.exports = function (plane) { + // Because all planes are on xy, there is one + // normal vector shared by all the planes. + return { x: 0, y: 0, z: 1 } +} diff --git a/lib/plane3/index.js b/lib/plane3/index.js index 514c8578..3c212f79 100644 --- a/lib/plane3/index.js +++ b/lib/plane3/index.js @@ -34,6 +34,7 @@ exports.create = require('./create') exports.difference = exports.between exports.equal = require('./equal') exports.fromFeatures = require('./fromFeatures') +exports.getNormal = require('./getNormal') exports.getScale = require('./getScale') exports.inverse = require('./invert') exports.invert = exports.inverse diff --git a/test/plane3/getNormal.test.js b/test/plane3/getNormal.test.js new file mode 100644 index 00000000..fb894a11 --- /dev/null +++ b/test/plane3/getNormal.test.js @@ -0,0 +1,13 @@ +const plane3 = require('../../lib/plane3') + +module.exports = (ts) => { + ts.test('case: basic normal', (t) => { + t.almostEqual( + plane3.getNormal({}), + { x: 0, y: 0, z: 1 }, + 'any input goes' + ) + + t.end() + }) +} diff --git a/test/plane3/index.test.js b/test/plane3/index.test.js index 986b28fc..f8aaccec 100644 --- a/test/plane3/index.test.js +++ b/test/plane3/index.test.js @@ -5,6 +5,7 @@ const units = { create: require('./create.test'), difference: require('./difference.test'), fromFeatures: require('./fromFeatures.test'), + getNormal: require('./getNormal.test'), getScale: require('./getScale.test'), invert: require('./invert.test'), projectTo: require('./projectTo.test'), From c89e5abf3c5a7d0e1dc1db5fcd829bcdbceb489a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:32:11 +0300 Subject: [PATCH 13/26] alias vec2 vec3 .unit with .normalize --- lib/vec2/index.js | 4 +++- lib/vec2/unit.js | 1 + lib/vec3/index.js | 3 ++- lib/vec3/unit.js | 1 + test/vec2/unit.test.js | 2 +- test/vec3/unit.test.js | 2 +- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/vec2/index.js b/lib/vec2/index.js index c2975a91..d5d1deff 100644 --- a/lib/vec2/index.js +++ b/lib/vec2/index.js @@ -45,6 +45,8 @@ exports.negate = exports.inverse exports.norm = exports.magnitude +exports.normalize = require('./unit') + exports.opposite = exports.negation // exports.polarAverage @@ -67,6 +69,6 @@ exports.toPolar = require('./toPolar') exports.transitFrom = require('./transitFrom') exports.transitTo = require('./transitTo') -exports.unit = require('./unit') +exports.unit = exports.normalize exports.validate = require('./validate') diff --git a/lib/vec2/unit.js b/lib/vec2/unit.js index 1735bc9e..affad556 100644 --- a/lib/vec2/unit.js +++ b/lib/vec2/unit.js @@ -2,6 +2,7 @@ const magnitude = require('./magnitude') module.exports = (v) => { // affineplane.vec2.unit(v) + // affineplane.vec2.normalize // // Get unit vector parallel to the given vector. // The magnitude of unit vector is equal to one. diff --git a/lib/vec3/index.js b/lib/vec3/index.js index fa9dccb2..e62478c2 100644 --- a/lib/vec3/index.js +++ b/lib/vec3/index.js @@ -20,6 +20,7 @@ exports.invert = require('./invert') exports.inverse = exports.invert exports.magnitude = require('./magnitude') exports.negate = exports.invert +exports.normalize = require('./unit') exports.projectTo = require('./projectTo') exports.rotateBy = require('./rotateBy') exports.rotateTo = require('./rotateTo') @@ -31,5 +32,5 @@ exports.toPolar = require('./toPolar') exports.toSpherical = require('./toSpherical') exports.transitFrom = require('./transitFrom') exports.transitTo = require('./transitTo') -exports.unit = require('./unit') +exports.unit = exports.normalize exports.validate = require('./validate') diff --git a/lib/vec3/unit.js b/lib/vec3/unit.js index a8f412b8..9d13196b 100644 --- a/lib/vec3/unit.js +++ b/lib/vec3/unit.js @@ -2,6 +2,7 @@ const magnitude = require('./magnitude') module.exports = (v) => { // affineplane.vec3.unit(v) + // affineplane.vec3.normalize // // Get unit vector parallel to the given vector. // The magnitude of unit vector is equal to one. diff --git a/test/vec2/unit.test.js b/test/vec2/unit.test.js index 6502188a..b25b334f 100644 --- a/test/vec2/unit.test.js +++ b/test/vec2/unit.test.js @@ -10,7 +10,7 @@ module.exports = (ts) => { ) t.almostEqual( - vec2.unit({ x: 3, y: 4 }), // orig.len. 5 + vec2.normalize({ x: 3, y: 4 }), // orig.len. 5 { x: 3 / 5, y: 4 / 5 }, 'direction does not change' ) diff --git a/test/vec3/unit.test.js b/test/vec3/unit.test.js index 5f8f2fab..1431352f 100644 --- a/test/vec3/unit.test.js +++ b/test/vec3/unit.test.js @@ -10,7 +10,7 @@ module.exports = (ts) => { ) t.almostEqual( - vec3.unit({ x: 3, y: 4, z: 12 }), // orig.len. 13 + vec3.normalize({ x: 3, y: 4, z: 12 }), // orig.len. 13 { x: 3 / 13, y: 4 / 13, z: 12 / 13 }, 'direction does not change' ) From 1a2c346029de1de3e473039a4514dc1079d5d25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:32:30 +0300 Subject: [PATCH 14/26] alias vec3.magnitude .norm --- lib/vec2/scaleTo.js | 2 +- lib/vec3/index.js | 1 + test/vec3/magnitude.test.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/vec2/scaleTo.js b/lib/vec2/scaleTo.js index 69b9f604..04c66319 100644 --- a/lib/vec2/scaleTo.js +++ b/lib/vec2/scaleTo.js @@ -11,7 +11,7 @@ module.exports = (vec, magnitude) => { // vec // a vec2, non-zero vector. // magnitude - // a number, the target vector length + // a number, the target vector length. // // Return // a vec2 diff --git a/lib/vec3/index.js b/lib/vec3/index.js index e62478c2..ac8c1dd0 100644 --- a/lib/vec3/index.js +++ b/lib/vec3/index.js @@ -20,6 +20,7 @@ exports.invert = require('./invert') exports.inverse = exports.invert exports.magnitude = require('./magnitude') exports.negate = exports.invert +exports.norm = exports.magnitude exports.normalize = require('./unit') exports.projectTo = require('./projectTo') exports.rotateBy = require('./rotateBy') diff --git a/test/vec3/magnitude.test.js b/test/vec3/magnitude.test.js index 5bedf55e..6bd4c03e 100644 --- a/test/vec3/magnitude.test.js +++ b/test/vec3/magnitude.test.js @@ -3,7 +3,7 @@ const vec3 = require('../../lib/vec3') module.exports = (ts) => { ts.test('case: basic magnitude', (t) => { t.equal(vec3.magnitude({ x: 3, y: 4, z: 12 }), 13) - t.equal(vec3.magnitude({ x: 3, y: 4, z: 0 }), 5) + t.equal(vec3.norm({ x: 3, y: 4, z: 0 }), 5) t.end() }) } From 632d93ebd7f7783bff7ce69d7eb28d8686d8ef52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Akseli=20Pal=C3=A9n?= Date: Fri, 9 Sep 2022 19:41:34 +0300 Subject: [PATCH 15/26] improve type safety docs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26f51af6..2f926549 100644 --- a/README.md +++ b/README.md @@ -127,11 +127,11 @@ Vectors and other movements can only be projected orthogonally. This is because ## Type safety -Affineplane is very loose on types and requires you to ensure you feed the functions what they minimally expect. This has a benefit: you can input objects that have extra properties. For example `{ color: 'ff00ff', x: 2, y: 3 }` is a valid affineplane [point2](https://axelpale.github.io/affineplane/docs/API.html#affineplanepoint2). Note that while all affineplane operations return new objects, the extra properties are not carried to them. +Affineplane is very loose on types and requires you to ensure you feed the functions what they minimally expect. This has two benefits: the functions are fast and you can input objects that have extra properties. For example `{ color: 'ff00ff', x: 2, y: 3 }` is a valid affineplane [point2](https://axelpale.github.io/affineplane/docs/API.html#affineplanepoint2). Note that while all affineplane operations return new objects, the extra properties are not carried to them. To check validity of an object, each geometry type has `validate` function, for example [point2.validate](https://axelpale.github.io/affineplane/docs/API.html#affineplanepoint2validate). We could have included validity checking into each function but that would have caused excess of checking for this kind of low-level math functions. Instead, use `validate` when you need it. -We might have TypeScript bindings in the future. +To avoid unefficient type checking, optional parameters and default values are used sparsingly. Keep this in mind especially when making contributions. ## Contribute From 2f80ee277d51e7a6bf372d5b3fd71e76d9c0cb17 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 17:26:44 +0300 Subject: [PATCH 16/26] upgrade to yamdog 1.4.0 --- docs/API.md | 1244 ++++++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 651 insertions(+), 595 deletions(-) diff --git a/docs/API.md b/docs/API.md index 682a6a7b..35adecc7 100644 --- a/docs/API.md +++ b/docs/API.md @@ -5,7 +5,7 @@ Welcome to affineplane API reference documentation. See also [Usage](https://axe -## affineplane +## [affineplane](#affineplane) The [affineplane](#affineplane) module provides functions for affine 2D geometry. The functions are grouped in the following submodules. @@ -34,7 +34,7 @@ The functions are grouped in the following submodules. Source: [lib/index.js](https://github.com/axelpale/affineplane/blob/main/lib/index.js) -## affineplane.dir2 +## [affineplane](#affineplane).[dir2](#affineplanedir2) Number in ]-π, π] @@ -46,14 +46,14 @@ When a direction is transited between planes, only the rotation of the coordinate space affects the direction. - [affineplane.dir2.create](#affineplanedir2create) -- [affineplane.dir2.transitFrom](#affineplanedir2transitFrom) -- [affineplane.dir2.transitTo](#affineplanedir2transitTo) +- [affineplane.dir2.transitFrom](#affineplanedir2transitfrom) +- [affineplane.dir2.transitTo](#affineplanedir2transitto) Source: [dir2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/dir2/index.js) -## affineplane.dir2.create(r) +## [affineplane](#affineplane).[dir2](#affineplanedir2).[create](#affineplanedir2create)(r) Create a new direction. Angles outside ]-π,π] are mapped within the limits with modulus operators. @@ -67,8 +67,8 @@ within the limits with modulus operators. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/dir2/create.js) - -## affineplane.dir2.transitFrom(dir, source) + +## [affineplane](#affineplane).[dir2](#affineplanedir2).[transitFrom](#affineplanedir2transitfrom)(dir, source) Transit a direction angle from the source plane to the reference plane. @@ -84,8 +84,8 @@ to the reference plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/dir2/transitFrom.js) - -## affineplane.dir2.transitTo(dir, target) + +## [affineplane](#affineplane).[dir2](#affineplanedir2).[transitTo](#affineplanedir2transitto)(dir, target) Transit a dir2 to a target plane. In other words, represent the direction @@ -103,7 +103,7 @@ in the coordinate system of the target plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/dir2/transitTo.js) -## affineplane.dist2 +## [affineplane](#affineplane).[dist2](#affineplanedist2) The distance measure is a directionless, always positive number. If transited between planes, only a change in the coordinate scale @@ -111,14 +111,14 @@ affects the distance. Rotation or translation of the plane does not change the distance measure. - [affineplane.dist2.create](#affineplanedist2create) -- [affineplane.dist2.transitFrom](#affineplanedist2transitFrom) -- [affineplane.dist2.transitTo](#affineplanedist2transitTo) +- [affineplane.dist2.transitFrom](#affineplanedist2transitfrom) +- [affineplane.dist2.transitTo](#affineplanedist2transitto) Source: [dist2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/dist2/index.js) -## affineplane.dist2.create(d) +## [affineplane](#affineplane).[dist2](#affineplanedist2).[create](#affineplanedist2create)(d) Create a measure. Basically it is just the absolute value of the number. @@ -131,8 +131,8 @@ Create a measure. Basically it is just the absolute value of the number. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/dist2/create.js) - -## affineplane.dist2.transitFrom(dist, source) + +## [affineplane](#affineplane).[dist2](#affineplanedist2).[transitFrom](#affineplanedist2transitfrom)(dist, source) Transit a distance from the source plane to the reference plane. @@ -148,8 +148,8 @@ to the reference plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/dist2/transitFrom.js) - -## affineplane.dist2.transitTo(dist, target) + +## [affineplane](#affineplane).[dist2](#affineplanedist2).[transitTo](#affineplanedist2transitto)(dist, target) Transit a dist2 to a target plane. In other words, represent the distance @@ -167,7 +167,7 @@ in the coordinate system of the plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/dist2/transitTo.js) -## affineplane.epsilon +## [affineplane](#affineplane).[epsilon](#affineplaneepsilon) Default margin for non-strict numeric equality. For example `0.0000000001`. @@ -175,7 +175,7 @@ For example `0.0000000001`. Source: [epsilon.js](https://github.com/axelpale/affineplane/blob/main/lib/epsilon.js) -## affineplane.helm2 +## [affineplane](#affineplane).[helm2](#affineplanehelm2) Provides functions for a special kind of 2D transformation matrices, *two-dimensional Helmert transformations*. @@ -190,10 +190,10 @@ Therefore it has no single position in space, and is not affected by plane translations. See [affineplane.plane2](#affineplaneplane2) for a positional variant. -- [affineplane.helm2.addDilation](#affineplanehelm2addDilation) -- [affineplane.helm2.addRotation](#affineplanehelm2addRotation) -- [affineplane.helm2.almostEqual](#affineplanehelm2almostEqual) -- [affineplane.helm2.almostEquals](#affineplanehelm2almostEquals) +- [affineplane.helm2.addDilation](#affineplanehelm2adddilation) +- [affineplane.helm2.addRotation](#affineplanehelm2addrotation) +- [affineplane.helm2.almostEqual](#affineplanehelm2almostequal) +- [affineplane.helm2.almostEquals](#affineplanehelm2almostequals) - [affineplane.helm2.clone](#affineplanehelm2clone) - [affineplane.helm2.combine](#affineplanehelm2combine) - [affineplane.helm2.compose](#affineplanehelm2compose) @@ -203,49 +203,49 @@ See [affineplane.plane2](#affineplaneplane2) for a positional variant. - [affineplane.helm2.determinant](#affineplanehelm2determinant) - [affineplane.helm2.equal](#affineplanehelm2equal) - [affineplane.helm2.equals](#affineplanehelm2equals) -- [affineplane.helm2.fromArray](#affineplanehelm2fromArray) -- [affineplane.helm2.fromFeatures](#affineplanehelm2fromFeatures) -- [affineplane.helm2.fromPolar](#affineplanehelm2fromPolar) -- [affineplane.helm2.getDilation](#affineplanehelm2getDilation) -- [affineplane.helm2.getRotation](#affineplanehelm2getRotation) -- [affineplane.helm2.getScale](#affineplanehelm2getScale) -- [affineplane.helm2.getTranslation](#affineplanehelm2getTranslation) -- [affineplane.helm2.HALF](#affineplanehelm2HALF) -- [affineplane.helm2.I](#affineplanehelm2I) -- [affineplane.helm2.IDENTITY](#affineplanehelm2IDENTITY) +- [affineplane.helm2.fromArray](#affineplanehelm2fromarray) +- [affineplane.helm2.fromFeatures](#affineplanehelm2fromfeatures) +- [affineplane.helm2.fromPolar](#affineplanehelm2frompolar) +- [affineplane.helm2.getDilation](#affineplanehelm2getdilation) +- [affineplane.helm2.getRotation](#affineplanehelm2getrotation) +- [affineplane.helm2.getScale](#affineplanehelm2getscale) +- [affineplane.helm2.getTranslation](#affineplanehelm2gettranslation) +- [affineplane.helm2.HALF](#affineplanehelm2half) +- [affineplane.helm2.I](#affineplanehelm2i) +- [affineplane.helm2.IDENTITY](#affineplanehelm2identity) - [affineplane.helm2.inverse](#affineplanehelm2inverse) - [affineplane.helm2.invert](#affineplanehelm2invert) - [affineplane.helm2.multiply](#affineplanehelm2multiply) -- [affineplane.helm2.projectTo](#affineplanehelm2projectTo) -- [affineplane.helm2.ROT0](#affineplanehelm2ROT0) -- [affineplane.helm2.ROT180](#affineplanehelm2ROT180) -- [affineplane.helm2.ROT270](#affineplanehelm2ROT270) -- [affineplane.helm2.ROT45](#affineplanehelm2ROT45) -- [affineplane.helm2.ROT90](#affineplanehelm2ROT90) -- [affineplane.helm2.rotateBy](#affineplanehelm2rotateBy) -- [affineplane.helm2.scaleBy](#affineplanehelm2scaleBy) -- [affineplane.helm2.setDilation](#affineplanehelm2setDilation) -- [affineplane.helm2.setRotation](#affineplanehelm2setRotation) -- [affineplane.helm2.setTranslation](#affineplanehelm2setTranslation) -- [affineplane.helm2.setTranslation](#affineplanehelm2setTranslation) -- [affineplane.helm2.SINGULAR](#affineplanehelm2SINGULAR) -- [affineplane.helm2.snapRotation](#affineplanehelm2snapRotation) -- [affineplane.helm2.solveLeft](#affineplanehelm2solveLeft) -- [affineplane.helm2.solveRight](#affineplanehelm2solveRight) -- [affineplane.helm2.toArray](#affineplanehelm2toArray) -- [affineplane.helm2.toMatrix](#affineplanehelm2toMatrix) -- [affineplane.helm2.toString](#affineplanehelm2toString) +- [affineplane.helm2.projectTo](#affineplanehelm2projectto) +- [affineplane.helm2.ROT0](#affineplanehelm2rot0) +- [affineplane.helm2.ROT180](#affineplanehelm2rot180) +- [affineplane.helm2.ROT270](#affineplanehelm2rot270) +- [affineplane.helm2.ROT45](#affineplanehelm2rot45) +- [affineplane.helm2.ROT90](#affineplanehelm2rot90) +- [affineplane.helm2.rotateBy](#affineplanehelm2rotateby) +- [affineplane.helm2.scaleBy](#affineplanehelm2scaleby) +- [affineplane.helm2.setDilation](#affineplanehelm2setdilation) +- [affineplane.helm2.setRotation](#affineplanehelm2setrotation) +- [affineplane.helm2.setTranslation](#affineplanehelm2settranslation) +- [affineplane.helm2.setTranslation](#affineplanehelm2settranslation) +- [affineplane.helm2.SINGULAR](#affineplanehelm2singular) +- [affineplane.helm2.snapRotation](#affineplanehelm2snaprotation) +- [affineplane.helm2.solveLeft](#affineplanehelm2solveleft) +- [affineplane.helm2.solveRight](#affineplanehelm2solveright) +- [affineplane.helm2.toArray](#affineplanehelm2toarray) +- [affineplane.helm2.toMatrix](#affineplanehelm2tomatrix) +- [affineplane.helm2.toString](#affineplanehelm2tostring) - [affineplane.helm2.transform](#affineplanehelm2transform) -- [affineplane.helm2.transitFrom](#affineplanehelm2transitFrom) -- [affineplane.helm2.UNIT](#affineplanehelm2UNIT) +- [affineplane.helm2.transitFrom](#affineplanehelm2transitfrom) +- [affineplane.helm2.UNIT](#affineplanehelm2unit) - [affineplane.helm2.validate](#affineplanehelm2validate) -- [affineplane.helm2.X2](#affineplanehelm2X2) +- [affineplane.helm2.X2](#affineplanehelm2x2) Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.addDilation(tr, delta) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[addDilation](#affineplanehelm2adddilation)(tr, delta) Increase the scale multiplier of the transformation by addition. The rotation and translation properties are preserved. @@ -261,8 +261,8 @@ The rotation and translation properties are preserved. Source: [addDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/addDilation.js) - -## affineplane.helm2.addRotation(tr, angle) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[addRotation](#affineplanehelm2addrotation)(tr, angle) Increase rotation angle of the transformation by angle. The dilation and translation properties are preserved. @@ -278,8 +278,8 @@ The dilation and translation properties are preserved. Source: [addRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/addRotation.js) - -## affineplane.helm2.almostEqual(tr, ts, [epsilon]) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[almostEqual](#affineplanehelm2almostequal)(tr, ts, [epsilon]) Are two transforms almost equal? Return true if a matrix norm of the difference is smaller than epsilon. We use modified @@ -297,33 +297,33 @@ Manhattan Distance to compute the difference. **Returns:** - a boolean -Aliases: [affineplane.helm2.almostEquals](#affineplanehelm2almostEquals) +Aliases: [affineplane.helm2.almostEquals](#affineplanehelm2almostequals) Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/almostEqual.js) - -## affineplane.helm2.almostEquals + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[almostEquals](#affineplanehelm2almostequals) -Alias of [affineplane.helm2.almostEqual](#affineplanehelm2almostEqual) +Alias of [affineplane.helm2.almostEqual](#affineplanehelm2almostequal) Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/almostEqual.js) -## affineplane.helm2.clone +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[clone](#affineplanehelm2clone) Alias of [affineplane.helm2.copy](#affineplanehelm2copy) Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/copy.js) -## affineplane.helm2.combine +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[combine](#affineplanehelm2combine) Alias of [affineplane.helm2.compose](#affineplanehelm2compose), [affineplane.helm2.multiply](#affineplanehelm2multiply) Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/compose.js) -## affineplane.helm2.compose(tr, ts) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[compose](#affineplanehelm2compose)(tr, ts) Multiply transformation matrix tr from the right with the given transformation matrix ts. @@ -343,7 +343,7 @@ Aliases: [affineplane.helm2.combine](#affineplanehelm2combine), [affineplane.hel Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/compose.js) -## affineplane.helm2.copy(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[copy](#affineplanehelm2copy)(tr) **Parameters:** - *tr* @@ -357,7 +357,7 @@ Aliases: [affineplane.helm2.clone](#affineplanehelm2clone) Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/copy.js) -## affineplane.helm2.create(a, b, x, y) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[create](#affineplanehelm2create)(a, b, x, y) Create a 2D non-reflective similarity transform object. @@ -377,7 +377,7 @@ Create a 2D non-reflective similarity transform object. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/create.js) -## affineplane.helm2.det(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[det](#affineplanehelm2det)(tr) The matrix determinant of the transformation. If the determinant equals zero then the matrix cannot be inverted and thus is not a valid @@ -396,19 +396,19 @@ Aliases: [affineplane.helm2.determinant](#affineplanehelm2determinant) Source: [det.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/det.js) -## affineplane.helm2.determinant(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[determinant](#affineplanehelm2determinant)(tr) Alias of [affineplane.helm2.det](#affineplanehelm2det) Source: [det.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/det.js) -## affineplane.helm2.equal(tr, ts) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[equal](#affineplanehelm2equal)(tr, ts) Are transforms exactly equal? Note that due to floating-point arithmetics, computation might cause exact equality to be broken. -See [affineplane.helm2.almostEqual](#affineplanehelm2almostEqual) for relaxed alternative. +See [affineplane.helm2.almostEqual](#affineplanehelm2almostequal) for relaxed alternative. **Parameters:** - *tr* @@ -424,14 +424,14 @@ Aliases: [affineplane.helm2.equals](#affineplanehelm2equals) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/equal.js) -## affineplane.helm2.equals +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[equals](#affineplanehelm2equals) Alias of [affineplane.helm2.equal](#affineplanehelm2equal) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/equal.js) - -## affineplane.helm2.fromArray(abxy) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[fromArray](#affineplanehelm2fromarray)(abxy) Create an affine similarity transform from 4-element array. @@ -444,8 +444,8 @@ Create an affine similarity transform from 4-element array. Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/fromArray.js) - -## affineplane.helm2.fromFeatures(feats) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[fromFeatures](#affineplanehelm2fromfeatures)(feats) Create a [helm2](#affineplanehelm2) transformation from human-readable features. @@ -464,8 +464,8 @@ Create a [helm2](#affineplanehelm2) transformation from human-readable features. Source: [fromFeatures.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/fromFeatures.js) - -## affineplane.helm2.fromPolar(scale, rotation, tx, ty) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[fromPolar](#affineplanehelm2frompolar)(scale, rotation, tx, ty) Create a transform object by using scale magnitude, rotation angle, and translation. @@ -488,8 +488,8 @@ Precondition: Source: [fromPolar.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/fromPolar.js) - -## affineplane.helm2.getDilation(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[getDilation](#affineplanehelm2getdilation)(tr) Get the dilation component of the transformation. @@ -500,12 +500,12 @@ Get the dilation component of the transformation. **Returns:** - a number, the scale multiplier. -Aliases: [affineplane.helm2.getScale](#affineplanehelm2getScale) +Aliases: [affineplane.helm2.getScale](#affineplanehelm2getscale) Source: [getDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/getDilation.js) - -## affineplane.helm2.getRotation(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[getRotation](#affineplanehelm2getrotation)(tr) Get the rotation component of the transform in radians. @@ -518,15 +518,15 @@ Get the rotation component of the transform in radians. Source: [getRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/getRotation.js) - -## affineplane.helm2.getScale + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[getScale](#affineplanehelm2getscale) -Alias of [affineplane.helm2.getDilation](#affineplanehelm2getDilation) +Alias of [affineplane.helm2.getDilation](#affineplanehelm2getdilation) Source: [getDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/getDilation.js) - -## affineplane.helm2.getTranslation(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[getTranslation](#affineplanehelm2gettranslation)(tr) Get translation component of the transformation as a vector. @@ -539,31 +539,31 @@ Get translation component of the transformation as a vector. Source: [getTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/getTranslation.js) - -## affineplane.helm2.HALF + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[HALF](#affineplanehelm2half) Scaling to half size. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.I + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[I](#affineplanehelm2i) Identity transform, a kind of multiplication by 1. -Aliases: [affineplane.helm2.IDENTITY](#affineplanehelm2IDENTITY) +Aliases: [affineplane.helm2.IDENTITY](#affineplanehelm2identity) Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.IDENTITY + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[IDENTITY](#affineplanehelm2identity) -Alias of [affineplane.helm2.I](#affineplanehelm2I) +Alias of [affineplane.helm2.I](#affineplanehelm2i) Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) -## affineplane.helm2.inverse(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[inverse](#affineplanehelm2inverse)(tr) Invert the transform. A transform from B to C becomes a transform from C to B. @@ -580,21 +580,21 @@ Aliases: [affineplane.helm2.invert](#affineplanehelm2invert) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/inverse.js) -## affineplane.helm2.invert(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[invert](#affineplanehelm2invert)(tr) Alias of [affineplane.helm2.inverse](#affineplanehelm2inverse) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/inverse.js) -## affineplane.helm2.multiply +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[multiply](#affineplanehelm2multiply) Alias of [affineplane.helm2.compose](#affineplanehelm2compose), [affineplane.helm2.combine](#affineplanehelm2combine) Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/compose.js) - -## affineplane.helm2.projectTo(tr, plane, camera) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[projectTo](#affineplanehelm2projectto)(tr, plane, camera) Project transformation onto a plane. If camera is given perspectively. @@ -612,43 +612,43 @@ If camera is given perspectively. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/projectTo.js) - -## affineplane.helm2.ROT0 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[ROT0](#affineplanehelm2rot0) Zero angle rotation. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.ROT180 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[ROT180](#affineplanehelm2rot180) Rotation of 180 degrees. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.ROT270 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[ROT270](#affineplanehelm2rot270) Clockwise rotation of 270 degrees. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.ROT45 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[ROT45](#affineplanehelm2rot45) Clockwise rotation of 45 degrees. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.ROT90 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[ROT90](#affineplanehelm2rot90) Clockwise rotation of 90 degrees. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.rotateBy(tr, radians) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[rotateBy](#affineplanehelm2rotateby)(tr, radians) Rotate image of the transform by the given radians. This changes the direction of the translation but @@ -665,8 +665,8 @@ preserves the scaling and rotating effects. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/rotateBy.js) - -## affineplane.helm2.scaleBy(tr, multiplier) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[scaleBy](#affineplanehelm2scaleby)(tr, multiplier) Scale image of the transform by the given multiplier. Dilation and translation are multiplied, @@ -683,8 +683,8 @@ rotation and translation direction are preserved. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/scaleBy.js) - -## affineplane.helm2.setDilation(tr, dilation) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[setDilation](#affineplanehelm2setdilation)(tr, dilation) Replace scaling of the transformation. The rotation and translation properties are preserved. @@ -700,8 +700,8 @@ The rotation and translation properties are preserved. Source: [setDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/setDilation.js) - -## affineplane.helm2.setRotation(tr, angle) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[setRotation](#affineplanehelm2setrotation)(tr, angle) Replace rotation angle of the transformation. The dilation and translation properties are preserved. @@ -717,8 +717,8 @@ The dilation and translation properties are preserved. Source: [setRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/setRotation.js) - -## affineplane.helm2.setTranslation(tr, vec) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[setTranslation](#affineplanehelm2settranslation)(tr, vec) Increase translation property of the transformation by a vector. The dilation and rotation properties are preserved. @@ -734,8 +734,8 @@ The dilation and rotation properties are preserved. Source: [addTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/addTranslation.js) - -## affineplane.helm2.setTranslation(tr, vec) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[setTranslation](#affineplanehelm2settranslation)(tr, vec) Replace translation property of the transformation. The dilation and rotation properties are preserved. @@ -751,8 +751,8 @@ The dilation and rotation properties are preserved. Source: [setTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/setTranslation.js) - -## affineplane.helm2.SINGULAR + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[SINGULAR](#affineplanehelm2singular) Singular transform, resembles multiplication by 0. Note that singular transformations are note valid affine transformations @@ -762,8 +762,8 @@ you cannot multiply 0 to produce the original 2. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) - -## affineplane.helm2.snapRotation(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[snapRotation](#affineplanehelm2snaprotation)(tr) Round the rotation property of the transformation to nearest orthogonal angle 0, 90, 180, and 270 deg. @@ -781,8 +781,8 @@ floating-point arithmetics. Source: [snapRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/snapRotation.js) - -## affineplane.helm2.solveLeft(tb, tc) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[solveLeft](#affineplanehelm2solveleft)(tb, tc) Given transforms B, C, find transform A, where AB = C. Given that B is invertible, then A = C * iB. @@ -798,8 +798,8 @@ Given that B is invertible, then A = C * iB. Source: [solveLeft.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/solveLeft.js) - -## affineplane.helm2.solveRight(ta, tc) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[solveRight](#affineplanehelm2solveright)(ta, tc) Given the transforms A and C, find the transform B, where A * B = C. Given that A is invertible, then B = iA * C. @@ -815,11 +815,11 @@ Given that A is invertible, then B = iA * C. Source: [solveRight.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/solveRight.js) - -## affineplane.helm2.toArray(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[toArray](#affineplanehelm2toarray)(tr) **Returns:** an array representation of the transformation. -Compatible with [affineplane.helm2.fromArray](#affineplanehelm2fromArray). +Compatible with [affineplane.helm2.fromArray](#affineplanehelm2fromarray). **Parameters:** - *tr* @@ -830,8 +830,8 @@ Compatible with [affineplane.helm2.fromArray](#affineplanehelm2fromArray). Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/toArray.js) - -## affineplane.helm2.toMatrix(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[toMatrix](#affineplanehelm2tomatrix)(tr) Get the similarity transformation matrix in the format common to other APIs, including: @@ -848,8 +848,8 @@ in the format common to other APIs, including: Source: [toMatrix.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/toMatrix.js) - -## affineplane.helm2.toString(tr) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[toString](#affineplanehelm2tostring)(tr) Convert the transformation to a string compatible with the CSS transform-function data type, for example `matrix(1, 2, -2, 1, 3, 4)`. @@ -866,7 +866,7 @@ Together with [affineplane.helm2](#affineplanehelm2).fromString(...), this metho Source: [toString.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/toString.js) -## affineplane.helm2.transform(tr, ts) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[transform](#affineplanehelm2transform)(tr, ts) Multiply transformation matrix tr from the left with the given transformation matrix ts. @@ -885,8 +885,8 @@ For multiplication from right, see [affineplane.helm2.compose](#affineplanehelm2 Source: [transform.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/transform.js) - -## affineplane.helm2.transitFrom(tr, plane) + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[transitFrom](#affineplanehelm2transitfrom)(tr, plane) Transit a [helm2](#affineplanehelm2) from the source plane to the reference plane. Note that: @@ -905,8 +905,8 @@ to the reference plane. Note that: Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/transitFrom.js) - -## affineplane.helm2.UNIT + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[UNIT](#affineplanehelm2unit) A unit transform. Scales by sqrt(2), rotates by 45deg, and translates by vector (1,1) @@ -914,7 +914,7 @@ and translates by vector (1,1) Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) -## affineplane.helm2.validate(tr) +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[validate](#affineplanehelm2validate)(tr) Check if object is a valid [helm2](#affineplanehelm2). @@ -927,15 +927,15 @@ Check if object is a valid [helm2](#affineplanehelm2). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/validate.js) - -## affineplane.helm2.X2 + +## [affineplane](#affineplane).[helm2](#affineplanehelm2).[X2](#affineplanehelm2x2) Scaling to double size. Source: [helm2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm2/index.js) -## affineplane.helm3 +## [affineplane](#affineplane).[helm3](#affineplanehelm3) Functions for a special 3D affine transformation that consists of a translation in 3D, rotation around z-axis, and uniform scaling, @@ -950,11 +950,11 @@ Therefore it has no single position in space, and is not affected by plane translations. See [affineplane.plane3](#affineplaneplane3) for a positional variant. -- [affineplane.helm3.addDilation](#affineplanehelm3addDilation) -- [affineplane.helm3.addRotation](#affineplanehelm3addRotation) -- [affineplane.helm3.addTranslation](#affineplanehelm3addTranslation) -- [affineplane.helm3.almostEqual](#affineplanehelm3almostEqual) -- [affineplane.helm3.almostEquals](#affineplanehelm3almostEquals) +- [affineplane.helm3.addDilation](#affineplanehelm3adddilation) +- [affineplane.helm3.addRotation](#affineplanehelm3addrotation) +- [affineplane.helm3.addTranslation](#affineplanehelm3addtranslation) +- [affineplane.helm3.almostEqual](#affineplanehelm3almostequal) +- [affineplane.helm3.almostEquals](#affineplanehelm3almostequals) - [affineplane.helm3.clone](#affineplanehelm3clone) - [affineplane.helm3.combine](#affineplanehelm3combine) - [affineplane.helm3.compose](#affineplanehelm3compose) @@ -964,42 +964,42 @@ See [affineplane.plane3](#affineplaneplane3) for a positional variant. - [affineplane.helm3.determinant](#affineplanehelm3determinant) - [affineplane.helm3.equal](#affineplanehelm3equal) - [affineplane.helm3.equals](#affineplanehelm3equals) -- [affineplane.helm3.fromArray](#affineplanehelm3fromArray) -- [affineplane.helm3.fromFeatures](#affineplanehelm3fromFeatures) -- [affineplane.helm3.getDilation](#affineplanehelm3getDilation) -- [affineplane.helm3.getRotation](#affineplanehelm3getRotation) -- [affineplane.helm3.getScale](#affineplanehelm3getScale) -- [affineplane.helm3.getTranslation](#affineplanehelm3getTranslation) -- [affineplane.helm3.HALF](#affineplanehelm3HALF) -- [affineplane.helm3.I](#affineplanehelm3I) -- [affineplane.helm3.IDENTITY](#affineplanehelm3IDENTITY) +- [affineplane.helm3.fromArray](#affineplanehelm3fromarray) +- [affineplane.helm3.fromFeatures](#affineplanehelm3fromfeatures) +- [affineplane.helm3.getDilation](#affineplanehelm3getdilation) +- [affineplane.helm3.getRotation](#affineplanehelm3getrotation) +- [affineplane.helm3.getScale](#affineplanehelm3getscale) +- [affineplane.helm3.getTranslation](#affineplanehelm3gettranslation) +- [affineplane.helm3.HALF](#affineplanehelm3half) +- [affineplane.helm3.I](#affineplanehelm3i) +- [affineplane.helm3.IDENTITY](#affineplanehelm3identity) - [affineplane.helm3.inverse](#affineplanehelm3inverse) - [affineplane.helm3.invert](#affineplanehelm3invert) -- [affineplane.helm3.projectTo](#affineplanehelm3projectTo) -- [affineplane.helm3.ROT0](#affineplanehelm3ROT0) -- [affineplane.helm3.ROT180](#affineplanehelm3ROT180) -- [affineplane.helm3.ROT270](#affineplanehelm3ROT270) -- [affineplane.helm3.ROT45](#affineplanehelm3ROT45) -- [affineplane.helm3.ROT90](#affineplanehelm3ROT90) -- [affineplane.helm3.rotateBy](#affineplanehelm3rotateBy) -- [affineplane.helm3.scaleBy](#affineplanehelm3scaleBy) -- [affineplane.helm3.setDilation](#affineplanehelm3setDilation) -- [affineplane.helm3.setRotation](#affineplanehelm3setRotation) -- [affineplane.helm3.setTranslation](#affineplanehelm3setTranslation) -- [affineplane.helm3.SINGULAR](#affineplanehelm3SINGULAR) -- [affineplane.helm3.toArray](#affineplanehelm3toArray) -- [affineplane.helm3.toMatrix](#affineplanehelm3toMatrix) -- [affineplane.helm3.transitFrom](#affineplanehelm3transitFrom) -- [affineplane.helm3.UNIT](#affineplanehelm3UNIT) +- [affineplane.helm3.projectTo](#affineplanehelm3projectto) +- [affineplane.helm3.ROT0](#affineplanehelm3rot0) +- [affineplane.helm3.ROT180](#affineplanehelm3rot180) +- [affineplane.helm3.ROT270](#affineplanehelm3rot270) +- [affineplane.helm3.ROT45](#affineplanehelm3rot45) +- [affineplane.helm3.ROT90](#affineplanehelm3rot90) +- [affineplane.helm3.rotateBy](#affineplanehelm3rotateby) +- [affineplane.helm3.scaleBy](#affineplanehelm3scaleby) +- [affineplane.helm3.setDilation](#affineplanehelm3setdilation) +- [affineplane.helm3.setRotation](#affineplanehelm3setrotation) +- [affineplane.helm3.setTranslation](#affineplanehelm3settranslation) +- [affineplane.helm3.SINGULAR](#affineplanehelm3singular) +- [affineplane.helm3.toArray](#affineplanehelm3toarray) +- [affineplane.helm3.toMatrix](#affineplanehelm3tomatrix) +- [affineplane.helm3.transitFrom](#affineplanehelm3transitfrom) +- [affineplane.helm3.UNIT](#affineplanehelm3unit) - [affineplane.helm3.validate](#affineplanehelm3validate) -- [affineplane.helm3.X2](#affineplanehelm3X2) -- [affineplane.helm3.ZERO](#affineplanehelm3ZERO) +- [affineplane.helm3.X2](#affineplanehelm3x2) +- [affineplane.helm3.ZERO](#affineplanehelm3zero) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.addDilation(tr, delta) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[addDilation](#affineplanehelm3adddilation)(tr, delta) Increase the scale multiplier of the transformation by addition. The rotation and translation properties are preserved. @@ -1015,8 +1015,8 @@ The rotation and translation properties are preserved. Source: [addDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/addDilation.js) - -## affineplane.helm3.addRotation(tr, angle) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[addRotation](#affineplanehelm3addrotation)(tr, angle) Increase rotation angle of the transformation by an angle. The dilation and translation properties are preserved. @@ -1032,8 +1032,8 @@ The dilation and translation properties are preserved. Source: [addRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/addRotation.js) - -## affineplane.helm3.addTranslation(tr, vec) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[addTranslation](#affineplanehelm3addtranslation)(tr, vec) Modify transformation so that its image is translated by the given vector. @@ -1051,8 +1051,8 @@ further by the given vector. Source: [addTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/addTranslation.js) - -## affineplane.helm3.almostEqual(tr, ts, [epsilon]) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[almostEqual](#affineplanehelm3almostequal)(tr, ts, [epsilon]) Are two transforms almost equal? Return true if a matrix norm of the difference is smaller than epsilon. We use modified @@ -1070,33 +1070,33 @@ Manhattan Distance to compute the difference. **Returns:** - a boolean, true if equal -Aliases: [affineplane.helm3.almostEquals](#affineplanehelm3almostEquals) +Aliases: [affineplane.helm3.almostEquals](#affineplanehelm3almostequals) Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/almostEqual.js) - -## affineplane.helm3.almostEquals + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[almostEquals](#affineplanehelm3almostequals) -Alias of [affineplane.helm3.almostEqual](#affineplanehelm3almostEqual) +Alias of [affineplane.helm3.almostEqual](#affineplanehelm3almostequal) Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/almostEqual.js) -## affineplane.helm3.clone +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[clone](#affineplanehelm3clone) Alias of [affineplane.helm3.copy](#affineplanehelm3copy) Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/copy.js) -## affineplane.helm3.combine +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[combine](#affineplanehelm3combine) Alias of [affineplane.helm3.compose](#affineplanehelm3compose) Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/compose.js) -## affineplane.helm3.compose(tr, ts) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[compose](#affineplanehelm3compose)(tr, ts) Multiply the [helm3](#affineplanehelm3) matrix tr from the right with the [helm3](#affineplanehelm3) matrix ts. @@ -1116,7 +1116,7 @@ Aliases: [affineplane.helm3.combine](#affineplanehelm3combine) Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/compose.js) -## affineplane.helm3.copy(tr) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[copy](#affineplanehelm3copy)(tr) **Parameters:** - *tr* @@ -1130,7 +1130,7 @@ Aliases: [affineplane.helm3.clone](#affineplanehelm3clone) Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/copy.js) -## affineplane.helm3.create(a, b, x, y, z) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[create](#affineplanehelm3create)(a, b, x, y, z) Create a new [helm3](#affineplanehelm3) object. @@ -1152,7 +1152,7 @@ Create a new [helm3](#affineplanehelm3) object. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/create.js) -## affineplane.helm3.det(tr) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[det](#affineplanehelm3det)(tr) The matrix determinant of the transformation. If the determinant equals zero then the matrix cannot be inverted and @@ -1172,19 +1172,19 @@ Aliases: [affineplane.helm3.determinant](#affineplanehelm3determinant) Source: [det.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/det.js) -## affineplane.helm3.determinant(tr) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[determinant](#affineplanehelm3determinant)(tr) Alias of [affineplane.helm3.det](#affineplanehelm3det) Source: [det.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/det.js) -## affineplane.helm3.equal(tr, ts) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[equal](#affineplanehelm3equal)(tr, ts) True if transformations are exactly equal. Note that due to floating-point arithmetics, computation might cause exact equality to be broken. -See [affineplane.helm3.almostEqual](#affineplanehelm3almostEqual) for a relaxed alternative. +See [affineplane.helm3.almostEqual](#affineplanehelm3almostequal) for a relaxed alternative. **Parameters:** - *tr* @@ -1200,14 +1200,14 @@ Aliases: [affineplane.helm3.equals](#affineplanehelm3equals) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/equal.js) -## affineplane.helm3.equals +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[equals](#affineplanehelm3equals) Alias of [affineplane.helm3.equal](#affineplanehelm3equal) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/equal.js) - -## affineplane.helm3.fromArray(arr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[fromArray](#affineplanehelm3fromarray)(arr) Create an affine similarity transform from 5-element array. @@ -1220,8 +1220,8 @@ Create an affine similarity transform from 5-element array. Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/fromArray.js) - -## affineplane.helm3.fromFeatures(feats) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[fromFeatures](#affineplanehelm3fromfeatures)(feats) Create a [helm3](#affineplanehelm3) transformation from human-readable features. @@ -1240,8 +1240,8 @@ Create a [helm3](#affineplanehelm3) transformation from human-readable features. Source: [fromFeatures.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/fromFeatures.js) - -## affineplane.helm3.getDilation(tr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[getDilation](#affineplanehelm3getdilation)(tr) Get the dilation component of the transformation. @@ -1252,12 +1252,12 @@ Get the dilation component of the transformation. **Returns:** - a number, the scale multiplier. -Aliases: [affineplane.helm3.getScale](#affineplanehelm3getScale) +Aliases: [affineplane.helm3.getScale](#affineplanehelm3getscale) Source: [getDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/getDilation.js) - -## affineplane.helm3.getRotation(tr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[getRotation](#affineplanehelm3getrotation)(tr) Get the rotation component of the transform in radians. This is rotation around z-axis to right hand direction. @@ -1271,15 +1271,15 @@ This is rotation around z-axis to right hand direction. Source: [getRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/getRotation.js) - -## affineplane.helm3.getScale + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[getScale](#affineplanehelm3getscale) -Alias of [affineplane.helm3.getDilation](#affineplanehelm3getDilation) +Alias of [affineplane.helm3.getDilation](#affineplanehelm3getdilation) Source: [getDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/getDilation.js) - -## affineplane.helm3.getTranslation(tr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[getTranslation](#affineplanehelm3gettranslation)(tr) Get translation component of the transformation as a vector. @@ -1292,31 +1292,31 @@ Get translation component of the transformation as a vector. Source: [getTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/getTranslation.js) - -## affineplane.helm3.HALF + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[HALF](#affineplanehelm3half) Scaling to half size. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.I + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[I](#affineplanehelm3i) Identity transform, a kind of multiplication by 1. -Aliases: [affineplane.helm3.IDENTITY](#affineplanehelm3IDENTITY) +Aliases: [affineplane.helm3.IDENTITY](#affineplanehelm3identity) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.IDENTITY + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[IDENTITY](#affineplanehelm3identity) -Alias of [affineplane.helm3.I](#affineplanehelm3I) +Alias of [affineplane.helm3.I](#affineplanehelm3i) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) -## affineplane.helm3.inverse(tr) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[inverse](#affineplanehelm3inverse)(tr) Invert the transform. A transform from B to C becomes a transform from C to B. @@ -1333,14 +1333,14 @@ Aliases: [affineplane.helm3.invert](#affineplanehelm3invert) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/inverse.js) -## affineplane.helm3.invert +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[invert](#affineplanehelm3invert) Alias of [affineplane.helm3.inverse](#affineplanehelm3inverse) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/inverse.js) - -## affineplane.helm3.projectTo(tr, plane) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[projectTo](#affineplanehelm3projectto)(tr, plane) Project transformation onto a plane orthogonally. @@ -1355,43 +1355,43 @@ Project transformation onto a plane orthogonally. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/projectTo.js) - -## affineplane.helm3.ROT0 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ROT0](#affineplanehelm3rot0) Zero angle rotation. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.ROT180 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ROT180](#affineplanehelm3rot180) Rotation of 180 degrees. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.ROT270 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ROT270](#affineplanehelm3rot270) Clockwise rotation of 270 degrees. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.ROT45 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ROT45](#affineplanehelm3rot45) Clockwise rotation of 45 degrees. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.ROT90 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ROT90](#affineplanehelm3rot90) Clockwise rotation of 90 degrees. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.rotateBy(tr, radians) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[rotateBy](#affineplanehelm3rotateby)(tr, radians) Rotate image of the transform by the given radians around z-axis. This changes the direction of the translation but @@ -1409,8 +1409,8 @@ the translation along z. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/rotateBy.js) - -## affineplane.helm3.scaleBy(tr, multiplier) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[scaleBy](#affineplanehelm3scaleby)(tr, multiplier) Scale image of the transform by the given multiplier. Dilation and translation are multiplied, @@ -1428,8 +1428,8 @@ Note that also translation along z becomes multiplied. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/scaleBy.js) - -## affineplane.helm3.setDilation(tr, dilation) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[setDilation](#affineplanehelm3setdilation)(tr, dilation) Replace scaling of the transformation. The rotation and translation properties are preserved. @@ -1445,8 +1445,8 @@ The rotation and translation properties are preserved. Source: [setDilation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/setDilation.js) - -## affineplane.helm3.setRotation(tr, angle) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[setRotation](#affineplanehelm3setrotation)(tr, angle) Replace rotation angle of the transformation. The dilation and translation properties are preserved. @@ -1462,8 +1462,8 @@ The dilation and translation properties are preserved. Source: [setRotation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/setRotation.js) - -## affineplane.helm3.setTranslation(tr, vec) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[setTranslation](#affineplanehelm3settranslation)(tr, vec) Replace translation property of the transformation. The dilation and rotation properties are preserved. @@ -1479,8 +1479,8 @@ The dilation and rotation properties are preserved. Source: [setTranslation.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/setTranslation.js) - -## affineplane.helm3.SINGULAR + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[SINGULAR](#affineplanehelm3singular) Singular transform, resembles multiplication by 0. Note that singular transformations are note valid affine transformations @@ -1488,15 +1488,15 @@ because singularity cannot be inverted. For example with numbers, you can multiply 2 by 0 to produce 0 but you cannot multiply 0 to produce the original 2. -Aliases: [affineplane.helm3.ZERO](#affineplanehelm3ZERO) +Aliases: [affineplane.helm3.ZERO](#affineplanehelm3zero) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.toArray(tr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[toArray](#affineplanehelm3toarray)(tr) Serializes the transformation into an array representation. -Compatible with [affineplane.helm3.fromArray](#affineplanehelm3fromArray). +Compatible with [affineplane.helm3.fromArray](#affineplanehelm3fromarray). **Parameters:** - *tr* @@ -1507,8 +1507,8 @@ Compatible with [affineplane.helm3.fromArray](#affineplanehelm3fromArray). Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/toArray.js) - -## affineplane.helm3.toMatrix(tr) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[toMatrix](#affineplanehelm3tomatrix)(tr) Get the transformation as a 4x4 homogeneous 3D transformation matrix, using indexing similar to MDN matrix3d article. @@ -1533,8 +1533,8 @@ Elements are constructed like this: Source: [toMatrix.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/toMatrix.js) - -## affineplane.helm3.transitFrom(tr, source) + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[transitFrom](#affineplanehelm3transitfrom)(tr, source) Transit a [helm3](#affineplanehelm3) from the source plane to the reference plane. @@ -1555,8 +1555,8 @@ Invariants: Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/transitFrom.js) - -## affineplane.helm3.UNIT + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[UNIT](#affineplanehelm3unit) A unit transform. Scales by sqrt(2), rotates by 45deg, and translates by vector (1,1,1) @@ -1564,7 +1564,7 @@ and translates by vector (1,1,1) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) -## affineplane.helm3.validate(tr) +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[validate](#affineplanehelm3validate)(tr) Check if object is a valid [helm3](#affineplanehelm3). @@ -1577,22 +1577,22 @@ Check if object is a valid [helm3](#affineplanehelm3). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/validate.js) - -## affineplane.helm3.X2 + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[X2](#affineplanehelm3x2) Scaling to double size. Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) - -## affineplane.helm3.ZERO + +## [affineplane](#affineplane).[helm3](#affineplanehelm3).[ZERO](#affineplanehelm3zero) -Alias of [affineplane.helm3.SINGULAR](#affineplanehelm3SINGULAR) +Alias of [affineplane.helm3.SINGULAR](#affineplanehelm3singular) Source: [helm3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/helm3/index.js) -## affineplane.line2 +## [affineplane](#affineplane).[line2](#affineplaneline2) Directed line object with origin point in space and a spanning vector. @@ -1600,14 +1600,14 @@ A [line2](#affineplaneline2) is an object `{ origin: {x,y}, span: {x,y} }` - [affineplane.line2.at](#affineplaneline2at) - [affineplane.line2.create](#affineplaneline2create) -- [affineplane.line2.fromPoints](#affineplaneline2fromPoints) +- [affineplane.line2.fromPoints](#affineplaneline2frompoints) - [affineplane.line2.validate](#affineplaneline2validate) Source: [line2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/line2/index.js) -## affineplane.line2.at(line, c) +## [affineplane](#affineplane).[line2](#affineplaneline2).[at](#affineplaneline2at)(line, c) Get a point on the line at position c from the line origin. For example c=2 gives a point at two spanning vectors away @@ -1625,7 +1625,7 @@ from the origin. Source: [at.js](https://github.com/axelpale/affineplane/blob/main/lib/line2/at.js) -## affineplane.line2.create(origin, span) +## [affineplane](#affineplane).[line2](#affineplaneline2).[create](#affineplaneline2create)(origin, span) Create a line from an origin point and a spanning vector. @@ -1640,8 +1640,8 @@ Create a line from an origin point and a spanning vector. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/line2/create.js) - -## affineplane.line2.fromPoints(p, q) + +## [affineplane](#affineplane).[line2](#affineplaneline2).[fromPoints](#affineplaneline2frompoints)(p, q) Create a line from two points with a spanning vector from p to q. @@ -1658,7 +1658,7 @@ with a spanning vector from p to q. Source: [fromPoints.js](https://github.com/axelpale/affineplane/blob/main/lib/line2/fromPoints.js) -## affineplane.line2.validate(l) +## [affineplane](#affineplane).[line2](#affineplaneline2).[validate](#affineplaneline2validate)(l) Check if the object is a valid [line2](#affineplaneline2). Valid [line2](#affineplaneline2) has origin and span properties @@ -1674,7 +1674,7 @@ that are valid [point2](#affineplanepoint2) and [vec2](#affineplanevec2), respec Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/line2/validate.js) -## affineplane.line3 +## [affineplane](#affineplane).[line3](#affineplaneline3) Directed line object in 3D, Represented as an origin point and a spanning vector. @@ -1683,14 +1683,14 @@ A [line2](#affineplaneline2) is an object `{ origin: {x,y,z}, span: {x,y,z} }` - [affineplane.line3.at](#affineplaneline3at) - [affineplane.line3.create](#affineplaneline3create) -- [affineplane.line3.fromPoints](#affineplaneline3fromPoints) +- [affineplane.line3.fromPoints](#affineplaneline3frompoints) - [affineplane.line3.validate](#affineplaneline3validate) Source: [line3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/line3/index.js) -## affineplane.line3.at(line, c) +## [affineplane](#affineplane).[line3](#affineplaneline3).[at](#affineplaneline3at)(line, c) Get a point on the line at position c from the line origin. For example c=2 gives a point at two spanning vectors away @@ -1708,7 +1708,7 @@ from the origin. Source: [at.js](https://github.com/axelpale/affineplane/blob/main/lib/line3/at.js) -## affineplane.line3.create(origin, span) +## [affineplane](#affineplane).[line3](#affineplaneline3).[create](#affineplaneline3create)(origin, span) Create a 3d line from an origin point and a spanning vector. @@ -1723,8 +1723,8 @@ Create a 3d line from an origin point and a spanning vector. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/line3/create.js) - -## affineplane.line3.fromPoints(p, q) + +## [affineplane](#affineplane).[line3](#affineplaneline3).[fromPoints](#affineplaneline3frompoints)(p, q) Create a line from two points with a spanning vector from p to q. @@ -1741,7 +1741,7 @@ with a spanning vector from p to q. Source: [fromPoints.js](https://github.com/axelpale/affineplane/blob/main/lib/line3/fromPoints.js) -## affineplane.line3.validate(line) +## [affineplane](#affineplane).[line3](#affineplaneline3).[validate](#affineplaneline3validate)(line) Check if the object is a valid [line3](#affineplaneline3). Valid [line3](#affineplaneline3) has origin and span properties @@ -1757,7 +1757,7 @@ that are valid [point3](#affineplanepoint3) and [vec3](#affineplanevec3), respec Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/line3/validate.js) -## affineplane.path2 +## [affineplane](#affineplane).[path2](#affineplanepath2) Two-dimensional path; Array of [point2](#affineplanepoint2); Open sequence of points; Does not form a polygon but a sequence of line segments. @@ -1769,7 +1769,7 @@ Does not form a polygon but a sequence of line segments. Source: [path2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/path2/index.js) -## affineplane.path2.create(points) +## [affineplane](#affineplane).[path2](#affineplanepath2).[create](#affineplanepath2create)(points) Create a path on plane. Deep-clones the points array. @@ -1783,7 +1783,7 @@ Create a path on plane. Deep-clones the points array. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/path2/create.js) -## affineplane.plane2 +## [affineplane](#affineplane).[plane2](#affineplaneplane2) A 2D euclidean plane. @@ -1806,35 +1806,35 @@ is located +20 units along x-axis of the reference plane. - [affineplane.plane2.create](#affineplaneplane2create) - [affineplane.plane2.difference](#affineplaneplane2difference) - [affineplane.plane2.equal](#affineplaneplane2equal) -- [affineplane.plane2.fromFeatures](#affineplaneplane2fromFeatures) -- [affineplane.plane2.getScale](#affineplaneplane2getScale) -- [affineplane.plane2.IDENTITY](#affineplaneplane2IDENTITY) +- [affineplane.plane2.fromFeatures](#affineplaneplane2fromfeatures) +- [affineplane.plane2.getScale](#affineplaneplane2getscale) +- [affineplane.plane2.IDENTITY](#affineplaneplane2identity) - [affineplane.plane2.invert](#affineplaneplane2invert) -- [affineplane.plane2.projectTo](#affineplaneplane2projectTo) -- [affineplane.plane2.rotateBy](#affineplaneplane2rotateBy) -- [affineplane.plane2.rotateTo](#affineplaneplane2rotateTo) -- [affineplane.plane2.rotateToOrtho](#affineplaneplane2rotateToOrtho) -- [affineplane.plane2.scaleBy](#affineplaneplane2scaleBy) -- [affineplane.plane2.scaleTo](#affineplaneplane2scaleTo) +- [affineplane.plane2.projectTo](#affineplaneplane2projectto) +- [affineplane.plane2.rotateBy](#affineplaneplane2rotateby) +- [affineplane.plane2.rotateTo](#affineplaneplane2rotateto) +- [affineplane.plane2.rotateToOrtho](#affineplaneplane2rotatetoortho) +- [affineplane.plane2.scaleBy](#affineplaneplane2scaleby) +- [affineplane.plane2.scaleTo](#affineplaneplane2scaleto) - [affineplane.plane2.transform](#affineplaneplane2transform) -- [affineplane.plane2.transitFrom](#affineplaneplane2transitFrom) -- [affineplane.plane2.transitTo](#affineplaneplane2transitTo) -- [affineplane.plane2.translateBy](#affineplaneplane2translateBy) -- [affineplane.plane2.translateTo](#affineplaneplane2translateTo) +- [affineplane.plane2.transitFrom](#affineplaneplane2transitfrom) +- [affineplane.plane2.transitTo](#affineplaneplane2transitto) +- [affineplane.plane2.translateBy](#affineplaneplane2translateby) +- [affineplane.plane2.translateTo](#affineplaneplane2translateto) - [affineplane.plane2.validate](#affineplaneplane2validate) Source: [plane2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/index.js) -## affineplane.plane2.between +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[between](#affineplaneplane2between) Alias of [affineplane.plane2.difference](#affineplaneplane2difference) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/difference.js) -## affineplane.plane2.compose(planea, planeb) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[compose](#affineplaneplane2compose)(planea, planeb) Combine two planes together. @@ -1850,7 +1850,7 @@ Combine two planes together. Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/compose.js) -## affineplane.plane2.copy(plane) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[copy](#affineplaneplane2copy)(plane) Clone the plane object. @@ -1864,7 +1864,7 @@ Clone the plane object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/copy.js) -## affineplane.plane2.create(origin, span) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[create](#affineplaneplane2create)(origin, span) Create a [plane2](#affineplaneplane2) from an origin point and a basis vector. @@ -1880,7 +1880,7 @@ Create a [plane2](#affineplaneplane2) from an origin point and a basis vector. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/create.js) -## affineplane.plane2.difference(source, target) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[difference](#affineplaneplane2difference)(source, target) Represent a source plane on the target plane. In other words, find a transition from a source plane A @@ -1904,7 +1904,7 @@ Aliases: [affineplane.plane2.between](#affineplaneplane2between) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/difference.js) -## affineplane.plane2.equal(p1, p2) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[equal](#affineplaneplane2equal)(p1, p2) **Parameters:** - *p1* @@ -1917,8 +1917,8 @@ Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/pl Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/equal.js) - -## affineplane.plane2.fromFeatures(feats) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[fromFeatures](#affineplaneplane2fromfeatures)(feats) Create a plane from human readable features. @@ -1937,8 +1937,8 @@ Create a plane from human readable features. Source: [fromFeatures.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/fromFeatures.js) - -## affineplane.plane2.getScale(plane) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[getScale](#affineplaneplane2getscale)(plane) The length of the vector. @@ -1951,15 +1951,15 @@ The length of the vector. Source: [getScale.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/getScale.js) - -## affineplane.plane2.IDENTITY + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[IDENTITY](#affineplaneplane2identity) The identity plane is identical to its reference plane. Source: [plane2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/index.js) -## affineplane.plane2.invert(plane) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[invert](#affineplaneplane2invert)(plane) A plane is a mapping from the plane's coordinates onto the reference plane. The inversion of the plane switches @@ -1975,8 +1975,8 @@ represented in the coordinates of the given plane. Source: [invert.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/invert.js) - -## affineplane.plane2.projectTo(plane, target, camera) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[projectTo](#affineplaneplane2projectto)(plane, target, camera) Project a 2D plane from reference to the target parallel 2D plane in 3D. If camera is given, project perspectively, otherwise orthogonally. @@ -1994,8 +1994,8 @@ If camera is given, project perspectively, otherwise orthogonally. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/projectTo.js) - -## affineplane.plane2.rotateBy(plane, center, radians) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[rotateBy](#affineplaneplane2rotateby)(plane, center, radians) Rotate the given plane on the reference plane around a center point. @@ -2013,8 +2013,8 @@ a center point. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/rotateBy.js) - -## affineplane.plane2.rotateTo(plane, center, radians) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[rotateTo](#affineplaneplane2rotateto)(plane, center, radians) Rotate the plane around a point so that after the rotation, the x-axis of the plane points to the given direction. @@ -2033,8 +2033,8 @@ The center point stays fixed during the operation. Source: [rotateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/rotateTo.js) - -## affineplane.plane2.rotateToOrtho(plane, center) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[rotateToOrtho](#affineplaneplane2rotatetoortho)(plane, center) Rotate plane to nearest orthogonal angle 0, 90, 180, and 270 deg with respect to the reference plane. @@ -2056,8 +2056,8 @@ caused by floating-point arithmetics. Source: [rotateToOrtho.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/rotateToOrtho.js) - -## affineplane.plane2.scaleBy(plane, center, multiplier) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[scaleBy](#affineplaneplane2scaleby)(plane, center, multiplier) Create a plane that is scaled by the multiplier around a center point. For example, if a plane with basis vectors @@ -2077,8 +2077,8 @@ of the new plane are ex_hat = (2,0), ey_hat = (0,2). Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/scaleBy.js) - -## affineplane.plane2.scaleTo(plane, center, scale) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[scaleTo](#affineplaneplane2scaleto)(plane, center, scale) Create a plane that has the given scale. This is achieved by scaling the plane around @@ -2099,7 +2099,7 @@ becomes the desired scale. Source: [scaleTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/scaleTo.js) -## affineplane.plane2.transform(plane, tr) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[transform](#affineplaneplane2transform)(plane, tr) Transform the plane with a helmert transformation. Basically, the plane is a transformation from its internal @@ -2119,8 +2119,8 @@ For multiplication from right, see [affineplane.plane2.compose](#affineplaneplan Source: [transform.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/transform.js) - -## affineplane.plane2.transitFrom(plane, source) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[transitFrom](#affineplaneplane2transitfrom)(plane, source) Transit a [plane2](#affineplaneplane2) from the source plane to the reference plane. In other words, @@ -2138,8 +2138,8 @@ of the reference plane instead of the source plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/transitFrom.js) - -## affineplane.plane2.transitTo + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[transitTo](#affineplaneplane2transitto) Transit a [plane2](#affineplaneplane2) to a target plane. In other words, represent the [plane2](#affineplaneplane2) @@ -2156,8 +2156,8 @@ in the coordinate system of the target plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/transitTo.js) - -## affineplane.plane2.translateBy(plane, vec) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[translateBy](#affineplaneplane2translateby)(plane, vec) Translate the plane by a vector. Basically this moves the plane origin @@ -2174,8 +2174,8 @@ on the reference plane. Source: [translateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/translateBy.js) - -## affineplane.plane2.translateTo(plane, p) + +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[translateTo](#affineplaneplane2translateto)(plane, p) Move the plane origin to a new point. This translates the plane to a new position. @@ -2192,7 +2192,7 @@ This translates the plane to a new position. Source: [translateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/translateTo.js) -## affineplane.plane2.validate(plane) +## [affineplane](#affineplane).[plane2](#affineplaneplane2).[validate](#affineplaneplane2validate)(plane) Check if object is a valid [plane2](#affineplaneplane2). @@ -2206,7 +2206,7 @@ Check if object is a valid [plane2](#affineplaneplane2). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/plane2/validate.js) -## affineplane.plane3 +## [affineplane](#affineplane).[plane3](#affineplaneplane3) A [plane3](#affineplaneplane3) does not model any possible plane in 3D space, but is limited to xy planes perpendicular to z-axis and with a known z position. @@ -2232,34 +2232,35 @@ relative to its reference plane. - [affineplane.plane3.create](#affineplaneplane3create) - [affineplane.plane3.difference](#affineplaneplane3difference) - [affineplane.plane3.equal](#affineplaneplane3equal) -- [affineplane.plane3.fromFeatures](#affineplaneplane3fromFeatures) -- [affineplane.plane3.getScale](#affineplaneplane3getScale) -- [affineplane.plane3.IDENTITY](#affineplaneplane3IDENTITY) +- [affineplane.plane3.fromFeatures](#affineplaneplane3fromfeatures) +- [affineplane.plane3.getNormal](#affineplaneplane3getnormal) +- [affineplane.plane3.getScale](#affineplaneplane3getscale) +- [affineplane.plane3.IDENTITY](#affineplaneplane3identity) - [affineplane.plane3.invert](#affineplaneplane3invert) -- [affineplane.plane3.rotateBy](#affineplaneplane3rotateBy) -- [affineplane.plane3.rotateTo](#affineplaneplane3rotateTo) -- [affineplane.plane3.rotateToOrtho](#affineplaneplane3rotateToOrtho) -- [affineplane.plane3.scaleBy](#affineplaneplane3scaleBy) -- [affineplane.plane3.scaleTo](#affineplaneplane3scaleTo) +- [affineplane.plane3.rotateBy](#affineplaneplane3rotateby) +- [affineplane.plane3.rotateTo](#affineplaneplane3rotateto) +- [affineplane.plane3.rotateToOrtho](#affineplaneplane3rotatetoortho) +- [affineplane.plane3.scaleBy](#affineplaneplane3scaleby) +- [affineplane.plane3.scaleTo](#affineplaneplane3scaleto) - [affineplane.plane3.transform](#affineplaneplane3transform) -- [affineplane.plane3.transitFrom](#affineplaneplane3transitFrom) -- [affineplane.plane3.transitTo](#affineplaneplane3transitTo) -- [affineplane.plane3.translateBy](#affineplaneplane3translateBy) -- [affineplane.plane3.translateTo](#affineplaneplane3translateTo) +- [affineplane.plane3.transitFrom](#affineplaneplane3transitfrom) +- [affineplane.plane3.transitTo](#affineplaneplane3transitto) +- [affineplane.plane3.translateBy](#affineplaneplane3translateby) +- [affineplane.plane3.translateTo](#affineplaneplane3translateto) - [affineplane.plane3.validate](#affineplaneplane3validate) Source: [plane3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/index.js) -## affineplane.plane3.between +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[between](#affineplaneplane3between) Alias of [affineplane.plane3.difference](#affineplaneplane3difference) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/difference.js) -## affineplane.plane3.compose(planea, planeb) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[compose](#affineplaneplane3compose)(planea, planeb) Combine two planes together. @@ -2275,7 +2276,7 @@ Combine two planes together. Source: [compose.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/compose.js) -## affineplane.plane3.copy(plane) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[copy](#affineplaneplane3copy)(plane) Clone the plane object. @@ -2289,7 +2290,7 @@ Clone the plane object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/copy.js) -## affineplane.plane3.create(origin, span) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[create](#affineplaneplane3create)(origin, span) Create a plane from 3D origin point and 2D basis vector. @@ -2305,7 +2306,7 @@ Create a plane from 3D origin point and 2D basis vector. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/create.js) -## affineplane.plane3.difference(source, target) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[difference](#affineplaneplane3difference)(source, target) Represent a source plane on the target plane. In other words, find a transition from a source plane A @@ -2329,7 +2330,7 @@ Aliases: [affineplane.plane3.between](#affineplaneplane3between) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/difference.js) -## affineplane.plane3.equal(p1, p2) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[equal](#affineplaneplane3equal)(p1, p2) Test if two planes are equal. @@ -2344,8 +2345,8 @@ Test if two planes are equal. Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/equal.js) - -## affineplane.plane3.fromFeatures(feats) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[fromFeatures](#affineplaneplane3fromfeatures)(feats) Create a plane from human readable features. @@ -2364,8 +2365,22 @@ Create a plane from human readable features. Source: [fromFeatures.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/fromFeatures.js) - -## affineplane.plane3.getScale(plane) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[getNormal](#affineplaneplane3getnormal)(plane) + +Get a unit vector perpendicular to the plane. + +**Parameters:** +- *plane* + - a [plane3](#affineplaneplane3) on the reference plane + +**Returns:** +- a [vec3](#affineplanevec3), the plane normal vector. + +Source: [getNormal.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/getNormal.js) + + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[getScale](#affineplaneplane3getscale)(plane) The length of the basis vector, the scale multiplier. @@ -2378,15 +2393,15 @@ The length of the basis vector, the scale multiplier. Source: [getScale.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/getScale.js) - -## affineplane.plane3.IDENTITY + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[IDENTITY](#affineplaneplane3identity) The identity plane is identical to its reference plane. Source: [plane3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/index.js) -## affineplane.plane3.invert(plane) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[invert](#affineplaneplane3invert)(plane) **Parameters:** - *plane* @@ -2397,8 +2412,8 @@ Source: [plane3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/ Source: [invert.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/invert.js) - -## affineplane.plane3.rotateBy(plane, center, radians) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[rotateBy](#affineplaneplane3rotateby)(plane, center, radians) Rotate the given plane in the reference space around a line parallel to z-axis and which goes through @@ -2417,8 +2432,8 @@ the given center point. The plane z depth is preserved. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/rotateBy.js) - -## affineplane.plane3.rotateTo(plane, center, radians) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[rotateTo](#affineplaneplane3rotateto)(plane, center, radians) Rotate the plane around a line parallel to z-axis and which goes though the given center point. @@ -2440,8 +2455,8 @@ stays fixed during the operation. Source: [rotateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/rotateTo.js) - -## affineplane.plane3.rotateToOrtho(plane, center) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[rotateToOrtho](#affineplaneplane3rotatetoortho)(plane, center) Rotate plane to nearest orthogonal angle 0, 90, 180, and 270 deg with respect to the reference plane. The rotation happens on xy-plane, @@ -2465,8 +2480,8 @@ caused by floating-point arithmetics. Source: [rotateToOrtho.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/rotateToOrtho.js) - -## affineplane.plane3.scaleBy(plane, center, multiplier) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[scaleBy](#affineplaneplane3scaleby)(plane, center, multiplier) Create a plane that is scaled by the multiplier around a center point. For example, if a plane with basis vectors @@ -2489,8 +2504,8 @@ The scaling preserves the z depth of the plane. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/scaleBy.js) - -## affineplane.plane3.scaleTo(plane, center, scale) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[scaleTo](#affineplaneplane3scaleto)(plane, center, scale) Scale a plane to the given scale. This is achieved by scaling the given plane around @@ -2511,7 +2526,7 @@ the given center point. Source: [scaleTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/scaleTo.js) -## affineplane.plane3.transform(plane, tr) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[transform](#affineplaneplane3transform)(plane, tr) Transform the plane with a helmert transformation. Basically, the plane is a transformation from its internal @@ -2531,8 +2546,8 @@ For multiplication from right, see [affineplane.plane3.compose](#affineplaneplan Source: [transform.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/transform.js) - -## affineplane.plane3.transitFrom(plane, source) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[transitFrom](#affineplaneplane3transitfrom)(plane, source) Transit a [plane3](#affineplaneplane3) from the source plane to the reference plane. In other words, @@ -2550,8 +2565,8 @@ system of the reference plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/transitFrom.js) - -## affineplane.plane3.transitTo(plane, target) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[transitTo](#affineplaneplane3transitto)(plane, target) Transit a [plane3](#affineplaneplane3) to a target plane. In other words, represent the [plane3](#affineplaneplane3) @@ -2568,8 +2583,8 @@ in the coordinate system of the target plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/transitTo.js) - -## affineplane.plane3.translateBy(plane, vec) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[translateBy](#affineplaneplane3translateby)(plane, vec) Translate the plane by a vector. Basically this moves the plane origin @@ -2586,8 +2601,8 @@ on the reference plane by the given vector. Source: [translateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/translateBy.js) - -## affineplane.plane3.translateTo(plane, p) + +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[translateTo](#affineplaneplane3translateto)(plane, p) Move the plane origin to a new point. This translates the plane to a new position. @@ -2604,7 +2619,7 @@ This translates the plane to a new position. Source: [translateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/translateTo.js) -## affineplane.plane3.validate(plane) +## [affineplane](#affineplane).[plane3](#affineplaneplane3).[validate](#affineplaneplane3validate)(plane) Check if object is a valid [plane3](#affineplaneplane3). @@ -2618,7 +2633,7 @@ Check if object is a valid [plane3](#affineplaneplane3). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/plane3/validate.js) -## affineplane.point2 +## [affineplane](#affineplane).[point2](#affineplanepoint2) A two-dimensional point. A point is a position in affine space. Due to affinity, two points cannot be added together, @@ -2633,18 +2648,18 @@ An affine space does not have origin; `{ x:0, y:0 }` is not an origin. - [affineplane.point2.distance](#affineplanepoint2distance) - [affineplane.point2.equal](#affineplanepoint2equal) - [affineplane.point2.equals](#affineplanepoint2equals) -- [affineplane.point2.fromArray](#affineplanepoint2fromArray) +- [affineplane.point2.fromArray](#affineplanepoint2fromarray) - [affineplane.point2.mean](#affineplanepoint2mean) - [affineplane.point2.move](#affineplanepoint2move) - [affineplane.point2.offset](#affineplanepoint2offset) -- [affineplane.point2.polarOffset](#affineplanepoint2polarOffset) -- [affineplane.point2.projectTo](#affineplanepoint2projectTo) -- [affineplane.point2.projectToLine](#affineplanepoint2projectToLine) -- [affineplane.point2.rotateBy](#affineplanepoint2rotateBy) -- [affineplane.point2.toArray](#affineplanepoint2toArray) +- [affineplane.point2.polarOffset](#affineplanepoint2polaroffset) +- [affineplane.point2.projectTo](#affineplanepoint2projectto) +- [affineplane.point2.projectToLine](#affineplanepoint2projecttoline) +- [affineplane.point2.rotateBy](#affineplanepoint2rotateby) +- [affineplane.point2.toArray](#affineplanepoint2toarray) - [affineplane.point2.transform](#affineplanepoint2transform) -- [affineplane.point2.transitFrom](#affineplanepoint2transitFrom) -- [affineplane.point2.transitTo](#affineplanepoint2transitTo) +- [affineplane.point2.transitFrom](#affineplanepoint2transitfrom) +- [affineplane.point2.transitTo](#affineplanepoint2transitto) - [affineplane.point2.translate](#affineplanepoint2translate) - [affineplane.point2.validate](#affineplanepoint2validate) @@ -2652,7 +2667,7 @@ An affine space does not have origin; `{ x:0, y:0 }` is not an origin. Source: [point2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/index.js) -## affineplane.point2.average(ps) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[average](#affineplanepoint2average)(ps) Average of points. @@ -2668,7 +2683,7 @@ Aliases: [affineplane.point2.mean](#affineplanepoint2mean) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/average.js) -## affineplane.point2.copy(p) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[copy](#affineplanepoint2copy)(p) Copy point object. @@ -2682,7 +2697,7 @@ Copy point object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/copy.js) -## affineplane.point2.create(x, y) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[create](#affineplanepoint2create)(x, y) Create a [point2](#affineplanepoint2) object: `{ x, y }`. @@ -2698,14 +2713,14 @@ Create a [point2](#affineplanepoint2) object: `{ x, y }`. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/create.js) -## affineplane.point2.delta +## [affineplane](#affineplane).[point2](#affineplanepoint2).[delta](#affineplanepoint2delta) Alias of [affineplane.point2.difference](#affineplanepoint2difference) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/difference.js) -## affineplane.point2.difference(p, q) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[difference](#affineplanepoint2difference)(p, q) A vector from point p to point q. @@ -2723,7 +2738,7 @@ Aliases: [affineplane.point2.delta](#affineplanepoint2delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/difference.js) -## affineplane.point2.distance(p, q) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[distance](#affineplanepoint2distance)(p, q) Distance between two points. @@ -2739,7 +2754,7 @@ Distance between two points. Source: [distance.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/distance.js) -## affineplane.point2.equal(p, q) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[equal](#affineplanepoint2equal)(p, q) Test if points p, q are equal. @@ -2757,14 +2772,14 @@ Aliases: [affineplane.point2.equals](#affineplanepoint2equals) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/equal.js) -## affineplane.point2.equals +## [affineplane](#affineplane).[point2](#affineplanepoint2).[equals](#affineplanepoint2equals) Alias of [affineplane.point2.equal](#affineplanepoint2equal) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/equal.js) - -## affineplane.point2.fromArray(arrp) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[fromArray](#affineplanepoint2fromarray)(arrp) Create `{ x, y }` point from array [x, y]. @@ -2778,21 +2793,21 @@ Create `{ x, y }` point from array [x, y]. Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/fromArray.js) -## affineplane.point2.mean +## [affineplane](#affineplane).[point2](#affineplanepoint2).[mean](#affineplanepoint2mean) Alias of [affineplane.point2.average](#affineplanepoint2average) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/average.js) -## affineplane.point2.move +## [affineplane](#affineplane).[point2](#affineplanepoint2).[move](#affineplanepoint2move) Alias of [affineplane.point2.translate](#affineplanepoint2translate) Source: [translate.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/translate.js) -## affineplane.point2.offset(p, dx, dy) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[offset](#affineplanepoint2offset)(p, dx, dy) Offset a point by scalars dx dy. @@ -2809,8 +2824,8 @@ Offset a point by scalars dx dy. Source: [offset.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/offset.js) - -## affineplane.point2.polarOffset(p, distance, angle) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[polarOffset](#affineplanepoint2polaroffset)(p, distance, angle) Create a point away from p at the given distance and angle. @@ -2827,8 +2842,8 @@ Create a point away from p at the given distance and angle. Source: [polarOffset.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/polarOffset.js) - -## affineplane.point2.projectTo(point, plane, camera) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[projectTo](#affineplanepoint2projectto)(point, plane, camera) Project a point onto another plane in 3d. If camera is given, project perspectively. @@ -2847,8 +2862,8 @@ Otherwise, project orthogonally. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/projectTo.js) - -## affineplane.point2.projectToLine(p, line) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[projectToLine](#affineplanepoint2projecttoline)(p, line) Project a point orthogonally onto a line. @@ -2863,8 +2878,8 @@ Project a point orthogonally onto a line. Source: [projectToLine.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/projectToLine.js) - -## affineplane.point2.rotateBy(p, origin, radians) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[rotateBy](#affineplanepoint2rotateby)(p, origin, radians) Rotate point about the given center. @@ -2881,8 +2896,8 @@ Rotate point about the given center. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/rotateBy.js) - -## affineplane.point2.toArray(p) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[toArray](#affineplanepoint2toarray)(p) Get the [point2](#affineplanepoint2) object as an array. @@ -2896,7 +2911,7 @@ Get the [point2](#affineplanepoint2) object as an array. Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/toArray.js) -## affineplane.point2.transform(p, tr) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[transform](#affineplanepoint2transform)(p, tr) Transform a point. @@ -2911,8 +2926,8 @@ Transform a point. Source: [transform.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/transform.js) - -## affineplane.point2.transitFrom(point, plane) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[transitFrom](#affineplanepoint2transitfrom)(point, plane) Transit a [point2](#affineplanepoint2) from the source plane to the reference plane. @@ -2928,8 +2943,8 @@ to the reference plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/transitFrom.js) - -## affineplane.point2.transitTo(point, target) + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[transitTo](#affineplanepoint2transitto)(point, target) Transit a [point2](#affineplanepoint2) to a target plane. In other words, represent the [point2](#affineplanepoint2) @@ -2947,7 +2962,7 @@ in the coordinate system of the plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/transitTo.js) -## affineplane.point2.translate(p, vec) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[translate](#affineplanepoint2translate)(p, vec) Translate the point by the given vector. @@ -2965,7 +2980,7 @@ Aliases: [affineplane.point2.move](#affineplanepoint2move) Source: [translate.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/translate.js) -## affineplane.point2.validate(p) +## [affineplane](#affineplane).[point2](#affineplanepoint2).[validate](#affineplanepoint2validate)(p) Check if the object is a valid [point2](#affineplanepoint2). Valid [point2](#affineplanepoint2) has x and y properties that are valid numbers. @@ -2980,11 +2995,11 @@ Valid [point2](#affineplanepoint2) has x and y properties that are valid numbers Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/validate.js) -## affineplane.point3 +## [affineplane](#affineplane).[point3](#affineplanepoint3) Three-dimensional point { x, y, z }. -- [affineplane.point3.almostEqual](#affineplanepoint3almostEqual) +- [affineplane.point3.almostEqual](#affineplanepoint3almostequal) - [affineplane.point3.average](#affineplanepoint3average) - [affineplane.point3.copy](#affineplanepoint3copy) - [affineplane.point3.create](#affineplanepoint3create) @@ -2993,23 +3008,23 @@ Three-dimensional point { x, y, z }. - [affineplane.point3.distance](#affineplanepoint3distance) - [affineplane.point3.equal](#affineplanepoint3equal) - [affineplane.point3.equals](#affineplanepoint3equals) -- [affineplane.point3.fromArray](#affineplanepoint3fromArray) +- [affineplane.point3.fromArray](#affineplanepoint3fromarray) - [affineplane.point3.mean](#affineplanepoint3mean) - [affineplane.point3.offset](#affineplanepoint3offset) -- [affineplane.point3.polarOffset](#affineplanepoint3polarOffset) -- [affineplane.point3.projectTo](#affineplanepoint3projectTo) -- [affineplane.point3.rotateBy](#affineplanepoint3rotateBy) -- [affineplane.point3.toArray](#affineplanepoint3toArray) -- [affineplane.point3.transitFrom](#affineplanepoint3transitFrom) -- [affineplane.point3.transitTo](#affineplanepoint3transitTo) +- [affineplane.point3.polarOffset](#affineplanepoint3polaroffset) +- [affineplane.point3.projectTo](#affineplanepoint3projectto) +- [affineplane.point3.rotateBy](#affineplanepoint3rotateby) +- [affineplane.point3.toArray](#affineplanepoint3toarray) +- [affineplane.point3.transitFrom](#affineplanepoint3transitfrom) +- [affineplane.point3.transitTo](#affineplanepoint3transitto) - [affineplane.point3.translate](#affineplanepoint3translate) - [affineplane.point3.validate](#affineplanepoint3validate) Source: [point3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/index.js) - -## affineplane.point3.almostEqual(p, q, [epsilon]) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[almostEqual](#affineplanepoint3almostequal)(p, q, [epsilon]) Test if points are almost equal by the margin of epsilon. @@ -3027,7 +3042,7 @@ Test if points are almost equal by the margin of epsilon. Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/almostEqual.js) -## affineplane.point3.average(ps) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[average](#affineplanepoint3average)(ps) Average of points. @@ -3043,7 +3058,7 @@ Aliases: [affineplane.point3.mean](#affineplanepoint3mean) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/average.js) -## affineplane.point3.copy(p) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[copy](#affineplanepoint3copy)(p) Clone [point3](#affineplanepoint3) to a new object. @@ -3053,7 +3068,7 @@ Clone [point3](#affineplanepoint3) to a new object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/copy.js) -## affineplane.point3.create(x, y, z) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[create](#affineplanepoint3create)(x, y, z) Create a three-dimensional point `{x, y, z}`. @@ -3063,14 +3078,14 @@ Create a three-dimensional point `{x, y, z}`. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/create.js) -## affineplane.point3.delta +## [affineplane](#affineplane).[point3](#affineplanepoint3).[delta](#affineplanepoint3delta) Alias of [affineplane.point3.difference](#affineplanepoint3difference) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/difference.js) -## affineplane.point3.difference(p, q) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[difference](#affineplanepoint3difference)(p, q) A vector from point p to point q. @@ -3088,7 +3103,7 @@ Aliases: [affineplane.point3.delta](#affineplanepoint3delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/difference.js) -## affineplane.point3.distance(p, q) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[distance](#affineplanepoint3distance)(p, q) Euclidean distance between two points. @@ -3104,7 +3119,7 @@ Euclidean distance between two points. Source: [distance.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/distance.js) -## affineplane.point3.equal(p, q) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[equal](#affineplanepoint3equal)(p, q) Test if points p, q are equal in value. @@ -3122,14 +3137,14 @@ Aliases: [affineplane.point3.equals](#affineplanepoint3equals) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/equal.js) -## affineplane.point3.equals +## [affineplane](#affineplane).[point3](#affineplanepoint3).[equals](#affineplanepoint3equals) Alias of [affineplane.point3.equal](#affineplanepoint3equal) Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/equal.js) - -## affineplane.point3.fromArray(arrp) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[fromArray](#affineplanepoint3fromarray)(arrp) Create a [point3](#affineplanepoint3) from array `[x, y, z]`. @@ -3143,14 +3158,14 @@ Create a [point3](#affineplanepoint3) from array `[x, y, z]`. Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/fromArray.js) -## affineplane.point3.mean +## [affineplane](#affineplane).[point3](#affineplanepoint3).[mean](#affineplanepoint3mean) Alias of [affineplane.point3.average](#affineplanepoint3average) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/average.js) -## affineplane.point3.offset(p, dx, dy, dz) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[offset](#affineplanepoint3offset)(p, dx, dy, dz) Offset a point by scalars dx, dy, dz. @@ -3169,8 +3184,8 @@ Offset a point by scalars dx, dy, dz. Source: [offset.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/offset.js) - -## affineplane.point3.polarOffset(p, distance, roll, pitch) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[polarOffset](#affineplanepoint3polaroffset)(p, distance, roll, pitch) Create a point near p at the given distance, roll angle, and pitch angle. @@ -3190,8 +3205,8 @@ and pitch angle. Source: [polarOffset.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/polarOffset.js) - -## affineplane.point3.projectTo(point, plane, camera) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[projectTo](#affineplanepoint3projectto)(point, plane, camera) Project a 3D point onto a plane in 3D space. @@ -3208,8 +3223,8 @@ Project a 3D point onto a plane in 3D space. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/projectTo.js) - -## affineplane.point3.rotateBy(p, origin, roll, pitch) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[rotateBy](#affineplanepoint3rotateby)(p, origin, roll, pitch) Rotate point around the given center point. Roll is applied before pitch. @@ -3229,11 +3244,11 @@ Roll is applied before pitch. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/rotateBy.js) - -## affineplane.point3.toArray(p) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[toArray](#affineplanepoint3toarray)(p) Get the [point3](#affineplanepoint3) object as an array. -Compatible with [affineplane.point3.fromArray](#affineplanepoint3fromArray). +Compatible with [affineplane.point3.fromArray](#affineplanepoint3fromarray). **Parameters:** - *p* @@ -3244,8 +3259,8 @@ Compatible with [affineplane.point3.fromArray](#affineplanepoint3fromArray). Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/toArray.js) - -## affineplane.point3.transitFrom(point, plane) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[transitFrom](#affineplanepoint3transitfrom)(point, plane) Represent the point on the reference plane without losing information. @@ -3261,8 +3276,8 @@ without losing information. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/transitFrom.js) - -## affineplane.point3.transitTo(point, plane) + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[transitTo](#affineplanepoint3transitto)(point, plane) Represent the point on the target plane without losing information. @@ -3279,7 +3294,7 @@ without losing information. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/transitTo.js) -## affineplane.point3.translate(p, vec) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[translate](#affineplanepoint3translate)(p, vec) Translate the point by the given vector. @@ -3295,7 +3310,7 @@ Translate the point by the given vector. Source: [translate.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/translate.js) -## affineplane.point3.validate(p) +## [affineplane](#affineplane).[point3](#affineplanepoint3).[validate](#affineplanepoint3validate)(p) Check if the object is a valid [point3](#affineplanepoint3). Valid [point3](#affineplanepoint3) has props x, y and z that are valid numbers. @@ -3310,7 +3325,7 @@ Valid [point3](#affineplanepoint3) has props x, y and z that are valid numbers. Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/validate.js) -## affineplane.poly2 +## [affineplane](#affineplane).[poly2](#affineplanepoly2) A two-dimensional polygon; Array of [point2](#affineplanepoint2); A closed sequence of points `[{ x, y }, { x, y }, ...]`. @@ -3321,7 +3336,7 @@ A closed sequence of points `[{ x, y }, { x, y }, ...]`. Source: [poly2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/poly2/index.js) -## affineplane.poly2.create(points) +## [affineplane](#affineplane).[poly2](#affineplanepoly2).[create](#affineplanepoly2create)(points) Create a polygon on plane. Deep-clones the points array. @@ -3335,24 +3350,24 @@ Create a polygon on plane. Deep-clones the points array. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/poly2/create.js) -## affineplane.size2 +## [affineplane](#affineplane).[size2](#affineplanesize2) Two-dimensional rectangular size, consisting of width and height. Represented with an object `{ w, h }`. - [affineplane.size2.area](#affineplanesize2area) -- [affineplane.size2.atNorm](#affineplanesize2atNorm) +- [affineplane.size2.atNorm](#affineplanesize2atnorm) - [affineplane.size2.create](#affineplanesize2create) -- [affineplane.size2.scaleBy](#affineplanesize2scaleBy) -- [affineplane.size2.transitFrom](#affineplanesize2transitFrom) -- [affineplane.size2.transitTo](#affineplanesize2transitTo) +- [affineplane.size2.scaleBy](#affineplanesize2scaleby) +- [affineplane.size2.transitFrom](#affineplanesize2transitfrom) +- [affineplane.size2.transitTo](#affineplanesize2transitto) Source: [size2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/index.js) -## affineplane.size2.area(sz) +## [affineplane](#affineplane).[size2](#affineplanesize2).[area](#affineplanesize2area)(sz) Area. If your w and h are in px, this gives you the total number of pixels. @@ -3366,8 +3381,8 @@ the total number of pixels. Source: [area.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/area.js) - -## affineplane.size2.atNorm(sz, nw, nh) + +## [affineplane](#affineplane).[size2](#affineplanesize2).[atNorm](#affineplanesize2atnorm)(sz, nw, nh) Find a point on the area. @@ -3385,7 +3400,7 @@ Find a point on the area. Source: [atNorm.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/atNorm.js) -## affineplane.size2.create(width, height) +## [affineplane](#affineplane).[size2](#affineplanesize2).[create](#affineplanesize2create)(width, height) Create a [size2](#affineplanesize2) object. @@ -3400,8 +3415,8 @@ Create a [size2](#affineplanesize2) object. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/create.js) - -## affineplane.size2.scaleBy(sz, multiplier) + +## [affineplane](#affineplane).[size2](#affineplanesize2).[scaleBy](#affineplanesize2scaleby)(sz, multiplier) Ratio-preserving scale. Multiplies all dimensions uniformly. @@ -3416,8 +3431,8 @@ Ratio-preserving scale. Multiplies all dimensions uniformly. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/scaleBy.js) - -## affineplane.size2.transitFrom(size, source) + +## [affineplane](#affineplane).[size2](#affineplanesize2).[transitFrom](#affineplanesize2transitfrom)(size, source) Transit a size from the source plane to the reference plane. @@ -3433,8 +3448,8 @@ to the reference plane. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/transitFrom.js) - -## affineplane.size2.transitTo(size, target) + +## [affineplane](#affineplane).[size2](#affineplanesize2).[transitTo](#affineplanesize2transitto)(size, target) Transit a [size2](#affineplanesize2) to a target plane. In other words, represent the size @@ -3452,22 +3467,23 @@ in the coordinate system of the target plane. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/size2/transitTo.js) -## affineplane.vec2 +## [affineplane](#affineplane).[vec2](#affineplanevec2) Vector is a two dimensional dynamic movent between points. Aliases: [affineplane.vector2](#affineplanevector2) - [affineplane.vec2.add](#affineplanevec2add) -- [affineplane.vec2.almostEqual](#affineplanevec2almostEqual) +- [affineplane.vec2.almostEqual](#affineplanevec2almostequal) - [affineplane.vec2.average](#affineplanevec2average) - [affineplane.vec2.copy](#affineplanevec2copy) - [affineplane.vec2.create](#affineplanevec2create) - [affineplane.vec2.cross](#affineplanevec2cross) - [affineplane.vec2.difference](#affineplanevec2difference) - [affineplane.vec2.dot](#affineplanevec2dot) -- [affineplane.vec2.fromArray](#affineplanevec2fromArray) -- [affineplane.vec2.fromPolar](#affineplanevec2fromPolar) +- [affineplane.vec2.equal](#affineplanevec2equal) +- [affineplane.vec2.fromArray](#affineplanevec2fromarray) +- [affineplane.vec2.fromPolar](#affineplanevec2frompolar) - [affineplane.vec2.invert](#affineplanevec2invert) - [affineplane.vec2.magnitude](#affineplanevec2magnitude) - [affineplane.vec2.max](#affineplanevec2max) @@ -3475,16 +3491,17 @@ Aliases: [affineplane.vector2](#affineplanevector2) - [affineplane.vec2.min](#affineplanevec2min) - [affineplane.vec2.negate](#affineplanevec2negate) - [affineplane.vec2.norm](#affineplanevec2norm) -- [affineplane.vec2.projectTo](#affineplanevec2projectTo) -- [affineplane.vec2.rotateBy](#affineplanevec2rotateBy) -- [affineplane.vec2.rotateTo](#affineplanevec2rotateTo) -- [affineplane.vec2.scaleBy](#affineplanevec2scaleBy) -- [affineplane.vec2.scaleTo](#affineplanevec2scaleTo) +- [affineplane.vec2.normalize](#affineplanevec2normalize) +- [affineplane.vec2.projectTo](#affineplanevec2projectto) +- [affineplane.vec2.rotateBy](#affineplanevec2rotateby) +- [affineplane.vec2.rotateTo](#affineplanevec2rotateto) +- [affineplane.vec2.scaleBy](#affineplanevec2scaleby) +- [affineplane.vec2.scaleTo](#affineplanevec2scaleto) - [affineplane.vec2.sum](#affineplanevec2sum) -- [affineplane.vec2.toArray](#affineplanevec2toArray) -- [affineplane.vec2.toPolar](#affineplanevec2toPolar) -- [affineplane.vec2.transitFrom](#affineplanevec2transitFrom) -- [affineplane.vec2.transitTo](#affineplanevec2transitTo) +- [affineplane.vec2.toArray](#affineplanevec2toarray) +- [affineplane.vec2.toPolar](#affineplanevec2topolar) +- [affineplane.vec2.transitFrom](#affineplanevec2transitfrom) +- [affineplane.vec2.transitTo](#affineplanevec2transitto) - [affineplane.vec2.unit](#affineplanevec2unit) - [affineplane.vec2.validate](#affineplanevec2validate) @@ -3492,7 +3509,7 @@ Aliases: [affineplane.vector2](#affineplanevector2) Source: [vec2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/index.js) -## affineplane.vec2.add(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[add](#affineplanevec2add)(v, w) Add two vectors. See vector.sum to add many vectors. @@ -3507,8 +3524,8 @@ Add two vectors. See vector.sum to add many vectors. Source: [add.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/add.js) - -## affineplane.vec2.almostEqual(v, w, [epsilon]) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[almostEqual](#affineplanevec2almostequal)(v, w, [epsilon]) Test if two vectors v and w are almost equal by the margin of epsilon. @@ -3526,7 +3543,7 @@ Test if two vectors v and w are almost equal by the margin of epsilon. Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/almostEqual.js) -## affineplane.vec2.average(vs) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[average](#affineplanevec2average)(vs) Arithmetic mean of an array of vectors. @@ -3542,7 +3559,7 @@ Aliases: [affineplane.vec2.mean](#affineplanevec2mean) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/average.js) -## affineplane.vec2.copy(v) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[copy](#affineplanevec2copy)(v) Copy vector object. @@ -3556,7 +3573,7 @@ Copy vector object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/copy.js) -## affineplane.vec2.create(x, y) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[create](#affineplanevec2create)(x, y) Create a vector object `{ x, y }`. @@ -3572,7 +3589,7 @@ Create a vector object `{ x, y }`. Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/create.js) -## affineplane.vec2.cross(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[cross](#affineplanevec2cross)(v, w) The magnitude of cross product of two 2D vectors. While in 3D, the cross product returns a perpendicular vector, in 2D we must @@ -3590,7 +3607,7 @@ settle for a scalar result, the length of that 3D vector. Source: [cross.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/cross.js) -## affineplane.vec2.difference(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[difference](#affineplanevec2difference)(v, w) A vector between v and w. @@ -3606,9 +3623,10 @@ A vector between v and w. Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/difference.js) -## affineplane.vec2.dot(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[dot](#affineplanevec2dot)(v, w) -Dot product of two vectors. +The dot product of two vectors, +also called the scalar product. **Parameters:** - *v* @@ -3621,8 +3639,24 @@ Dot product of two vectors. Source: [dot.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/dot.js) - -## affineplane.vec2.fromArray(arrp) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[equal](#affineplanevec2equal)(v, w) + +Test if vectors v,w are equal + +**Parameters:** +- *v* + - a [vec2](#affineplanevec2) +- *w* + - a [vec2](#affineplanevec2) + +**Returns:** +- a boolean + +Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/equal.js) + + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[fromArray](#affineplanevec2fromarray)(arrp) Create `{ x, y }` vector from array `[x, y]`. @@ -3635,8 +3669,8 @@ Create `{ x, y }` vector from array `[x, y]`. Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/fromArray.js) - -## affineplane.vec2.fromPolar(magnitude, direction) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[fromPolar](#affineplanevec2frompolar)(magnitude, direction) Create a vector from polar coordinates. @@ -3652,7 +3686,7 @@ Create a vector from polar coordinates. Source: [fromPolar.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/fromPolar.js) -## affineplane.vec2.invert(v) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[invert](#affineplanevec2invert)(v) Negate the vector. For example `inverse({ x: 1, y: -1 })` returns `{ x: -1, y: 1 }`. @@ -3669,7 +3703,7 @@ Aliases: [affineplane.vec2.negate](#affineplanevec2negate) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/inverse.js) -## affineplane.vec2.magnitude(v) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[magnitude](#affineplanevec2magnitude)(v) The length of the vector. @@ -3685,7 +3719,7 @@ Aliases: [affineplane.vec2.norm](#affineplanevec2norm) Source: [magnitude.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/magnitude.js) -## affineplane.vec2.max(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[max](#affineplanevec2max)(v, w) Element-wise maximum of two vectors. @@ -3701,14 +3735,14 @@ Element-wise maximum of two vectors. Source: [max.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/max.js) -## affineplane.vec2.mean(vs) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[mean](#affineplanevec2mean)(vs) Alias of [affineplane.vec2.average](#affineplanevec2average) Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/average.js) -## affineplane.vec2.min(v, w) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[min](#affineplanevec2min)(v, w) Element-wise minimum of two vectors @@ -3724,21 +3758,28 @@ Element-wise minimum of two vectors Source: [min.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/min.js) -## affineplane.vec2.negate +## [affineplane](#affineplane).[vec2](#affineplanevec2).[negate](#affineplanevec2negate) Alias of [affineplane.vec2.invert](#affineplanevec2invert) Source: [inverse.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/inverse.js) -## affineplane.vec2.norm +## [affineplane](#affineplane).[vec2](#affineplanevec2).[norm](#affineplanevec2norm) Alias of [affineplane.vec2.magnitude](#affineplanevec2magnitude) Source: [magnitude.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/magnitude.js) - -## affineplane.vec2.projectTo(v, plane, camera) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[normalize](#affineplanevec2normalize) + +Alias of [affineplane.vec2.unit](#affineplanevec2unit) + +Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/unit.js) + + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[projectTo](#affineplanevec2projectto)(v, plane, camera) Project a vector onto another plane. If camera is given, project perspectively. @@ -3757,8 +3798,8 @@ Otherwise, project orthogonally. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/projectTo.js) - -## affineplane.vec2.rotateBy(v, radians) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[rotateBy](#affineplanevec2rotateby)(v, radians) Rotate vector by the given angle. @@ -3773,8 +3814,8 @@ Rotate vector by the given angle. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/rotateBy.js) - -## affineplane.vec2.rotateTo(v, radians) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[rotateTo](#affineplanevec2rotateto)(v, radians) Rotate vector so that it points to the given angle. @@ -3789,9 +3830,10 @@ Rotate vector so that it points to the given angle. Source: [rotateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/rotateTo.js) - -## affineplane.vec2.scaleBy(vec, multiplier) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[scaleBy](#affineplanevec2scaleby)(vec, multiplier) +The scalar multiplication of a vector. Scale the vector by a multiplier. The direction of the vector does not change. @@ -3806,8 +3848,8 @@ The direction of the vector does not change. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/scaleBy.js) - -## affineplane.vec2.scaleTo(vec, magnitude) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[scaleTo](#affineplanevec2scaleto)(vec, magnitude) Scale the vector to a certain length. The direction of the vector does not change. @@ -3817,7 +3859,7 @@ As an exception, zero vector length remains zero. - *vec* - a [vec2](#affineplanevec2), non-zero vector. - *magnitude* - - a number, the target vector length + - a number, the target vector length. **Returns:** - a [vec2](#affineplanevec2) @@ -3825,7 +3867,7 @@ As an exception, zero vector length remains zero. Source: [scaleTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/scaleTo.js) -## affineplane.vec2.sum(vs) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[sum](#affineplanevec2sum)(vs) Add an array of vectors together. See [affineplane.vec2.add](#affineplanevec2add) to add two vectors together. @@ -3839,8 +3881,8 @@ See [affineplane.vec2.add](#affineplanevec2add) to add two vectors together. Source: [sum.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/sum.js) - -## affineplane.vec2.toArray(v) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[toArray](#affineplanevec2toarray)(v) Get the vector object as an array. @@ -3853,8 +3895,8 @@ Get the vector object as an array. Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/toArray.js) - -## affineplane.vec2.toPolar(v) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[toPolar](#affineplanevec2topolar)(v) Get polar coordinates of a vector. @@ -3867,8 +3909,8 @@ Get polar coordinates of a vector. Source: [toPolar.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/toPolar.js) - -## affineplane.vec2.transitFrom(vec, plane) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[transitFrom](#affineplanevec2transitfrom)(vec, plane) Transit a [vec2](#affineplanevec2) from the source plane to the reference plane. @@ -3886,8 +3928,8 @@ only scaling and rotation do. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/transitFrom.js) - -## affineplane.vec2.transitTo(vec, plane) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[transitTo](#affineplanevec2transitto)(vec, plane) Transit a [vec2](#affineplanevec2) to a target plane. In other words, represent the [vec2](#affineplanevec2) @@ -3906,7 +3948,7 @@ Translation of the plane does not affect the vector. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/transitTo.js) -## affineplane.vec2.unit(v) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[unit](#affineplanevec2unit)(v) Get unit vector parallel to the given vector. The magnitude of unit vector is equal to one. @@ -3919,10 +3961,12 @@ If zero vector is given, assume direction towards positive x. **Returns:** - a [vec2](#affineplanevec2), magnitude of one. +Aliases: [affineplane.vec2.normalize](#affineplanevec2normalize) + Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/unit.js) -## affineplane.vec2.validate(v) +## [affineplane](#affineplane).[vec2](#affineplanevec2).[validate](#affineplanevec2validate)(v) Check if object is a valid [vec2](#affineplanevec2). @@ -3936,14 +3980,14 @@ Check if object is a valid [vec2](#affineplanevec2). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/validate.js) -## affineplane.vec3 +## [affineplane](#affineplane).[vec3](#affineplanevec3) Three-dimensional vector. Aliases: [affineplane.vector3](#affineplanevector3) - [affineplane.vec3.add](#affineplanevec3add) -- [affineplane.vec3.almostEqual](#affineplanevec3almostEqual) +- [affineplane.vec3.almostEqual](#affineplanevec3almostequal) - [affineplane.vec3.average](#affineplanevec3average) - [affineplane.vec3.copy](#affineplanevec3copy) - [affineplane.vec3.create](#affineplanevec3create) @@ -3952,23 +3996,24 @@ Aliases: [affineplane.vector3](#affineplanevector3) - [affineplane.vec3.difference](#affineplanevec3difference) - [affineplane.vec3.dot](#affineplanevec3dot) - [affineplane.vec3.equal](#affineplanevec3equal) -- [affineplane.vec3.fromArray](#affineplanevec3fromArray) -- [affineplane.vec3.fromPolar](#affineplanevec3fromPolar) -- [affineplane.vec3.fromSpherical](#affineplanevec3fromSpherical) +- [affineplane.vec3.fromArray](#affineplanevec3fromarray) +- [affineplane.vec3.fromPolar](#affineplanevec3frompolar) +- [affineplane.vec3.fromSpherical](#affineplanevec3fromspherical) - [affineplane.vec3.invert](#affineplanevec3invert) - [affineplane.vec3.magnitude](#affineplanevec3magnitude) - [affineplane.vec3.negate](#affineplanevec3negate) -- [affineplane.vec3.projectTo](#affineplanevec3projectTo) -- [affineplane.vec3.rotateBy](#affineplanevec3rotateBy) -- [affineplane.vec3.rotateBy](#affineplanevec3rotateBy) -- [affineplane.vec3.scaleBy](#affineplanevec3scaleBy) -- [affineplane.vec3.scaleTo](#affineplanevec3scaleTo) +- [affineplane.vec3.normalize](#affineplanevec3normalize) +- [affineplane.vec3.projectTo](#affineplanevec3projectto) +- [affineplane.vec3.rotateBy](#affineplanevec3rotateby) +- [affineplane.vec3.rotateBy](#affineplanevec3rotateby) +- [affineplane.vec3.scaleBy](#affineplanevec3scaleby) +- [affineplane.vec3.scaleTo](#affineplanevec3scaleto) - [affineplane.vec3.sum](#affineplanevec3sum) -- [affineplane.vec3.toArray](#affineplanevec3toArray) -- [affineplane.vec3.toPolar](#affineplanevec3toPolar) -- [affineplane.vec3.toSpherical](#affineplanevec3toSpherical) -- [affineplane.vec3.transitFrom](#affineplanevec3transitFrom) -- [affineplane.vec3.transitTo](#affineplanevec3transitTo) +- [affineplane.vec3.toArray](#affineplanevec3toarray) +- [affineplane.vec3.toPolar](#affineplanevec3topolar) +- [affineplane.vec3.toSpherical](#affineplanevec3tospherical) +- [affineplane.vec3.transitFrom](#affineplanevec3transitfrom) +- [affineplane.vec3.transitTo](#affineplanevec3transitto) - [affineplane.vec3.unit](#affineplanevec3unit) - [affineplane.vec3.validate](#affineplanevec3validate) @@ -3976,7 +4021,7 @@ Aliases: [affineplane.vector3](#affineplanevector3) Source: [vec3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/index.js) -## affineplane.vec3.add(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[add](#affineplanevec3add)(v, w) **Parameters:** - *v* @@ -3989,8 +4034,8 @@ Source: [vec3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/ve Source: [add.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/add.js) - -## affineplane.vec3.almostEqual(v, w, [epsilon]) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[almostEqual](#affineplanevec3almostequal)(v, w, [epsilon]) Test if vectors are almost equal by the margin of epsilon. @@ -4009,7 +4054,7 @@ Test if vectors are almost equal by the margin of epsilon. Source: [almostEqual.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/almostEqual.js) -## affineplane.vec3.average(vs) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[average](#affineplanevec3average)(vs) Arithmetic mean of an array of vectors. @@ -4023,7 +4068,7 @@ Arithmetic mean of an array of vectors. Source: [average.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/average.js) -## affineplane.vec3.copy(v) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[copy](#affineplanevec3copy)(v) Clone the vector object. @@ -4037,7 +4082,7 @@ Clone the vector object. Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/copy.js) -## affineplane.vec3.create(x, y, z) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[create](#affineplanevec3create)(x, y, z) **Parameters:** - *x* @@ -4053,7 +4098,7 @@ Source: [copy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/cop Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/create.js) -## affineplane.vec3.cross(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[cross](#affineplanevec3cross)(v, w) The cross product of two 3D vectors. Returns a vector perpendicular to the given vectors. In other words, the result will be normal @@ -4071,14 +4116,14 @@ to the plane span by the given vectors. Source: [cross.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/cross.js) -## affineplane.vec3.diff(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[diff](#affineplanevec3diff)(v, w) Alias of [affineplane.vec3.difference](#affineplanevec3difference) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/difference.js) -## affineplane.vec3.difference(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[difference](#affineplanevec3difference)(v, w) Get the vector w - v. In other words, if we place v, w to begin from the same point then the result is a vector @@ -4098,9 +4143,10 @@ Aliases: [affineplane.vec3.diff](#affineplanevec3diff) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/difference.js) -## affineplane.vec3.dot(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[dot](#affineplanevec3dot)(v, w) -Dot product of two vectors. +Dot product of two vectors, +also called the scalar product. **Parameters:** - *v* @@ -4114,7 +4160,7 @@ Dot product of two vectors. Source: [dot.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/dot.js) -## affineplane.vec3.equal(v, w) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[equal](#affineplanevec3equal)(v, w) Test if vectors v, w are equal in value. @@ -4129,8 +4175,8 @@ Test if vectors v, w are equal in value. Source: [equal.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/equal.js) - -## affineplane.vec3.fromArray(arrv) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[fromArray](#affineplanevec3fromarray)(arrv) Create a [vec3](#affineplanevec3) from an array `[x, y, z]`. @@ -4146,11 +4192,11 @@ Throws Source: [fromArray.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/fromArray.js) - -## affineplane.vec3.fromPolar(magnitude, direction, depth) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[fromPolar](#affineplanevec3frompolar)(magnitude, direction, depth) Create a vector from cylindrical polar coordinates. -See also [affineplane.vec3.toPolar](#affineplanevec3toPolar). +See also [affineplane.vec3.toPolar](#affineplanevec3topolar). **Parameters:** - *magnitude* @@ -4165,11 +4211,11 @@ See also [affineplane.vec3.toPolar](#affineplanevec3toPolar). Source: [fromPolar.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/fromPolar.js) - -## affineplane.vec3.fromSpherical(magnitude, roll, pitch) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[fromSpherical](#affineplanevec3fromspherical)(magnitude, roll, pitch) Create a vector from spherical polar coordinates. -See also [affineplane.vec3.toSpherical](#affineplanevec3toSpherical). +See also [affineplane.vec3.toSpherical](#affineplanevec3tospherical). **Parameters:** - *magnitude* @@ -4185,7 +4231,7 @@ See also [affineplane.vec3.toSpherical](#affineplanevec3toSpherical). Source: [fromSpherical.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/fromSpherical.js) -## affineplane.vec3.invert(v) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[invert](#affineplanevec3invert)(v) Get the vector -v. @@ -4201,7 +4247,7 @@ Aliases: [affineplane.vec3.negate](#affineplanevec3negate) Source: [invert.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/invert.js) -## affineplane.vec3.magnitude(v) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[magnitude](#affineplanevec3magnitude)(v) The euclidean length of the vector. @@ -4215,14 +4261,21 @@ The euclidean length of the vector. Source: [magnitude.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/magnitude.js) -## affineplane.vec3.negate +## [affineplane](#affineplane).[vec3](#affineplanevec3).[negate](#affineplanevec3negate) Alias of [affineplane.vec3.invert](#affineplanevec3invert) Source: [invert.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/invert.js) - -## affineplane.vec3.projectTo(vec, plane) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[normalize](#affineplanevec3normalize) + +Alias of [affineplane.vec3.unit](#affineplanevec3unit) + +Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/unit.js) + + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[projectTo](#affineplanevec3projectto)(vec, plane) Project a 3D vector onto a 2D plane orthogonally. We cannot project 3D vectors perspectively because @@ -4241,8 +4294,8 @@ for perspective projection of a vector with fixed position. Source: [projectTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/projectTo.js) - -## affineplane.vec3.rotateBy(v, roll[, pitch]) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[rotateBy](#affineplanevec3rotateby)(v, roll[, pitch]) Rotate vector by the given radian angles. Roll is applied before pitch. @@ -4260,8 +4313,8 @@ Roll is applied before pitch. Source: [rotateBy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/rotateBy.js) - -## affineplane.vec3.rotateBy(v, roll[, pitch]) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[rotateBy](#affineplanevec3rotateby)(v, roll[, pitch]) Rotate vector so that it points to the given radian angles. The vector magnitude is preserved. @@ -4280,9 +4333,10 @@ Roll is applied before pitch. Source: [rotateTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/rotateTo.js) - -## affineplane.vec3.scaleBy(vec, multiplier) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[scaleBy](#affineplanevec3scaleby)(vec, multiplier) +The scalar multiplication of a vector. Scale the vector by a multiplier. The direction of the vector does not change. @@ -4297,8 +4351,8 @@ The direction of the vector does not change. Source: [scaleBy.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/scaleBy.js) - -## affineplane.vec3.scaleTo(vec, magnitude) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[scaleTo](#affineplanevec3scaleto)(vec, magnitude) Scale the vector to a certain length. The direction of the vector does not change. @@ -4316,7 +4370,7 @@ As an exception, zero vector length remains zero. Source: [scaleTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/scaleTo.js) -## affineplane.vec3.sum(vs) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[sum](#affineplanevec3sum)(vs) Add an array of vectors together. See [affineplane.vec3.add](#affineplanevec3add) to add two vectors together. @@ -4330,8 +4384,8 @@ See [affineplane.vec3.add](#affineplanevec3add) to add two vectors together. Source: [sum.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/sum.js) - -## affineplane.vec3.toArray(v) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[toArray](#affineplanevec3toarray)(v) Convert vector to array with elements `[x, y, z]`. @@ -4344,8 +4398,8 @@ Convert vector to array with elements `[x, y, z]`. Source: [toArray.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/toArray.js) - -## affineplane.vec3.toPolar(v) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[toPolar](#affineplanevec3topolar)(v) Get cylindrical polar coordinates of a vector. @@ -4364,11 +4418,11 @@ Get cylindrical polar coordinates of a vector. Source: [toPolar.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/toPolar.js) - -## affineplane.vec3.toSpherical(v) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[toSpherical](#affineplanevec3tospherical)(v) Get spherical polar coordinates for a vector. -See also [affineplane.vec3.fromSpherical](#affineplanevec3fromSpherical). +See also [affineplane.vec3.fromSpherical](#affineplanevec3fromspherical). **Parameters:** - *v* @@ -4385,8 +4439,8 @@ See also [affineplane.vec3.fromSpherical](#affineplanevec3fromSpherical). Source: [toSpherical.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/toSpherical.js) - -## affineplane.vec3.transitFrom(vec, plane) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[transitFrom](#affineplanevec3transitfrom)(vec, plane) Represent the vector on the reference plane without losing information. @@ -4403,8 +4457,8 @@ Note that plane translation does not affect vectors. Source: [transitFrom.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/transitFrom.js) - -## affineplane.vec3.transitTo(vec, plane) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[transitTo](#affineplanevec3transitto)(vec, plane) Represent the vec on the target plane without losing information. @@ -4421,7 +4475,7 @@ without losing information. Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/transitTo.js) -## affineplane.vec3.unit(v) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[unit](#affineplanevec3unit)(v) Get unit vector parallel to the given vector. The magnitude of unit vector is equal to one. @@ -4434,10 +4488,12 @@ If zero vector is given, assume direction towards positive x. **Returns:** - a [vec3](#affineplanevec3), magnitude of one. +Aliases: [affineplane.vec3.normalize](#affineplanevec3normalize) + Source: [unit.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/unit.js) -## affineplane.vec3.validate(v) +## [affineplane](#affineplane).[vec3](#affineplanevec3).[validate](#affineplanevec3validate)(v) Check if object is a valid [vec3](#affineplanevec3). @@ -4451,21 +4507,21 @@ Check if object is a valid [vec3](#affineplanevec3). Source: [validate.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/validate.js) -## affineplane.vector2 +## [affineplane](#affineplane).[vector2](#affineplanevector2) Alias of [affineplane.vec2](#affineplanevec2) Source: [vec2/index.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/index.js) -## affineplane.vector3 +## [affineplane](#affineplane).[vector3](#affineplanevector3) Alias of [affineplane.vec3](#affineplanevec3) Source: [vec3/index.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/index.js) -## affineplane.version +## [affineplane](#affineplane).[version](#affineplaneversion) Package version string, for example `'1.2.3'`. Uses semantic versioning. diff --git a/package.json b/package.json index dd2b1a70..a8f163a6 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "standard": "^17.0.0", "tap-spec": "^5.0.0", "tape": "^5.6.0", - "yamdog": "^1.3.1" + "yamdog": "^1.4.0" }, "scripts": { "lint": "standard index.js 'lib/**/*.js' 'test/**/*.js'", From 93d9984a3e4f74c1fff18bee437d04c479067b6f Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:00:34 +0300 Subject: [PATCH 17/26] vec2 vec3 diff alias subtract --- lib/vec2/difference.js | 2 +- lib/vec2/index.js | 7 ++++++- lib/vec3/index.js | 5 +++-- test/vec2/difference.test.js | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/vec2/difference.js b/lib/vec2/difference.js index e6ab82e5..76b72210 100644 --- a/lib/vec2/difference.js +++ b/lib/vec2/difference.js @@ -1,7 +1,7 @@ module.exports = (v, w) => { // affineplane.vec2.difference(v, w) // - // A vector between v and w. + // A vector between v and w, in other words, v - w. // // Parameters: // v diff --git a/lib/vec2/index.js b/lib/vec2/index.js index d5d1deff..f13758fd 100644 --- a/lib/vec2/index.js +++ b/lib/vec2/index.js @@ -16,7 +16,10 @@ exports.create = require('./create') exports.cross = require('./cross') -exports.difference = require('./difference') +exports.diff = require('./difference') +exports.difference = exports.diff + +exports.divide = require('./divide') // exports.distance // Vectors do not have distance. See magnitude. @@ -60,6 +63,8 @@ exports.rotateTo = require('./rotateTo') exports.scaleBy = require('./scaleBy') exports.scaleTo = require('./scaleTo') +exports.subtract = exports.diff + exports.sum = require('./sum') exports.toArray = require('./toArray') diff --git a/lib/vec3/index.js b/lib/vec3/index.js index ac8c1dd0..248951d6 100644 --- a/lib/vec3/index.js +++ b/lib/vec3/index.js @@ -9,8 +9,8 @@ exports.average = require('./average') exports.copy = require('./copy') exports.create = require('./create') exports.cross = require('./cross') -exports.difference = require('./difference') -exports.diff = exports.difference +exports.diff = require('./difference') +exports.difference = exports.diff exports.dot = require('./dot') exports.equal = require('./equal') exports.fromArray = require('./fromArray') @@ -27,6 +27,7 @@ exports.rotateBy = require('./rotateBy') exports.rotateTo = require('./rotateTo') exports.scaleBy = require('./scaleBy') exports.scaleTo = require('./scaleTo') +exports.subtract = exports.diff exports.sum = require('./sum') exports.toArray = require('./toArray') exports.toPolar = require('./toPolar') diff --git a/test/vec2/difference.test.js b/test/vec2/difference.test.js index 6cc54ec6..2e1e9bf3 100644 --- a/test/vec2/difference.test.js +++ b/test/vec2/difference.test.js @@ -13,7 +13,7 @@ module.exports = (ts) => { ) t.almostEqual( - vec2.difference( + vec2.subtract( { x: 1, y: 0 }, { x: 2, y: 1 } ), From da66a46161eefeade37a814aa4bba7f288cc0bdf Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:02:37 +0300 Subject: [PATCH 18/26] bugfix vec3 difference direction --- lib/vec3/difference.js | 11 ++++++----- test/vec3/difference.test.js | 34 ++++++++++++++++++++++++++++++++++ test/vec3/index.test.js | 1 + 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 test/vec3/difference.test.js diff --git a/lib/vec3/difference.js b/lib/vec3/difference.js index 90dfb75f..370a2eaf 100644 --- a/lib/vec3/difference.js +++ b/lib/vec3/difference.js @@ -1,10 +1,11 @@ module.exports = (v, w) => { // affineplane.vec3.difference(v, w) // affineplane.vec3.diff(v, w) + // affineplane.vec3.subtract // - // Get the vector w - v. In other words, if we place v, w + // Get the vector v - w. In other words, if we place v, w // to begin from the same point then the result is a vector - // from the end of v to the end of w. + // from the end of w to the end of v. // // Parameters: // v @@ -16,8 +17,8 @@ module.exports = (v, w) => { // a vec3 // return { - x: w.x - v.x, - y: w.y - v.y, - z: w.z - v.z + x: v.x - w.x, + y: v.y - w.y, + z: v.z - w.z } } diff --git a/test/vec3/difference.test.js b/test/vec3/difference.test.js new file mode 100644 index 00000000..4bc963bd --- /dev/null +++ b/test/vec3/difference.test.js @@ -0,0 +1,34 @@ +const affineplane = require('../../index') +const vec3 = affineplane.vec3 + +module.exports = (ts) => { + ts.test('case: basic diff', (t) => { + t.almostEqual( + vec3.difference( + { x: 0, y: 0, z: 0 }, + { x: 0, y: 0, z: 0 } + ), + { x: 0, y: 0, z: 0 }, + 'zero vectors' + ) + + t.almostEqual( + vec3.subtract( + { x: 1, y: 0, z: -1 }, + { x: 2, y: 1, z: 0 } + ), + { x: -1, y: -1, z: -1 }, + 'simple diff a - b' + ) + + t.almostEqual( + vec3.diff( + { x: 1, y: 2, z: 2 }, + { x: 2, y: 1, z: 0 } + ), + { x: -1, y: 1, z: 2 } + ) + + t.end() + }) +} diff --git a/test/vec3/index.test.js b/test/vec3/index.test.js index e4313bc7..12709772 100644 --- a/test/vec3/index.test.js +++ b/test/vec3/index.test.js @@ -1,6 +1,7 @@ // A unit for each method. const units = { cross: require('./cross.test'), + difference: require('./difference.test'), dot: require('./dot.test'), equal: require('./equal.test'), fromPolar: require('./fromPolar.test'), From 5d540e6adb5f3c148e4b350df21dff137e854952 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:03:03 +0300 Subject: [PATCH 19/26] bugfix point3 vec3 usage --- lib/point3/difference.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/point3/difference.js b/lib/point3/difference.js index 2816cdad..afb3c4dc 100644 --- a/lib/point3/difference.js +++ b/lib/point3/difference.js @@ -1,4 +1,5 @@ // affineplane.point3.difference(p, q) +// affineplane.point3.diff // affineplane.point3.delta // // A vector from point p to point q. @@ -12,4 +13,13 @@ // Return // a vec3 // -module.exports = require('../vec3/difference') +module.exports = (p, q) => { + // Inverse of vector subtraction -(p - q) + return { + x: q.x - p.x, + y: q.y - p.y, + z: q.z - p.z + } +} + +require('../vec3/difference') From 92d1ee2dd4e890148aaf6181ca157893619e8c24 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:04:12 +0300 Subject: [PATCH 20/26] alias point2 point3 .diff .delta --- lib/point2/difference.js | 1 + lib/point2/index.js | 1 + lib/point3/index.js | 1 + 3 files changed, 3 insertions(+) diff --git a/lib/point2/difference.js b/lib/point2/difference.js index 05a71414..9b2b8d0c 100644 --- a/lib/point2/difference.js +++ b/lib/point2/difference.js @@ -1,5 +1,6 @@ module.exports = (p, q) => { // affineplane.point2.difference(p, q) + // affineplane.point2.diff // affineplane.point2.delta // // A vector from point p to point q. diff --git a/lib/point2/index.js b/lib/point2/index.js index 76252592..dabb6c99 100644 --- a/lib/point2/index.js +++ b/lib/point2/index.js @@ -18,6 +18,7 @@ exports.copy = require('./copy') exports.create = require('./create') exports.delta = require('./difference') +exports.diff = exports.delta exports.difference = exports.delta exports.distance = require('./distance') diff --git a/lib/point3/index.js b/lib/point3/index.js index 89f7bc21..6322a8ee 100644 --- a/lib/point3/index.js +++ b/lib/point3/index.js @@ -9,6 +9,7 @@ exports.copy = require('./copy') exports.clone = exports.copy exports.create = require('./create') exports.delta = require('./difference') +exports.diff = exports.delta exports.difference = exports.delta exports.distance = require('./distance') exports.equal = require('./equal') From e722fbe5fc9d9435a408a109b1692d32e6c65439 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:30:13 +0300 Subject: [PATCH 21/26] impl vec2 vec3 divide --- lib/vec2/divide.js | 28 ++++++++++++++++++++++++++++ lib/vec3/divide.js | 25 +++++++++++++++++++++++++ lib/vec3/index.js | 1 + test/vec2/divide.test.js | 30 ++++++++++++++++++++++++++++++ test/vec2/index.test.js | 1 + test/vec3/divide.test.js | 30 ++++++++++++++++++++++++++++++ test/vec3/index.test.js | 1 + 7 files changed, 116 insertions(+) create mode 100644 lib/vec2/divide.js create mode 100644 lib/vec3/divide.js create mode 100644 test/vec2/divide.test.js create mode 100644 test/vec3/divide.test.js diff --git a/lib/vec2/divide.js b/lib/vec2/divide.js new file mode 100644 index 00000000..e5bc9f4b --- /dev/null +++ b/lib/vec2/divide.js @@ -0,0 +1,28 @@ +module.exports = (vec, divisor) => { + // affineplane.vec2.divide(vec, divisor) + // + // The division of a vector. + // Equivalent to multiplying the vector by the inverse of the divisor. + // The direction of the vector does not change. + // + // Parameters: + // vec + // a vec2 + // divisor + // a number + // + // Return + // a vec2 + // + // Throws: + // if zero divisor + // + + if (divisor === 0) { + throw new Error('Cannot divide vector by zero. Vectors must be finite.') + } + return { + x: vec.x / divisor, + y: vec.y / divisor + } +} diff --git a/lib/vec3/divide.js b/lib/vec3/divide.js new file mode 100644 index 00000000..c837a42b --- /dev/null +++ b/lib/vec3/divide.js @@ -0,0 +1,25 @@ +module.exports = (vec, divisor) => { + // affineplane.vec3.divide(vec, divisor) + // + // The division of a vector. + // Equivalent to multiplying the vector by the inverse of the divisor. + // The direction of the vector does not change. + // + // Parameters: + // vec + // a vec3 + // divisor + // a number. If zero, will result a vector having infinite length. + // + // Return + // a vec3 + // + if (divisor === 0) { + throw new Error('Cannot divide vector by zero. Vectors must be finite.') + } + return { + x: vec.x / divisor, + y: vec.y / divisor, + z: vec.z / divisor + } +} diff --git a/lib/vec3/index.js b/lib/vec3/index.js index 248951d6..d587b25e 100644 --- a/lib/vec3/index.js +++ b/lib/vec3/index.js @@ -11,6 +11,7 @@ exports.create = require('./create') exports.cross = require('./cross') exports.diff = require('./difference') exports.difference = exports.diff +exports.divide = require('./divide') exports.dot = require('./dot') exports.equal = require('./equal') exports.fromArray = require('./fromArray') diff --git a/test/vec2/divide.test.js b/test/vec2/divide.test.js new file mode 100644 index 00000000..1325b2f9 --- /dev/null +++ b/test/vec2/divide.test.js @@ -0,0 +1,30 @@ +const affineplane = require('../../index') +const vec2 = affineplane.vec2 + +module.exports = (ts) => { + ts.test('case: basic division', (t) => { + t.almostEqual( + vec2.divide({ x: 0, y: 0 }, 2), + { x: 0, y: 0 }, + 'zero vector remains zero' + ) + + t.almostEqual( + vec2.divide({ x: 2, y: -2 }, 2), + { x: 1, y: -1 }, + 'elements are divided' + ) + + t.almostEqual( + vec2.divide({ x: 1, y: -1 }, -1), + { x: -1, y: 1 }, + 'negative divisor' + ) + + t.throws(() => { + vec2.divide({ x: 1, y: -1 }, 0) + }, /zero/i, 'zero divisor') + + t.end() + }) +} diff --git a/test/vec2/index.test.js b/test/vec2/index.test.js index c6666f99..08d2dfc8 100644 --- a/test/vec2/index.test.js +++ b/test/vec2/index.test.js @@ -7,6 +7,7 @@ const units = { create: require('./create.test'), cross: require('./cross.test'), difference: require('./difference.test'), + divide: require('./divide.test'), dot: require('./dot.test'), equal: require('./equal.test'), fromPolar: require('./fromPolar.test'), diff --git a/test/vec3/divide.test.js b/test/vec3/divide.test.js new file mode 100644 index 00000000..e2895d4e --- /dev/null +++ b/test/vec3/divide.test.js @@ -0,0 +1,30 @@ +const affineplane = require('../../index') +const vec3 = affineplane.vec3 + +module.exports = (ts) => { + ts.test('case: basic division', (t) => { + t.almostEqual( + vec3.divide({ x: 0, y: 0, z: 0 }, 2), + { x: 0, y: 0, z: 0 }, + 'zero vector remains zero' + ) + + t.almostEqual( + vec3.divide({ x: 2, y: -2, z: 2 }, 2), + { x: 1, y: -1, z: 1 }, + 'elements are divided' + ) + + t.almostEqual( + vec3.divide({ x: 1, y: -1, z: 1 }, -1), + { x: -1, y: 1, z: -1 }, + 'negative divisor' + ) + + t.throws(() => { + vec3.divide({ x: 1, y: -1, z: 1 }, 0) + }, /zero/i, 'zero divisor') + + t.end() + }) +} diff --git a/test/vec3/index.test.js b/test/vec3/index.test.js index 12709772..3a53feef 100644 --- a/test/vec3/index.test.js +++ b/test/vec3/index.test.js @@ -2,6 +2,7 @@ const units = { cross: require('./cross.test'), difference: require('./difference.test'), + divide: require('./divide.test'), dot: require('./dot.test'), equal: require('./equal.test'), fromPolar: require('./fromPolar.test'), From d1306f984bb1dd3d1008a03d148b584dc9cd1000 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:48:59 +0300 Subject: [PATCH 22/26] add external link symbols --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f926549..92e24e97 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![License](https://img.shields.io/npm/l/affineplane)](#license) ![Dependency status](https://img.shields.io/badge/dependencies-none-lightgrey) -A functional 2D plane geometry and dynamics library for spatial 2D and 3D applications. Designed especially for scaleable and rotatable [affine geometry](https://en.wikipedia.org/wiki/Affine_space) where parallel 2D planes float in 3D space and undergo [perspective projections](https://en.wikipedia.org/wiki/3D_projection) and [basis changes](https://en.wikipedia.org/wiki/Change_of_basis). Written in JavaScript (ECMAScript 6) with a functional, immutable, class-free style. +A functional 2D plane geometry and dynamics library for spatial 2D and 3D applications. Designed especially for scaleable and rotatable [affine geometry⎋](https://en.wikipedia.org/wiki/Affine_space) where parallel 2D planes float in 3D space and undergo [perspective projections⎋](https://en.wikipedia.org/wiki/3D_projection) and [basis changes](https://en.wikipedia.org/wiki/Change_of_basis⎋). Written in JavaScript (ECMAScript 6) with a functional, immutable, class-free style. [Install](#install) - [Geometry](#geometry) - [Usage](#using-data-structures-and-functions) - [API Docs](https://axelpale.github.io/affineplane/docs/API.html) - [Contribute](#contribute) - [Github](https://github.com/axelpale/affineplane) @@ -82,7 +82,7 @@ We cannot represent geometry without a frame of reference. However, we can _tran In affineplane, we model a plane, such as [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) or [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3), using a Helmert transformation. Such transformation can represent uniform scaling, rotation around z-axis, and translation along x-, y-, and z-axis. For a plane, these properties define how to transit geometry from the coordinate system of the plane to the coordinate system of the reference. In other words, they effectively define the position of the plane with respect to the reference space. -We call this transformation from a plane to its reference a *transition*. We treat transitions as [*passive transformations*](https://en.wikipedia.org/wiki/Active_and_passive_transformation) in a sense that they do not change the geometry, only the frame of reference. On the contrary, *active transformations* act on the geometry but keep the reference as is. While [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) are passive, see [helm2](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm2) and [helm3](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm3) for active variants of the same transformation. +We call this transformation from a plane to its reference a *transition*. We treat transitions as [*passive transformations*⎋](https://en.wikipedia.org/wiki/Active_and_passive_transformation) in a sense that they do not change the geometry, only the frame of reference. On the contrary, *active transformations* act on the geometry but keep the reference as is. While [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) are passive, see [helm2](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm2) and [helm3](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm3) for active variants of the same transformation. The [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) represent the transition as an object `{a,b,x,y}` and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) as `{a,b,x,y,z}`. The `x,y,z` part of the object defines the position of the plane origin with respect to the reference origin. The `a,b` part defines the plane basis vector, where the vector length gives the scale and direction the angle in terms of the reference basis. See the illustration below for an example. From c8d65f928db23e489f69cfa7a477876f69d534ea Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Mon, 12 Sep 2022 23:54:26 +0300 Subject: [PATCH 23/26] remove external link symbols --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 92e24e97..2f926549 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![License](https://img.shields.io/npm/l/affineplane)](#license) ![Dependency status](https://img.shields.io/badge/dependencies-none-lightgrey) -A functional 2D plane geometry and dynamics library for spatial 2D and 3D applications. Designed especially for scaleable and rotatable [affine geometry⎋](https://en.wikipedia.org/wiki/Affine_space) where parallel 2D planes float in 3D space and undergo [perspective projections⎋](https://en.wikipedia.org/wiki/3D_projection) and [basis changes](https://en.wikipedia.org/wiki/Change_of_basis⎋). Written in JavaScript (ECMAScript 6) with a functional, immutable, class-free style. +A functional 2D plane geometry and dynamics library for spatial 2D and 3D applications. Designed especially for scaleable and rotatable [affine geometry](https://en.wikipedia.org/wiki/Affine_space) where parallel 2D planes float in 3D space and undergo [perspective projections](https://en.wikipedia.org/wiki/3D_projection) and [basis changes](https://en.wikipedia.org/wiki/Change_of_basis). Written in JavaScript (ECMAScript 6) with a functional, immutable, class-free style. [Install](#install) - [Geometry](#geometry) - [Usage](#using-data-structures-and-functions) - [API Docs](https://axelpale.github.io/affineplane/docs/API.html) - [Contribute](#contribute) - [Github](https://github.com/axelpale/affineplane) @@ -82,7 +82,7 @@ We cannot represent geometry without a frame of reference. However, we can _tran In affineplane, we model a plane, such as [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) or [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3), using a Helmert transformation. Such transformation can represent uniform scaling, rotation around z-axis, and translation along x-, y-, and z-axis. For a plane, these properties define how to transit geometry from the coordinate system of the plane to the coordinate system of the reference. In other words, they effectively define the position of the plane with respect to the reference space. -We call this transformation from a plane to its reference a *transition*. We treat transitions as [*passive transformations*⎋](https://en.wikipedia.org/wiki/Active_and_passive_transformation) in a sense that they do not change the geometry, only the frame of reference. On the contrary, *active transformations* act on the geometry but keep the reference as is. While [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) are passive, see [helm2](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm2) and [helm3](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm3) for active variants of the same transformation. +We call this transformation from a plane to its reference a *transition*. We treat transitions as [*passive transformations*](https://en.wikipedia.org/wiki/Active_and_passive_transformation) in a sense that they do not change the geometry, only the frame of reference. On the contrary, *active transformations* act on the geometry but keep the reference as is. While [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) are passive, see [helm2](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm2) and [helm3](https://axelpale.github.io/affineplane/docs/API.html#affineplanehelm3) for active variants of the same transformation. The [plane2](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane2) represent the transition as an object `{a,b,x,y}` and [plane3](https://axelpale.github.io/affineplane/docs/API.html#affineplaneplane3) as `{a,b,x,y,z}`. The `x,y,z` part of the object defines the position of the plane origin with respect to the reference origin. The `a,b` part defines the plane basis vector, where the vector length gives the scale and direction the angle in terms of the reference basis. See the illustration below for an example. From 365321a96eb1dc926f04545aa8a9aa88a6324028 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Tue, 13 Sep 2022 00:25:23 +0300 Subject: [PATCH 24/26] Add a few geometry images to docs --- docs/geometry_direction.png | Bin 0 -> 74330 bytes docs/geometry_point.png | Bin 0 -> 74514 bytes docs/geometry_vector.png | Bin 0 -> 74079 bytes docs/projection_distance_2d.png | Bin 0 -> 48910 bytes lib/dir2/index.js | 2 ++ lib/dist2/index.js | 2 ++ lib/point2/index.js | 2 ++ lib/vec2/index.js | 2 ++ 8 files changed, 8 insertions(+) create mode 100644 docs/geometry_direction.png create mode 100644 docs/geometry_point.png create mode 100644 docs/geometry_vector.png create mode 100644 docs/projection_distance_2d.png diff --git a/docs/geometry_direction.png b/docs/geometry_direction.png new file mode 100644 index 0000000000000000000000000000000000000000..f048a00b4e34dd3cb3b5dfa1dabca85590a4350b GIT binary patch literal 74330 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 z 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

M|= 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%0D|G0AD@&{qkB3{+jXe!>vDcM9ActarE~%{3lQ2 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 WVbF2wb|Sg}0000Ry{?2A+O6 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 literal 0 HcmV?d00001 diff --git a/lib/dir2/index.js b/lib/dir2/index.js index 963e7798..9118f700 100644 --- a/lib/dir2/index.js +++ b/lib/dir2/index.js @@ -9,6 +9,8 @@ // When a direction is transited between planes, only the rotation of // the coordinate space affects the direction. // +// ![Direction angle](docs/geometry_direction.png) +// exports.create = require('./create') exports.transitFrom = require('./transitFrom') exports.transitTo = require('./transitTo') diff --git a/lib/dist2/index.js b/lib/dist2/index.js index 70085b5a..13ffec23 100644 --- a/lib/dist2/index.js +++ b/lib/dist2/index.js @@ -5,6 +5,8 @@ // affects the distance. Rotation or translation of the plane does not // change the distance measure. // +// ![Distance transited between planes](docs/projection_distance_2d.png) +// exports.create = require('./create') exports.transitFrom = require('./transitFrom') diff --git a/lib/point2/index.js b/lib/point2/index.js index dabb6c99..284af90a 100644 --- a/lib/point2/index.js +++ b/lib/point2/index.js @@ -5,6 +5,8 @@ // although the distance between and their mean can be computed. // An affine space does not have origin; { x:0, y:0 } is not an origin. // +// ![A point](docs/geometry_point.png) +// // exports.add // Points cannot be added because no origin. diff --git a/lib/vec2/index.js b/lib/vec2/index.js index f13758fd..581886da 100644 --- a/lib/vec2/index.js +++ b/lib/vec2/index.js @@ -3,6 +3,8 @@ // // Vector is a two dimensional dynamic movent between points. // +// ![A vector](docs/geometry_vector.png) +// exports.add = require('./add') From 5beb768641672ffcbd2c9d6c21480523fe3094cd Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Tue, 13 Sep 2022 00:26:14 +0300 Subject: [PATCH 25/26] render docs --- docs/API.md | 91 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/docs/API.md b/docs/API.md index 35adecc7..2b27b108 100644 --- a/docs/API.md +++ b/docs/API.md @@ -45,6 +45,8 @@ and Pi (inclusive). When a direction is transited between planes, only the rotation of the coordinate space affects the direction. +![Direction angle](docs/geometry_direction.png) + - [affineplane.dir2.create](#affineplanedir2create) - [affineplane.dir2.transitFrom](#affineplanedir2transitfrom) - [affineplane.dir2.transitTo](#affineplanedir2transitto) @@ -110,6 +112,8 @@ If transited between planes, only a change in the coordinate scale affects the distance. Rotation or translation of the plane does not change the distance measure. +![Distance transited between planes](docs/projection_distance_2d.png) + - [affineplane.dist2.create](#affineplanedist2create) - [affineplane.dist2.transitFrom](#affineplanedist2transitfrom) - [affineplane.dist2.transitTo](#affineplanedist2transitto) @@ -2640,10 +2644,13 @@ Due to affinity, two points cannot be added together, although the distance between and their mean can be computed. An affine space does not have origin; `{ x:0, y:0 }` is not an origin. +![A point](docs/geometry_point.png) + - [affineplane.point2.average](#affineplanepoint2average) - [affineplane.point2.copy](#affineplanepoint2copy) - [affineplane.point2.create](#affineplanepoint2create) - [affineplane.point2.delta](#affineplanepoint2delta) +- [affineplane.point2.diff](#affineplanepoint2diff) - [affineplane.point2.difference](#affineplanepoint2difference) - [affineplane.point2.distance](#affineplanepoint2distance) - [affineplane.point2.equal](#affineplanepoint2equal) @@ -2715,7 +2722,14 @@ Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/point2 ## [affineplane](#affineplane).[point2](#affineplanepoint2).[delta](#affineplanepoint2delta) -Alias of [affineplane.point2.difference](#affineplanepoint2difference) +Alias of [affineplane.point2.difference](#affineplanepoint2difference), [affineplane.point2.diff](#affineplanepoint2diff) + +Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/difference.js) + + +## [affineplane](#affineplane).[point2](#affineplanepoint2).[diff](#affineplanepoint2diff) + +Alias of [affineplane.point2.difference](#affineplanepoint2difference), [affineplane.point2.delta](#affineplanepoint2delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/difference.js) @@ -2733,7 +2747,7 @@ A vector from point p to point q. **Returns:** - a [vec2](#affineplanevec2) -Aliases: [affineplane.point2.delta](#affineplanepoint2delta) +Aliases: [affineplane.point2.diff](#affineplanepoint2diff), [affineplane.point2.delta](#affineplanepoint2delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point2/difference.js) @@ -3004,6 +3018,7 @@ Three-dimensional point { x, y, z }. - [affineplane.point3.copy](#affineplanepoint3copy) - [affineplane.point3.create](#affineplanepoint3create) - [affineplane.point3.delta](#affineplanepoint3delta) +- [affineplane.point3.diff](#affineplanepoint3diff) - [affineplane.point3.difference](#affineplanepoint3difference) - [affineplane.point3.distance](#affineplanepoint3distance) - [affineplane.point3.equal](#affineplanepoint3equal) @@ -3080,7 +3095,14 @@ Source: [create.js](https://github.com/axelpale/affineplane/blob/main/lib/point3 ## [affineplane](#affineplane).[point3](#affineplanepoint3).[delta](#affineplanepoint3delta) -Alias of [affineplane.point3.difference](#affineplanepoint3difference) +Alias of [affineplane.point3.difference](#affineplanepoint3difference), [affineplane.point3.diff](#affineplanepoint3diff) + +Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/difference.js) + + +## [affineplane](#affineplane).[point3](#affineplanepoint3).[diff](#affineplanepoint3diff) + +Alias of [affineplane.point3.difference](#affineplanepoint3difference), [affineplane.point3.delta](#affineplanepoint3delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/difference.js) @@ -3098,7 +3120,7 @@ A vector from point p to point q. **Returns:** - a [vec3](#affineplanevec3) -Aliases: [affineplane.point3.delta](#affineplanepoint3delta) +Aliases: [affineplane.point3.diff](#affineplanepoint3diff), [affineplane.point3.delta](#affineplanepoint3delta) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/point3/difference.js) @@ -3471,6 +3493,8 @@ Source: [transitTo.js](https://github.com/axelpale/affineplane/blob/main/lib/siz Vector is a two dimensional dynamic movent between points. +![A vector](docs/geometry_vector.png) + Aliases: [affineplane.vector2](#affineplanevector2) - [affineplane.vec2.add](#affineplanevec2add) @@ -3480,6 +3504,7 @@ Aliases: [affineplane.vector2](#affineplanevector2) - [affineplane.vec2.create](#affineplanevec2create) - [affineplane.vec2.cross](#affineplanevec2cross) - [affineplane.vec2.difference](#affineplanevec2difference) +- [affineplane.vec2.divide](#affineplanevec2divide) - [affineplane.vec2.dot](#affineplanevec2dot) - [affineplane.vec2.equal](#affineplanevec2equal) - [affineplane.vec2.fromArray](#affineplanevec2fromarray) @@ -3609,7 +3634,7 @@ Source: [cross.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/cr ## [affineplane](#affineplane).[vec2](#affineplanevec2).[difference](#affineplanevec2difference)(v, w) -A vector between v and w. +A vector between v and w, in other words, v - w. **Parameters:** - *v* @@ -3622,6 +3647,27 @@ A vector between v and w. Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/difference.js) + +## [affineplane](#affineplane).[vec2](#affineplanevec2).[divide](#affineplanevec2divide)(vec, divisor) + +The division of a vector. +Equivalent to multiplying the vector by the inverse of the divisor. +The direction of the vector does not change. + +**Parameters:** +- *vec* + - a [vec2](#affineplanevec2) +- *divisor* + - a number + +**Returns:** +- a [vec2](#affineplanevec2) + +Throws: +- if zero divisor + +Source: [divide.js](https://github.com/axelpale/affineplane/blob/main/lib/vec2/divide.js) + ## [affineplane](#affineplane).[vec2](#affineplanevec2).[dot](#affineplanevec2dot)(v, w) @@ -3994,6 +4040,7 @@ Aliases: [affineplane.vector3](#affineplanevector3) - [affineplane.vec3.cross](#affineplanevec3cross) - [affineplane.vec3.diff](#affineplanevec3diff) - [affineplane.vec3.difference](#affineplanevec3difference) +- [affineplane.vec3.divide](#affineplanevec3divide) - [affineplane.vec3.dot](#affineplanevec3dot) - [affineplane.vec3.equal](#affineplanevec3equal) - [affineplane.vec3.fromArray](#affineplanevec3fromarray) @@ -4008,6 +4055,7 @@ Aliases: [affineplane.vector3](#affineplanevector3) - [affineplane.vec3.rotateBy](#affineplanevec3rotateby) - [affineplane.vec3.scaleBy](#affineplanevec3scaleby) - [affineplane.vec3.scaleTo](#affineplanevec3scaleto) +- [affineplane.vec3.subtract](#affineplanevec3subtract) - [affineplane.vec3.sum](#affineplanevec3sum) - [affineplane.vec3.toArray](#affineplanevec3toarray) - [affineplane.vec3.toPolar](#affineplanevec3topolar) @@ -4118,16 +4166,16 @@ Source: [cross.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/cr ## [affineplane](#affineplane).[vec3](#affineplanevec3).[diff](#affineplanevec3diff)(v, w) -Alias of [affineplane.vec3.difference](#affineplanevec3difference) +Alias of [affineplane.vec3.difference](#affineplanevec3difference), [affineplane.vec3.subtract](#affineplanevec3subtract) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/difference.js) ## [affineplane](#affineplane).[vec3](#affineplanevec3).[difference](#affineplanevec3difference)(v, w) -Get the vector w - v. In other words, if we place v, w +Get the vector v - w. In other words, if we place v, w to begin from the same point then the result is a vector -from the end of v to the end of w. +from the end of w to the end of v. **Parameters:** - *v* @@ -4138,10 +4186,28 @@ from the end of v to the end of w. **Returns:** - a [vec3](#affineplanevec3) -Aliases: [affineplane.vec3.diff](#affineplanevec3diff) +Aliases: [affineplane.vec3.diff](#affineplanevec3diff), [affineplane.vec3.subtract](#affineplanevec3subtract) Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/difference.js) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[divide](#affineplanevec3divide)(vec, divisor) + +The division of a vector. +Equivalent to multiplying the vector by the inverse of the divisor. +The direction of the vector does not change. + +**Parameters:** +- *vec* + - a [vec3](#affineplanevec3) +- *divisor* + - a number. If zero, will result a vector having infinite length. + +**Returns:** +- a [vec3](#affineplanevec3) + +Source: [divide.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/divide.js) + ## [affineplane](#affineplane).[vec3](#affineplanevec3).[dot](#affineplanevec3dot)(v, w) @@ -4369,6 +4435,13 @@ As an exception, zero vector length remains zero. Source: [scaleTo.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/scaleTo.js) + +## [affineplane](#affineplane).[vec3](#affineplanevec3).[subtract](#affineplanevec3subtract) + +Alias of [affineplane.vec3.difference](#affineplanevec3difference), [affineplane.vec3.diff](#affineplanevec3diff) + +Source: [difference.js](https://github.com/axelpale/affineplane/blob/main/lib/vec3/difference.js) + ## [affineplane](#affineplane).[vec3](#affineplanevec3).[sum](#affineplanevec3sum)(vs) From 0c00f1aea0797690e3144d9c0f0973471361d737 Mon Sep 17 00:00:00 2001 From: Akseli Palen Date: Tue, 13 Sep 2022 00:28:29 +0300 Subject: [PATCH 26/26] bump v1.4.0 --- docs/API.md | 2 +- lib/version.js | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/API.md b/docs/API.md index 2b27b108..5a5cc767 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,5 +1,5 @@ -# Affineplane API Documentation v2.3.0 +# Affineplane API Documentation v2.4.0 Welcome to affineplane API reference documentation. See also [Usage](https://axelpale.github.io/affineplane/) and [GitHub](https://github.com/axelpale/affineplane) for introduction and source code. The docs are generated with [yamdog](https://axelpale.github.io/yamdog/). diff --git a/lib/version.js b/lib/version.js index f2a966eb..77b54510 100644 --- a/lib/version.js +++ b/lib/version.js @@ -1,2 +1,2 @@ // Generated by genversion. -module.exports = '2.3.0' +module.exports = '2.4.0' diff --git a/package.json b/package.json index a8f163a6..30c8e6e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "affineplane", - "version": "2.3.0", + "version": "2.4.0", "description": "Affine plane geometry library", "keywords": [ "affine",