{"id":13455462,"url":"https://github.com/chkt/xyzw","last_synced_at":"2026-01-30T12:24:05.570Z","repository":{"id":18948658,"uuid":"22168716","full_name":"chkt/xyzw","owner":"chkt","description":"Vector, Matrix, Quaternion, Euler Angles, SLERPs, Projections, Transforms","archived":false,"fork":false,"pushed_at":"2024-12-19T12:48:38.000Z","size":689,"stargazers_count":15,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-14T10:27:33.477Z","etag":null,"topics":["complex","gauss-jordan","javascript","lerp","math","matrix","slerp","typescript","vector"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chkt.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-07-23T18:36:16.000Z","updated_at":"2025-07-22T09:33:21.000Z","dependencies_parsed_at":"2024-10-28T22:42:12.952Z","dependency_job_id":null,"html_url":"https://github.com/chkt/xyzw","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/chkt/xyzw","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkt%2Fxyzw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkt%2Fxyzw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkt%2Fxyzw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkt%2Fxyzw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chkt","download_url":"https://codeload.github.com/chkt/xyzw/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chkt%2Fxyzw/sbom","scorecard":{"id":278352,"data":{"date":"2025-08-11","repo":{"name":"github.com/chkt/xyzw","commit":"bc6cb4b8a28395f66f577cc24d3410568259c7f6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/chkt/xyzw/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/chkt/xyzw/tests.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/tests.yml:23","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-17T15:05:08.076Z","repository_id":18948658,"created_at":"2025-08-17T15:05:08.076Z","updated_at":"2025-08-17T15:05:08.076Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28912908,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T12:13:43.263Z","status":"ssl_error","status_checked_at":"2026-01-30T12:13:22.389Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["complex","gauss-jordan","javascript","lerp","math","matrix","slerp","typescript","vector"],"created_at":"2024-07-31T08:01:05.768Z","updated_at":"2026-01-30T12:24:05.554Z","avatar_url":"https://github.com/chkt.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"[![Tests](https://github.com/chkt/xyzw/workflows/tests/badge.svg)](https://github.com/chkt/onceupon/actions)\n[![Version](https://img.shields.io/npm/v/xyzw)](https://www.npmjs.com/package/@chkt/onceupon)\n![Node](https://img.shields.io/node/v/xyzw)\n![Dependencies](https://img.shields.io/librariesio/release/npm/xyzw)\n![Licence](https://img.shields.io/npm/l/xyzw)\n![Language](https://img.shields.io/github/languages/top/chkt/xyzw)\n![Size](https://img.shields.io/bundlephobia/min/xyzw)\n\n# xyzw\n\nA functional, performance oriented, comprehensive and dependencyless typescript vector algebra library.\n\n## Install\n\n```sh\nyarn install xyzw\n```\n\n## Use\n\nAll included vector algebra objects are implemented as plain object literals. \n\nAll operations yielding a non-primitive value have a capitalized *non-mutating* variant returning a new instance containing the result. \n\n```ts\nconst vec2 = vector2.Rotation(0.5 * Math.PI);   // { x : 0.0, y : 1.0 }\nconst vec3 = vector3.AxisX();                   // { x : 1.0, y : 0.0, z : 0.0 }\nconst vec4 = vector4.Create();                  // { x : 0.0, y : 0.0, z : 0.0, w : 1.0 }\nconst mat2 = matrix2.Rotation(0.5 * Math.PI);   // { r00 : 0.0, r01 : 1.0, r10 : -1.0, r11 : 0.0 }\nconst mat3 = matrix3.RotationZ(0.5 * Math.PI);  // { r00 : 0.0, r01 : 1.0, r02 : 0.0, … }\nconst mat4 = matrix4.Identity();                // …\n\nconst v = vector2.Copy(vec2);\n\nassert.notStrictEqual(vec2, v);\n```\n\nLikewise all operations yielding a non-primitive value have a same-name non-capitalized *mutating* variant taking an instance of the result type as their first argument.\nThe first argument is also the return value of the operation.\n\n```ts\nvector2.rotation(vec2, 1.0 * Math.PI);   // { x : -1.0, y : 0.0 }\nvector3.axisX(vec3, 2.0);                // { x : 2.0, y : 0.0, z : 0.0 }\nvector4.assign(vec4, 1.0);               // { x : 1.0, y : 0.0, z : 0.0, w : 1.0 }\nmatrix2.rotation(mat2, 1.0 * Math.PI);   // { r00 : -1.0, r01 : 0.0, r10 : 0.0, r11 : -1.0 }\nmatrix3.rotationZ(mat3, 1.0 * Math.PI);  // { r00 : -1.0, r01 : 1.0, r02 : 0.0, … }\nmatrix4.identity(mat4);                  // …\n\nconst w = vector2.copy(v, vec2);\n\nassert.strictEqual(w, v);\nassert.notStrictEqual(vec2, v);\n```\n\nThe fastest operations additionally have an assignment form roughly equivalent to primitive type assignment operations (`a += b`).\n\n```ts\nconst u = vector2.addAssign(v, w);  // v += w\n\nassert.strictEqual(u, v);\nassert.notStrictEqual(w, v);\n```\n# Modules\n## complex\n[`./source/complex.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/complex.ts#L1)\n### Functions\n```ts\nfunction Conjugate(z:Vector2) : Vector2;  // z̅\nfunction Divide(z:Vector2, w:Vector2) : Vector2;  // zw̅ / ww̅, z = a + bi, w = c = di\nfunction Inverse(z:Vector2) : Vector2;  // z⁻¹\nfunction Multiply(z:Vector2, w:Vector2) : Vector2;  // zw, z = a + bi, w = c + di\nfunction Power(z:Vector2, n:number) : Vector2[];  // zⁿ₍ₖ₎\nfunction argument(z:Vector2) : number;  // φ\nfunction conjugate\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;  // r⃗ = z̅\nfunction divide\u003cR extends Vector2\u003e(r:R, z:Vector2, w:Vector2) : R;  // r⃗ = zw̅ / ww̅, z = a + bi, w = c = di\nfunction inverse\u003cR extends Vector2\u003e(r:R, z:Vector2) : R;  // r⃗ = z⁻¹\nfunction multiply\u003cR extends Vector2\u003e(r:R, z:Vector2, w:Vector2) : R;  // r⃗ = zw, z = a + bi, w = c + di\nfunction power\u003cR extends Iterable\u003cundefined | Vector2, R\u003e\u003e(r:R, z:Vector2, n:number) : R;  // r⃗₍ₖ₎ = zⁿ₍ₖ₎\n```\n## index\n[`./source/index.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/index.ts#L1)\n### References\n```ts\nexport * as complex from \"./complex\";\nexport * as matrix2 from \"./matrix2\";\nexport * as matrix3 from \"./matrix3\";\nexport * as matrix4 from \"./matrix4\";\nexport * as matrix4Frustrum from \"./matrix4Frustrum\";\nexport * as matrix4Ortho from \"./matrix4Ortho\";\nexport * as vector2 from \"./vector2\";\nexport * as vector3 from \"./vector3\";\nexport * as vector4 from \"./vector4\";\n```\n## matrix2\n[`./source/matrix2.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/matrix2.ts#L1)\n### Interfaces\n```ts\ninterface Matrix2 {\n  r00 : number;\n  r01 : number;\n  r10 : number;\n  r11 : number;\n}\n```\n### Functions\n```ts\nfunction Add(a:Matrix2, b:Matrix2) : Matrix2;  // A+B\nfunction Concat(a:Matrix2, b:Matrix2) : Matrix2;  // AB\nfunction Copy(m:Matrix2) : Matrix2;\nfunction Identity() : Matrix2;  // Î\nfunction Inverse(m:Matrix2) : Matrix2 | undefined;  // M⁻¹\nfunction Rotation(rad:number) : Matrix2;  // R(θ)\nfunction RotationVector2(v:Vector2) : Matrix2;  // [ v⃗  v⃗⊥ ]\nfunction Scale(v:Vector2) : Matrix2;  // [ x̂v⃗₀  ŷv⃗₁ ]\nfunction Shear(x:Vector2, y:Vector2) : Matrix2;  // [ x⃗  y⃗ ]\n// @deprecated alias of Copy()\nfunction ShearMatrix3(m:Matrix2) : Matrix2;  // [ m⁰ m¹ ]\nfunction Subtract(a:Matrix2, b:Matrix2) : Matrix2;  // A-B\nfunction Transpose(m:Matrix2) : Matrix2;  // Mᵀ\nfunction add\u003cR extends Matrix2\u003e(r:R, a:Matrix2, b:Matrix2) : R;  // Mᵣ = A+B\nfunction addAssign\u003cR extends Matrix2\u003e(a:R, b:Matrix2) : R;  // A = A+B\nfunction concat\u003cR extends Matrix2\u003e(r:R, a:Matrix2, b:Matrix2) : R;  // Mᵣ = AB\nfunction copy\u003cR extends Matrix2\u003e(r:R, m:Matrix2) : R;\nfunction determinant(m:Matrix2) : number;  // |M|\nfunction identity\u003cR extends Matrix2\u003e(r:R) : R;  // Mᵣ = Î\nfunction inverse\u003cR extends Matrix2\u003e(r:R, m:Matrix2) : R | undefined;  // Mᵣ = M⁻¹\nfunction rotation\u003cR extends Matrix2\u003e(r:R, rad:number) : R;  // Mᵣ = R(θ)\nfunction rotationVector2\u003cR extends Matrix2\u003e(r:R, v:Vector2) : R;  // Mᵣ = [ v⃗  v⃗⊥ ]\nfunction scale\u003cR extends Matrix2\u003e(r:R, v:Vector2) : R;  // Mᵣ = [ x̂v⃗₀  ŷv⃗₁ ]\nfunction shear\u003cR extends Matrix2\u003e(r:R, x:Vector2, y:Vector2) : R;  // Mᵣ = [ x⃗  y⃗ ]\n// @deprecated alias of copy()\nfunction shearMatrix3\u003cR extends Matrix2\u003e(r:R, m:Matrix2) : R;  // Mᵣ = [ m⁰ m¹ ]\nfunction subtract\u003cR extends Matrix2\u003e(r:R, a:Matrix2, b:Matrix2) : R;  // Mᵣ = A-B\nfunction subtractAssign\u003cR extends Matrix2\u003e(a:R, b:Matrix2) : R;  // A = A-B\nfunction transpose\u003cR extends Matrix2\u003e(r:R, m:Matrix2) : R;  // Mᵣ = Mᵀ\n```\n## matrix3\n[`./source/matrix3.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/matrix3.ts#L1)\n### Interfaces\n```ts\ninterface Matrix3 extends Matrix2 {\n  r02 : number;\n  r12 : number;\n  r20 : number;\n  r21 : number;\n  r22 : number;\n}\n```\n### Functions\n```ts\nfunction Add(a:Matrix3, b:Matrix3) : Matrix3;  // A+B\nfunction Concat(a:Matrix3, b:Matrix3) : Matrix3;  // AB\nfunction Concat2x3(a:Matrix3, b:Matrix3) : Matrix3;  // AB₂ₓ₃\nfunction ConcatMatrix2(a:Matrix3, b:Matrix2) : Matrix3;  // AB₂ₓ₂\nfunction ConcatScaleVector2(m:Matrix3, v:Vector2) : Matrix3;  // M[ x̂v⃗₀  ŷv⃗₁  ẑ ]\nfunction ConcatTranslation(m:Matrix3, v:Vector2) : Matrix3;  // M[ x̂  ŷ  v⃗ ]\nfunction Copy(m:Matrix3) : Matrix3;\nfunction EulerXYZ(v:Vector3) : Matrix3;  // R(x̂, v⃗₀)R(ŷ, v⃗₁)R(ẑ, v⃗₂)\nfunction EulerYXZ(v:Vector3) : Matrix3;  // R(ŷ, v⃗₁)R(x̂, v⃗₀)R(ẑ, v⃗₂)\nfunction EulerZXY(v:Vector3) : Matrix3;  // R(ẑ, v⃗₂)R(x̂, v⃗₀)R(ŷ, v⃗₁)\nfunction Identity() : Matrix3;  // Î\nfunction Inverse(m:Matrix3) : Matrix3 | undefined;  // M⁻¹\nfunction Quaternion(q:Vector4) : Matrix3;  // R(q̂)\nfunction RotationAxis(v:Vector3, rad:number) : Matrix3;  // R(v⃗, θ)\nfunction RotationVector3(x:Vector3, y:Vector3) : Matrix3;  // [ x⃗  y⃗  x⃗×y⃗ ]\nfunction RotationX(rad:number) : Matrix3;  // R(x̂, θ)\nfunction RotationY(rad:number) : Matrix3;  // R(ŷ, θ)\nfunction RotationZ(rad:number) : Matrix3;  // R(ẑ, θ)\nfunction RotationZMatrix2(m:Matrix2) : Matrix3;  // [ m⁰ m¹ ẑ ]\nfunction RotationZVector2(x:Vector2) : Matrix3;  // [ x⃗  x⃗⊥  ẑ ]\nfunction Scale(v:Vector3) : Matrix3;  // [ x̂v⃗₀  ŷv⃗₁  ẑv⃗₂ ]\nfunction ScaleVector2(v:Vector2) : Matrix3;  // [ x̂v⃗₀  ŷv⃗₁  ẑ ]\nfunction Shear(x:Vector3, y:Vector3, z:Vector3) : Matrix3;  // [ x⃗  y⃗  z⃗ ]\n// @deprecated alias of Copy()\nfunction ShearMatrix4(m:Matrix3) : Matrix3;  // [ m⁰ m¹ m² ]\nfunction ShearTranslation(x:Vector2, y:Vector2, t:Vector2) : Matrix3;  // [ x⃗  y⃗  ẑ+t⃗ ]\nfunction ShearVector2(x:Vector2, y:Vector2) : Matrix3;  // [ x⃗  y⃗  ẑ ]\nfunction Subtract(a:Matrix3, b:Matrix3) : Matrix3;  // A-B\nfunction Translation(v:Vector2) : Matrix3;  // [ x̂  ŷ  ẑ+v⃗ ]\nfunction Transpose(m:Matrix3) : Matrix3;  // Mᵀ\nfunction add\u003cR extends Matrix3\u003e(r:R, a:Matrix3, b:Matrix3) : R;  // Mᵣ = A+B\nfunction addAssign\u003cR extends Matrix3\u003e(a:R, b:Matrix3) : R;  // A = A+B\nfunction concat\u003cR extends Matrix3\u003e(r:R, a:Matrix3, b:Matrix3) : R;  // Mᵣ = AB\nfunction concat2x3\u003cR extends Matrix3\u003e(r:R, a:Matrix3, b:Matrix3) : R;  // Mᵣ = AB₂ₓ₃\nfunction concatMatrix2\u003cR extends Matrix3\u003e(r:R, a:Matrix3, b:Matrix2) : R;  // Mᵣ = AB₂ₓ₂\nfunction concatScaleVector2\u003cR extends Matrix3\u003e(r:R, m:Matrix3, v:Vector2) : R;  // Mᵣ = M[ x̂v⃗₀  ŷv⃗₁  ẑ ]\nfunction concatTranslation\u003cR extends Matrix3\u003e(r:R, m:Matrix3, v:Vector2) : R;  // Mᵣ = M[ x̂  ŷ  v⃗ ]\nfunction copy\u003cR extends Matrix3\u003e(r:R, m:Matrix3) : R;\nfunction determinant(m:Matrix3) : number;  // |M|\nfunction equals(a:Matrix3, b:Matrix3, e:number = epsilon) : boolean;\nfunction eulerXYZ\u003cR extends Matrix3\u003e(r:R, v:Vector3) : R;  // Mᵣ = R(x̂, v⃗₀)R(ŷ, v⃗₁)R(ẑ, v⃗₂)\nfunction eulerYXZ\u003cR extends Matrix3\u003e(r:R, v:Vector3) : R;  // Mᵣ = R(ŷ, v⃗₁)R(x̂, v⃗₀)R(ẑ, v⃗₂)\nfunction eulerZXY\u003cR extends Matrix3\u003e(r:R, v:Vector3) : R;  // Mᵣ = R(ẑ, v⃗₂)R(x̂, v⃗₀)R(ŷ, v⃗₁)\nfunction identity\u003cR extends Matrix3\u003e(r:R) : R;  // Mᵣ = Î\nfunction inverse\u003cR extends Matrix3\u003e(r:R, m:Matrix3) : R | undefined;  // Mᵣ = M⁻¹\nfunction quaternion\u003cR extends Matrix3\u003e(r:R, q:Vector4) : R;  // Mᵣ = R(q̂)\nfunction rotationAxis\u003cR extends Matrix3\u003e(r:R, v:Vector3, rad:number) : R;  // Mᵣ = R(v⃗, θ)\nfunction rotationVector3\u003cR extends Matrix3\u003e(r:R, x:Vector3, y:Vector3) : R;  // Mᵣ = [ x⃗  y⃗  x⃗×y⃗ ]\nfunction rotationX\u003cR extends Matrix3\u003e(r:R, rad:number) : R;  // Mᵣ = R(x̂, θ)\nfunction rotationY\u003cR extends Matrix3\u003e(r:R, rad:number) : R;  // Mᵣ = R(ŷ, θ)\nfunction rotationZ\u003cR extends Matrix3\u003e(r:R, rad:number) : R;  // Mᵣ = R(ẑ, θ)\nfunction rotationZMatrix2\u003cR extends Matrix3\u003e(r:R, m:Matrix2) : R;  // Mᵣ = [ m⁰ m¹ ẑ ]\nfunction rotationZVector2\u003cR extends Matrix3\u003e(r:R, x:Vector2) : R;  // Mᵣ = [ x⃗  x⃗⊥  ẑ ]\nfunction scale\u003cR extends Matrix3\u003e(r:R, v:Vector3) : R;  // Mᵣ = [ x̂v⃗₀  ŷv⃗₁  ẑv⃗₂ ]\nfunction scaleVector2\u003cR extends Matrix3\u003e(r:R, v:Vector2) : R;  // Mᵣ = [ x̂v⃗₀  ŷv⃗₁  ẑ ]\nfunction shear\u003cR extends Matrix3\u003e(r:R, x:Vector3, y:Vector3, z:Vector3) : R;  // Mᵣ = [ x⃗  y⃗  z⃗ ]\n// @deprecated alias of copy()\nfunction shearMatrix4\u003cR extends Matrix3\u003e(r:R, m:Matrix3) : R;  // Mᵣ = [ m⁰ m¹ m² ]\nfunction shearTranslation\u003cR extends Matrix3\u003e(r:R, x:Vector2, y:Vector2, t:Vector2) : R;  // Mᵣ = [ x⃗  y⃗  ẑ+t⃗ ]\nfunction shearVector2\u003cR extends Matrix3\u003e(r:R, x:Vector2, y:Vector2) : R;  // Mᵣ = [ x⃗  y⃗  ẑ ]\nfunction subtract\u003cR extends Matrix3\u003e(r:R, a:Matrix3, b:Matrix3) : R;  // Mᵣ = A-B\nfunction subtractAssign\u003cR extends Matrix3\u003e(a:R, b:Matrix3) : R;  // A = A-B\nfunction translation\u003cR extends Matrix3\u003e(r:R, v:Vector2) : R;  // Mᵣ = [ x̂  ŷ  ẑ+v⃗ ]\nfunction transpose\u003cR extends Matrix3\u003e(r:R, m:Matrix3) : R;  // Mᵣ = Mᵀ\n```\n## matrix4\n[`./source/matrix4.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/matrix4.ts#L1)\n### Interfaces\n```ts\ninterface Matrix4 extends Matrix3 {\n  r03 : number;\n  r13 : number;\n  r23 : number;\n  r30 : number;\n  r31 : number;\n  r32 : number;\n  r33 : number;\n}\n```\n### Functions\n```ts\nfunction Add(a:Matrix4, b:Matrix4) : Matrix4;  // A+B\nfunction ColumnF32(n:Float32Array) : Matrix4;\nfunction ColumnF64(n:Float64Array) : Matrix4;\nfunction Concat(a:Matrix4, b:Matrix4) : Matrix4;  // AB\nfunction Concat3x4(a:Matrix4, b:Matrix4) : Matrix4;  // AB₃ₓ₄\nfunction ConcatMatrix3(a:Matrix4, b:Matrix3) : Matrix4;  // AB₃ₓ₃\nfunction ConcatScale(m:Matrix4, v:Vector3) : Matrix4;  // M[ x̂v⃗₀  ŷv⃗₁  ẑv⃗₂  ŵ ]\nfunction ConcatTranslation(m:Matrix4, v:Vector3) : Matrix4;  // M[ x̂  ŷ  ẑ  ŵ+v⃗ ]\nfunction Copy(m:Matrix4) : Matrix4;\nfunction Identity() : Matrix4;  // Î\nfunction Inverse(m:Matrix4) : Matrix4 | undefined;  // M⁻¹ (using the determinant)\nfunction Inverse3x4(m:Matrix4) : Matrix4 | undefined;  // [ m⁰ m¹ m² ŵ+m³ ]⁻¹\nfunction InverseGauss(m:Matrix4) : Matrix4 | undefined;  // M⁻¹ (using Gauss-Jordon elimination)\nfunction ShearMatrix3(m:Matrix3) : Matrix4;  // [ m⁰ m¹ m² ŵ ]\n// @deprecated alias of ShearTranslationAxes()\nfunction ShearTranslation(x:Vector3, y:Vector3, z:Vector3, t:Vector3) : Matrix4;  // [ x⃗  y⃗  z⃗  ŵ+t⃗ ]\nfunction ShearTranslationAxes(x:Vector3, y:Vector3, z:Vector3, t:Vector3) : Matrix4;  // [ x⃗  y⃗  z⃗  ŵ+t⃗ ]\nfunction ShearTranslationMatrix3(m:Matrix3, t:Vector3) : Matrix4;  // [ m⁰ m¹ m² ŵ+t⃗ ]\nfunction Subtract(a:Matrix4, b:Matrix4) : Matrix4;  // A-B\nfunction Translation(v:Vector3) : Matrix4;  // [ x̂  ŷ  ẑ  ŵ+v⃗ ]\nfunction Transpose(m:Matrix4) : Matrix4;  // Mᵀ\nfunction add\u003cR extends Matrix4\u003e(r:R, a:Matrix4, b:Matrix4) : R;  // Mᵣ = A+B\nfunction addAssign\u003cR extends Matrix4\u003e(a:R, b:Matrix4) : R;  // A = A+B\nfunction assignColumnF32(r:Float32Array, m:Matrix4) : Float32Array;\nfunction assignColumnF64(r:Float64Array, m:Matrix4) : Float64Array;\nfunction columnF32\u003cR extends Matrix4\u003e(r:R, n:Float32Array) : R;\nfunction columnF64\u003cR extends Matrix4\u003e(r:R, n:Float64Array) : R;\nfunction concat\u003cR extends Matrix4\u003e(r:R, a:Matrix4, b:Matrix4) : R;  // Mᵣ = AB\nfunction concat3x4\u003cR extends Matrix4\u003e(r:R, a:Matrix4, b:Matrix4) : R;  // Mᵣ = AB₃ₓ₄\nfunction concatMatrix3\u003cR extends Matrix4\u003e(r:R, a:Matrix4, b:Matrix3) : R;  // Mᵣ = AB₃ₓ₃\nfunction concatScale\u003cR extends Matrix4\u003e(r:R, m:Matrix4, v:Vector3) : R;  // Mᵣ = M[ x̂v⃗₀  ŷv⃗₁  ẑv⃗₂  ŵ ]\nfunction concatTranslation\u003cR extends Matrix4\u003e(r:R, m:Matrix4, v:Vector3) : R;  // Mᵣ = M[ x̂  ŷ  ẑ  ŵ+v⃗ ]\nfunction copy\u003cR extends Matrix4\u003e(r:R, m:Matrix4) : R;\nfunction determinant(m:Matrix4) : number;  // |M|\nfunction equals(a:Matrix4, b:Matrix4, e:number = epsilon) : boolean;\nfunction identity\u003cR extends Matrix4\u003e(r:R) : R;  // Mᵣ = Î\nfunction inverse\u003cR extends Matrix4\u003e(r:R, m:Matrix4) : R | undefined;  // Mᵣ = M⁻¹ (using the determinant)\nfunction inverse3x4\u003cR extends Matrix4\u003e(r:R, m:Matrix4) : R | undefined;  // Mᵣ = [ m⁰ m¹ m² ŵ+m³ ]⁻¹\nfunction inverseGauss\u003cR extends Matrix4\u003e(r:R, m:Matrix4) : R | undefined;  // Mᵣ = M⁻¹ (using Gauss-Jordan elimination)\nfunction shearMatrix3\u003cR extends Matrix4\u003e(r:R, m:Matrix3) : R;  // Mᵣ = [ m⁰ m¹ m² ŵ ]\n// @deprecated alias of shearTranslationAxes()\nfunction shearTranslation\u003cR extends Matrix4\u003e(r:R, x:Vector3, y:Vector3, z:Vector3, t:Vector3) : R;  // Mᵣ = [ x⃗  y⃗  z⃗  ŵ+t⃗ ]\nfunction shearTranslationAxes\u003cR extends Matrix4\u003e(r:R, x:Vector3, y:Vector3, z:Vector3, t:Vector3) : R;\nfunction shearTranslationMatrix3\u003cR extends Matrix4\u003e(r:R, m:Matrix3, t:Vector3) : R;  // Mᵣ = [ m⁰ m¹ m² ŵ+t⃗ ]\nfunction subtract\u003cR extends Matrix4\u003e(r:R, a:Matrix4, b:Matrix4) : R;  // Mᵣ = A-B\nfunction subtractAssign\u003cR extends Matrix4\u003e(a:R, b:Matrix4) : R;  // A = A-B\nfunction toColumnF32(m:Matrix4) : Float32Array;\nfunction toColumnF64(m:Matrix4) : Float64Array;\nfunction translation\u003cR extends Matrix4\u003e(r:R, v:Vector3) : R;  // Mᵣ = [ x̂  ŷ  ẑ  ŵ+v⃗ ]\nfunction transpose\u003cR extends Matrix4\u003e(r:R, m:Matrix4) : R;  // Mᵣ = Mᵀ\n```\n## matrix4Frustrum\n[`./source/matrix4Frustrum.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/matrix4Frustrum.ts#L1)\n### Interfaces\n```ts\ninterface PerspectiveLens {\n  readonly aspect : number;\n  readonly far : number;\n  readonly fov : number;\n  readonly near : number;\n}\n```\n### Functions\n```ts\nfunction Frustrum(lens:PerspectiveLens) : Matrix4;\nfunction frustrum\u003cR extends Matrix4\u003e(r:R, lens:PerspectiveLens) : R;\n```\n## matrix4Ortho\n[`./source/matrix4Ortho.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/matrix4Ortho.ts#L1)\n### Interfaces\n```ts\ninterface OrthographicLens {\n  readonly aspect : number;\n  readonly extend : number;\n  readonly far : number;\n  readonly near : number;\n}\n```\n### Functions\n```ts\nfunction Ortho(lens:OrthographicLens) : Matrix4;\nfunction ortho\u003cR extends Matrix4\u003e(r:R, lens:OrthographicLens) : R;\n```\n## strings\n[`./source/strings.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/strings.ts#L1)\n### Interfaces\n```ts\ninterface StringifyOptions\u003cT\u003e extends StringifyOptionsCommon {\n  readonly clampMax : VectorRecord\u003cT\u003e;\n  readonly clampMin : VectorRecord\u003cT\u003e;\n}\n```\n### Type Aliases\n```ts\ntype stringify\u003cT\u003e = (v:VectorRecord\u003cT\u003e) =\u003e string;\n```\n### Variables\n```ts\nconst PRECISION_SAFE:number;\nconst stringifyDefaultsCommon:StringifyOptionsCommon;\n```\n### Functions\n```ts\nfunction stringify\u003cT\u003e(opts:StringifyOptions\u003cT\u003e, v:VectorRecord\u003cT\u003e) : string;\n```\n## vector2\n[`./source/vector2.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/vector2.ts#L1)\n### Interfaces\n```ts\ninterface Vector2 {\n  x : number;\n  y : number;\n}\n```\n### Functions\n```ts\nfunction Add(v:Vector2, w:Vector2) : Vector2;  // v⃗+w⃗\nfunction AxisX(s:number = 1.0) : Vector2;  // sx̂\nfunction AxisY(s:number = 1.0) : Vector2;  // sŷ\nfunction BarycentricUV(vx0:Vector2, vx1:Vector2, vx2:Vector2, u:number, v:number) : Vector2;  // Return the point represented by barycentric coordinates (u, v) in ↻ triangle (vx0, vx1, vx2)\nfunction Copy(v:Vector2) : Vector2;\nfunction Create(x:number = 0.0, y:number = 0.0) : Vector2;\nfunction Hadamard(v:Vector2, w:Vector2) : Vector2;  // v⃗⊙w⃗\nfunction HadamardInvert(v:Vector2) : Vector2;  // 1⁄v⃗\nfunction Lerp(v:Vector2, w:Vector2, t:number) : Vector2;  // v⃗ + ( w⃗ - v⃗ ) * t\nfunction Multiply2x3Matrix3(m:Matrix3, v:Vector2) : Vector2;  // M₂ₓ₃v⃗\nfunction MultiplyMatrix2(m:Matrix2, v:Vector2) : Vector2;  // M₂ₓ₂v⃗\nfunction MultiplyMatrix3(m:Matrix3, v:Vector2) : Vector2;  // M₃ₓ₃v⃗\nfunction MultiplyScalar(v:Vector2, n:number) : Vector2;  // nv⃗\nfunction Negate(v:Vector2) : Vector2;  // -v⃗\nfunction Normalize(v:Vector2) : Vector2;  // v̂\nfunction Perpendicular(v:Vector2) : Vector2;  // v⃗⊥\nfunction Project(v:Vector2, w:Vector2) : Vector2;  // Return the projection of w⃗ onto v⃗, (v⃗w⃗ / ‖ v⃗ ‖²)v⃗\nfunction Reflect(v:Vector2, w:Vector2) : Vector2;  // Return the reflection of w⃗ against v⃗, 2(v⃗⋅w⃗ )w⃗-v⃗\nfunction Rotation(rad:number) : Vector2;\nfunction Subtract(v:Vector2, w:Vector2) : Vector2;  // v⃗-w⃗\nfunction add\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2) : R;  // r⃗ = v⃗+w⃗\nfunction addAssign\u003cR extends Vector2\u003e(v:R, w:Vector2) : R;  // v⃗ = v⃗+w⃗\nfunction assign\u003cR extends Vector2\u003e(r:R, x:number = 0.0, y:number = 0.0) : R;\nfunction axisX\u003cR extends Vector2\u003e(r:R, s:number = 1.0) : R;  // r⃗ = sx̂\nfunction axisY\u003cR extends Vector2\u003e(r:R, s:number = 1.0) : R;  // r⃗ = sŷ\nfunction barycentricUV\u003cR extends Vector2\u003e(r:R, vx0:Vector2, vx1:Vector2, vx2:Vector2, u:number, v:number) : R;  // Assign the point represented by barycentric coordinates (u, v) in ↻ triangle (vx0, vx1, vx2) to r⃗\nfunction copy\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;\nfunction createStringifier(opts?:Partial\u003cStringifyOptions\u003cVector2\u003e\u003e) : stringify\u003cVector2\u003e;\nfunction cross(v:Vector2, w:Vector2) : number;  // v⃗×w⃗\nfunction dot(v:Vector2, w:Vector2) : number;  // v⃗⋅w⃗\nfunction equals(v:Vector2, w:Vector2, e:number = epsilon) : boolean;\nfunction hadamard\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2) : R;  // r⃗ = v⃗⊙w⃗\nfunction hadamardAssign\u003cR extends Vector2\u003e(v:R, w:Vector2) : R;  // v⃗ = v⃗⊙w⃗\nfunction hadamardInvert\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;  // r⃗ = 1⁄v⃗\nfunction isNormEqual(v:Vector2, n:number, e:number = epsilon) : boolean;  // ‖ v⃗ ‖ - n \u003c ϵ\nfunction isNormGt(v:Vector2, n:number) : boolean;  // ‖ v⃗ ‖ \u003e n\nfunction isNormLt(v:Vector2, n:number) : boolean;  // ‖ v⃗ ‖ \u003c n\nfunction lerp\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2, t:number) : R;  // r⃗ = v⃗ + (w⃗ - v⃗ ) * t\nfunction lerpAssign\u003cR extends Vector2\u003e(v:R, w:Vector2, t:number) : R;  // v⃗ = v⃗ + (w⃗ - v⃗ ) * t\nfunction multiply2x3Matrix3\u003cR extends Vector2\u003e(r:R, m:Matrix3, v:Vector2) : R;  // r⃗ = M₂ₓ₃v⃗\nfunction multiplyAssignScalar\u003cR extends Vector2\u003e(v:R, n:number) : R;  // v⃗ = nv⃗\nfunction multiplyMatrix2\u003cR extends Vector2\u003e(r:R, m:Matrix2, v:Vector2) : R;  // r⃗ = M₂ₓ₂v⃗\nfunction multiplyMatrix3\u003cR extends Vector2\u003e(r:R, m:Matrix3, v:Vector2) : R;  // r⃗ = M₃ₓ₃v⃗\nfunction multiplyScalar\u003cR extends Vector2\u003e(r:R, v:Vector2, n:number) : R;  // r⃗ = nv⃗\nfunction negate\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;  // r⃗ = -v⃗\nfunction negateAssign\u003cR extends Vector2\u003e(v:R) : R;  // v⃗ = -v⃗\nfunction norm(v:Vector2) : number;  // ‖ v⃗ ‖\nfunction normSquared(v:Vector2) : number;  // ‖ v⃗ ‖²\nfunction normalize\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;  // r⃗ = v̂\nfunction perpendicular\u003cR extends Vector2\u003e(r:R, v:Vector2) : R;  // r⃗ = v⃗⊥\nfunction project\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2) : R;  // Assign the projection of w⃗ onto v⃗ to r⃗, r⃗ = (v⃗w⃗ / ‖ v⃗ ‖²)v⃗\nfunction radians(v:Vector2, w:Vector2) : number;  // acos(v⃗⋅w⃗ )\nfunction reflect\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2) : R;  // Assign the reflection of w⃗ against v⃗, r⃗ = 2(v⃗⋅w⃗ )w⃗-v⃗\nfunction rotation\u003cR extends Vector2\u003e(r:R, rad:number) : R;\nfunction subtract\u003cR extends Vector2\u003e(r:R, v:Vector2, w:Vector2) : R;  // r⃗ = v⃗-w⃗\nfunction subtractAssign\u003cR extends Vector2\u003e(v:R, w:Vector2) : R;  // v⃗ = v⃗-w⃗\n```\n## vector3\n[`./source/vector3.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/vector3.ts#L1)\n### Interfaces\n```ts\ninterface Vector3 extends Vector2 {\n  z : number;\n}\n```\n### Functions\n```ts\nfunction Add(v:Vector3, w:Vector3) : Vector3;  // v⃗+w⃗\nfunction AxisX(s:number = 1.0) : Vector3;  // sx̂\nfunction AxisY(s:number = 1.0) : Vector3;  // sŷ\nfunction AxisZ(s:number = 1.0) : Vector3;  // sẑ\nfunction BarycentricUV(vx0:Vector3, vx1:Vector3, vx2:Vector3, u:number, v:number) : Vector3;  // Return the point represented by barycentric coordinates (u, v) in ↻ triangle (vx0, vx1, vx2)\n// @deprecated use same function in xyzw-rgba instead\nfunction ClampScalar(v:Vector3, a:number, b:number) : Vector3;  // min(max(v⃗, min(a, b)), max(a, b))\nfunction Copy(v:Vector3) : Vector3;\nfunction Create(x:number = 0.0, y:number = 0.0, z:number = 0.0) : Vector3;\nfunction Cross(v:Vector3, w:Vector3) : Vector3;  // v⃗×w⃗\nfunction EulerXYZ(m:Matrix3) : Vector3;\nfunction EulerYXZ(m:Matrix3) : Vector3;\nfunction EulerZXY(m:Matrix3) : Vector3;\nfunction F32(n:Float32Array, offset:number = 0) : Vector3;\nfunction F64(n:Float64Array, offset:number = 0) : Vector3;\nfunction Hadamard(v:Vector3, w:Vector3) : Vector3;  // v⃗⊙w⃗\nfunction HadamardInvert(v:Vector3) : Vector3;  // 1⁄v⃗\nfunction Lerp(v:Vector3, w:Vector3, t:number) : Vector3;  // v⃗ + ( w⃗ - v⃗ ) * t\n// @deprecated use same function in xyzw-rgba instead\nfunction MaxScalar(v:Vector3, n:number) : Vector3;  // max(v⃗, n)\n// @deprecated use same function in xyzw-rgba instead\nfunction MinScalar(v:Vector3, n:number) : Vector3;  // min(v⃗, n)\nfunction Multiply3x4Matrix4(m:Matrix4, v:Vector3) : Vector3;  // M₃ₓ₄v⃗\nfunction MultiplyMatrix3(m:Matrix3, v:Vector3) : Vector3;  // M₃ₓ₃v⃗\nfunction MultiplyMatrix4(m:Matrix4, v:Vector3) : Vector3;  // M₄ₓ₄v⃗\nfunction MultiplyScalar(v:Vector3, n:number) : Vector3;  // nv⃗\nfunction Negate(v:Vector3) : Vector3;  // -v⃗\nfunction Normalize(v:Vector3) : Vector3;  // v̂\nfunction OrthoNormalize(v:Vector3, w:Vector3) : Vector3;  // w⃗ - (w⃗⋅v⃗ )v⃗\nfunction Project(v:Vector3, w:Vector3) : Vector3;  // Return the projection of w⃗ onto v⃗, (v⃗w⃗ / ‖ v⃗ ‖²)v⃗\nfunction Reflect(v:Vector3, w:Vector3) : Vector3;  // Return the reflection of w⃗ against v⃗, 2(v⃗⋅w⃗ )w⃗-v⃗\nfunction Subtract(v:Vector3, w:Vector3) : Vector3;  // v⃗-w⃗\nfunction add\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // r⃗ = v⃗+w⃗\nfunction addAssign\u003cR extends Vector3\u003e(v:R, w:Vector3) : R;  // v⃗ = v⃗+w⃗\nfunction assign\u003cR extends Vector3\u003e(r:R, x:number = 0.0, y:number = 0.0, z:number = 0.0) : R;\nfunction assignF32(r:Float32Array, v:Vector3, offset:number = 0) : Float32Array;\nfunction assignF64(r:Float64Array, v:Vector3, offset:number = 0) : Float64Array;\nfunction axisX\u003cR extends Vector3\u003e(r:R, s:number = 1.0) : R;  // r⃗ = sx̂\nfunction axisY\u003cR extends Vector3\u003e(r:R, s:number = 1.0) : R;  // r⃗ = sŷ\nfunction axisZ\u003cR extends Vector3\u003e(r:R, s:number = 1.0) : R;  // r⃗ = sẑ\nfunction azimuth(v:Vector3, w:Vector3, z:Vector3) : number;  // Return the cosine of azimuth angle ϕ between v̂ and ŵ against polar axis ẑ, ( (v̂ - (v̂⋅ẑ)ẑ) / ‖ v̂ - (v̂⋅ẑ)ẑ ‖ )⋅( (ŵ - (ŵ⋅ẑ)ẑ) / ‖ ŵ - (ŵ⋅ẑ)ẑ ‖ )\nfunction barycentricUV\u003cR extends Vector3\u003e(r:R, vx0:Vector3, vx1:Vector3, vx2:Vector3, u:number, v:number) : R;  // Assign the point represented by barycentric coordinates (u, v) in ↻ triangle (vx0, vx1, vx2) to r⃗\n// @deprecated use same function in xyzw-rgba instead\nfunction clampScalar\u003cR extends Vector3\u003e(r:R, v:Vector3, a:number, b:number) : R;  // r⃗ = min(max(v⃗, min(a, b)), max(a, b))\nfunction copy\u003cR extends Vector3\u003e(r:R, v:Vector3) : R;\nfunction createStringifier(opts?:Partial\u003cStringifyOptions\u003cVector3\u003e\u003e) : stringify\u003cVector3\u003e;\nfunction cross\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // r⃗ = v⃗×w⃗\nfunction dot(v:Vector3, w:Vector3) : number;  // v⃗⋅w⃗\nfunction equals(v:Vector3, w:Vector3, e:number = epsilon) : boolean;\nfunction eulerXYZ\u003cR extends Vector3\u003e(r:R, m:Matrix3) : R;\nfunction eulerYXZ\u003cR extends Vector3\u003e(r:R, m:Matrix3) : R;\nfunction eulerZXY\u003cR extends Vector3\u003e(r:R, m:Matrix3) : R;\nfunction f32\u003cR extends Vector3\u003e(r:R, n:Float32Array, offset:number = 0) : R;\nfunction f64\u003cR extends Vector3\u003e(r:R, n:Float64Array, offset:number = 0) : R;\nfunction hadamard\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // r⃗ = v⃗⊙w⃗\nfunction hadamardAssign\u003cR extends Vector3\u003e(v:R, w:Vector3) : R;  // v⃗ = v⃗⊙w⃗\nfunction hadamardInvert\u003cR extends Vector3\u003e(r:R, v:Vector3) : R;  // r⃗ = 1⁄v⃗\nfunction isNormEqual(v:Vector3, n:number, e:number = epsilon) : boolean;  // ‖ v⃗ ‖ - n \u003c ϵ\nfunction isNormGt(v:Vector3, n:number) : boolean;  // ‖ v⃗ ‖ \u003e n\nfunction isNormLt(v:Vector3, n:number) : boolean;  // ‖ v⃗ ‖ \u003c n\nfunction lerp\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3, t:number) : R;  // r⃗ = v⃗ + (w⃗ - v⃗ ) * t\nfunction lerpAssign\u003cR extends Vector3\u003e(v:R, w:Vector3, t:number) : R;  // v⃗ = v⃗ + (w⃗ - v⃗ ) * t\n// @deprecated use same function in xyzw-rgba instead\nfunction maxScalar\u003cR extends Vector3\u003e(r:R, v:Vector3, n:number) : R;  // r⃗ = max(v⃗, n)\n// @deprecated use same function in xyzw-rgba instead\nfunction minScalar\u003cR extends Vector3\u003e(r:R, v:Vector3, n:number) : R;  // r⃗ = min(v⃗, n)\nfunction multiply3x4Matrix4\u003cR extends Vector3\u003e(r:R, m:Matrix4, v:Vector3) : R;  // r⃗ = M₃ₓ₄v⃗\nfunction multiplyAssignScalar\u003cR extends Vector3\u003e(v:R, n:number) : R;  // v⃗ = nv⃗\nfunction multiplyMatrix3\u003cR extends Vector3\u003e(r:R, m:Matrix3, v:Vector3) : R;  // r⃗ = M₃ₓ₃v⃗\nfunction multiplyMatrix4\u003cR extends Vector3\u003e(r:R, m:Matrix4, v:Vector3) : R;  // r⃗ = M₄ₓ₄v⃗\nfunction multiplyScalar\u003cR extends Vector3\u003e(r:R, v:Vector3, n:number) : R;  // r⃗ = nv⃗\nfunction negate\u003cR extends Vector3\u003e(r:R, v:Vector3) : R;  // r⃗ = -v⃗\nfunction negateAssign\u003cR extends Vector3\u003e(v:R) : R;  // v⃗ = -v⃗\nfunction norm(v:Vector3) : number;  // ‖ v⃗ ‖\nfunction normSquared(v:Vector3) : number;  // ‖ v⃗ ‖²\nfunction normalize\u003cR extends Vector3\u003e(r:R, v:Vector3) : R;  // r⃗ = v̂\nfunction orthoNormalize\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // r⃗ = w⃗ - (w⃗⋅v⃗ )v⃗\nfunction project\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // Assign the projection of w⃗ onto v⃗ to r⃗, r⃗ = (v⃗w⃗ / ‖ v⃗ ‖²)v⃗\nfunction reflect\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // Assign the reflection of w⃗ against v⃗, r⃗ = 2(v⃗⋅w⃗ )w⃗-v⃗\nfunction subtract\u003cR extends Vector3\u003e(r:R, v:Vector3, w:Vector3) : R;  // r⃗ = v⃗-w⃗\nfunction subtractAssign\u003cR extends Vector3\u003e(v:R, w:Vector3) : R;  // v⃗ = v⃗-w⃗\nfunction toF32(v:Vector3) : Float32Array;\nfunction toF64(v:Vector3) : Float64Array;\n```\n## vector4\n[`./source/vector4.ts`](https://github.com/chkt/xyzw/blob/1b87a06/source/vector4.ts#L1)\n### Interfaces\n```ts\ninterface Vector4 extends Vector3 {\n  w : number;\n}\n```\n### Functions\n```ts\nfunction Add(v:Vector4, w:Vector4) : Vector4;  // v⃗+w⃗\nfunction Conjugate(v:Vector4) : Vector4;  // q⃗′\nfunction Copy(v:Vector4) : Vector4;\nfunction Create(x:number = 0.0, y:number = 0.0, z:number = 0.0, w:number = 1.0) : Vector4;\nfunction F32(n:Float32Array, offset:number = 0) : Vector4;\nfunction F64(n:Float64Array, offset:number = 0) : Vector4;\nfunction Hadamard(v:Vector4, w:Vector4) : Vector4;  // v⃗⊙w⃗\nfunction Inverse(v:Vector4) : Vector4 | undefined;  // q⃗⁻¹\nfunction MultiplyScalar(v:Vector4, n:number) : Vector4;  // nv⃗\nfunction Normalize(v:Vector4) : Vector4;  // v̂\nfunction Outer(v:Vector4, w:Vector4) : Vector4;  // v⃗w⃗\nfunction RotationAxis(v:Vector3, rad:number) : Vector4;  // q̂(v⃗, θ)\nfunction RotationMatrix3(m:Matrix3) : Vector4;  // q̂(M)\nfunction RotationSlerp(v:Vector4, w:Vector4, t:number) : Vector4;  // v̂(ŵ⁻¹v̂)ᵗ\nfunction Subtract(v:Vector4, w:Vector4) : Vector4;  // v⃗-w⃗\nfunction Vector3(v:Vector3, w:number = 1.0) : Vector4;  // ŵ+v⃗\nfunction add\u003cR extends Vector4\u003e(r:R, v:Vector4, w:Vector4) : R;  // r⃗ = v⃗+w⃗\nfunction addAssign\u003cR extends Vector4\u003e(v:R, w:Vector4) : R;  // v⃗ = v⃗+w⃗\nfunction assign\u003cR extends Vector4\u003e(r:R, x:number = 0.0, y:number = 0.0, z:number = 0.0, w:number = 1.0) : R;\nfunction assignF32(r:Float32Array, v:Vector4, offset:number = 0) : Float32Array;\nfunction assignF64(r:Float64Array, v:Vector4, offset:number = 0) : Float64Array;\nfunction conjugate\u003cR extends Vector4\u003e(r:R, v:Vector4) : R;  // r⃗ = q⃗′\nfunction copy\u003cR extends Vector4\u003e(r:R, v:Vector4) : R;\nfunction createStringifier(opts?:Partial\u003cStringifyOptions\u003cVector4\u003e\u003e) : stringify\u003cVector4\u003e;\nfunction dot(v:Vector4, w:Vector4) : number;  // v⃗⋅w⃗\nfunction equals(v:Vector4, w:Vector4, e:number = epsilon) : boolean;\nfunction f32\u003cR extends Vector4\u003e(r:R, n:Float32Array, offset:number = 0) : R;\nfunction f64\u003cR extends Vector4\u003e(r:R, n:Float64Array, offset:number = 0) : R;\nfunction hadamard\u003cR extends Vector4\u003e(r:R, v:Vector4, w:Vector4) : R;  // r⃗ = v⃗⊙w⃗\nfunction hadamardAssign\u003cR extends Vector4\u003e(v:R, w:Vector4) : R;  // v⃗ = v⃗⊙w⃗\nfunction inverse\u003cR extends Vector4\u003e(r:R, v:Vector4) : R | undefined;  // r⃗ = q⃗⁻¹\nfunction multiplyAssignScalar\u003cR extends Vector4\u003e(v:R, n:number) : R;  // v⃗ = nv⃗\nfunction multiplyScalar\u003cR extends Vector4\u003e(r:R, v:Vector4, n:number) : R;  // r⃗ = nv⃗\nfunction norm(v:Vector4) : number;  // ‖ v⃗ ‖\nfunction normSquared(v:Vector4) : number;  // ‖ v⃗ ‖²\nfunction normalize\u003cR extends Vector4\u003e(r:R, v:Vector4) : R;  // r⃗ = v̂\nfunction outer\u003cR extends Vector4\u003e(r:R, v:Vector4, w:Vector4) : R;  // r⃗ = v⃗w⃗\nfunction rotationAxis\u003cR extends Vector4\u003e(r:R, v:Vector3, rad:number) : R;  // r⃗ = q̂(v⃗, θ)\nfunction rotationMatrix3\u003cR extends Vector4\u003e(r:R, m:Matrix3) : R;  // r⃗ = q̂(M)\nfunction rotationSlerp\u003cR extends Vector4\u003e(r:R, v:Vector4, w:Vector4, t:number) : R;  // r⃗ = v̂(ŵ⁻¹v̂)ᵗ\nfunction subtract\u003cR extends Vector4\u003e(r:R, v:Vector4, w:Vector4) : R;  // r⃗ = v⃗-w⃗\nfunction subtractAssign\u003cR extends Vector4\u003e(v:R, w:Vector4) : R;  // v⃗ = v⃗-w⃗\nfunction toF32(v:Vector4) : Float32Array;\nfunction toF64(v:Vector4) : Float64Array;\nfunction vector3\u003cR extends Vector4\u003e(r:R, v:Vector3, w:number = 1.0) : R;  // r⃗ = ŵ+v⃗\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchkt%2Fxyzw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchkt%2Fxyzw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchkt%2Fxyzw/lists"}