@basementuniverse/vec
Advanced tools
Comparing version 2.1.0 to 2.2.0
{ | ||
"name": "@basementuniverse/vec", | ||
"version": "2.1.0", | ||
"version": "2.2.0", | ||
"description": "A small vector and matrix library", | ||
@@ -5,0 +5,0 @@ "main": "vec.js", |
60
vec.d.ts
@@ -77,22 +77,38 @@ /// <reference types="typescript" /> | ||
* @param {vec2} a Vector a | ||
* @param {vec2} b Vector b | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a + b | ||
*/ | ||
add(a: vec2, b: vec2): vec2; | ||
add(a: vec2, b: vec2 | number): vec2; | ||
/** | ||
* Subtract vectors | ||
* @param {vec2} a Vector a | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a - b | ||
*/ | ||
sub(a: vec2, b: vec2 | number): vec2; | ||
/** | ||
* Scale a vector | ||
* @param {vec2} a Vector a | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a * b | ||
*/ | ||
mul(a: vec2, b: vec2 | number): vec2; | ||
/** | ||
* Scale a vector by a scalar, alias for mul | ||
* @param {vec2} a Vector a | ||
* @param {number} b Scalar b | ||
* @return {vec2} a * b | ||
*/ | ||
mul(a: vec2, b: number): vec2; | ||
scale(a: vec2, b: number): vec2; | ||
/** | ||
* Subtract vectors | ||
* Divide a vector | ||
* @param {vec2} a Vector a | ||
* @param {vec2} b Vector b | ||
* @return {vec2} a - b | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a / b | ||
*/ | ||
sub(a: vec2, b: vec2): vec2; | ||
div(a: vec2, b: vec2 | number): vec2; | ||
@@ -311,22 +327,38 @@ /** | ||
* @param {vec3} a Vector a | ||
* @param {vec3} b Vector b | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a + b | ||
*/ | ||
add(a: vec3, b: vec3): vec3; | ||
add(a: vec3, b: vec3 | number): vec3; | ||
/** | ||
* Subtract vectors | ||
* @param {vec3} a Vector a | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a - b | ||
*/ | ||
sub(a: vec3, b: vec3 | number): vec3; | ||
/** | ||
* Scale a vector | ||
* @param {vec3} a Vector a | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a * b | ||
*/ | ||
mul(a: vec3, b: vec3 | number): vec3; | ||
/** | ||
* Scale a vector by a scalar, alias for mul | ||
* @param {vec3} a Vector a | ||
* @param {number} b Scalar b | ||
* @return {vec3} a * b | ||
*/ | ||
mul(a: vec3, b: number): vec3; | ||
scale(a: vec3, b: number): vec3; | ||
/** | ||
* Subtract vectors | ||
* Divide a vector | ||
* @param {vec3} a Vector a | ||
* @param {vec3} b Vector b | ||
* @return {vec3} a - b | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a / b | ||
*/ | ||
sub(a: vec3, b: vec3): vec3; | ||
div(a: vec3, b: vec3 | number): vec3; | ||
@@ -333,0 +365,0 @@ /** |
60
vec.js
@@ -67,22 +67,38 @@ /** | ||
* @param {vec2} a Vector a | ||
* @param {vec2} b Vector b | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a + b | ||
*/ | ||
vec2.add = (a, b) => ({ x: a.x + b.x, y: a.y + b.y }); | ||
vec2.add = (a, b) => ({ x: a.x + (b.x ?? b), y: a.y + (b.y ?? b) }); | ||
/** | ||
* Subtract vectors | ||
* @param {vec2} a Vector a | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a - b | ||
*/ | ||
vec2.sub = (a, b) => ({ x: a.x - (b.x ?? b), y: a.y - (b.y ?? b) }); | ||
/** | ||
* Scale a vector | ||
* @param {vec2} a Vector a | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a * b | ||
*/ | ||
vec2.mul = (a, b) => ({ x: a.x * (b.x ?? b), y: a.y * (b.y ?? b) }); | ||
/** | ||
* Scale a vector by a scalar, alias for vec2.mul | ||
* @param {vec2} a Vector a | ||
* @param {number} b Scalar b | ||
* @return {vec2} a * b | ||
*/ | ||
vec2.mul = (a, b) => ({ x: a.x * b, y: a.y * b }); | ||
vec2.scale = (a, b) => vec2.mul(a, b); | ||
/** | ||
* Subtract vectors | ||
* Divide a vector | ||
* @param {vec2} a Vector a | ||
* @param {vec2} b Vector b | ||
* @return {vec2} a - b | ||
* @param {vec2|number} b Vector or scalar b | ||
* @return {vec2} a / b | ||
*/ | ||
vec2.sub = (a, b) => ({ x: a.x - b.x, y: a.y - b.y }); | ||
vec2.div = (a, b) => ({ x: a.x / (b.x ?? b), y: a.y / (b.y ?? b) }); | ||
@@ -327,22 +343,38 @@ /** | ||
* @param {vec3} a Vector a | ||
* @param {vec3} b Vector b | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a + b | ||
*/ | ||
vec3.add = (a, b) => ({ x: a.x + b.x, y: a.y + b.y, z: a.z + b.z }); | ||
vec3.add = (a, b) => ({ x: a.x + (b.x ?? b), y: a.y + (b.y ?? b), z: a.z + (b.z ?? b) }); | ||
/** | ||
* Subtract vectors | ||
* @param {vec3} a Vector a | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a - b | ||
*/ | ||
vec3.sub = (a, b) => ({ x: a.x - (b.x ?? b), y: a.y - (b.y ?? b), z: a.z - (b.z ?? b) }); | ||
/** | ||
* Scale a vector | ||
* @param {vec3} a Vector a | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a * b | ||
*/ | ||
vec3.mul = (a, b) => ({ x: a.x * (b.x ?? b), y: a.y * (b.y ?? b), z: a.z * (b.z ?? b) }); | ||
/** | ||
* Scale a vector by a scalar, alias for vec3.mul | ||
* @param {vec3} a Vector a | ||
* @param {number} b Scalar b | ||
* @return {vec3} a * b | ||
*/ | ||
vec3.mul = (a, b) => ({ x: a.x * b, y: a.y * b, z: a.z * b }); | ||
vec3.scale = (a, b) => vec3.mul(a, b); | ||
/** | ||
* Subtract vectors | ||
* Divide a vector | ||
* @param {vec3} a Vector a | ||
* @param {vec3} b Vector b | ||
* @return {vec3} a - b | ||
* @param {vec3|number} b Vector or scalar b | ||
* @return {vec3} a / b | ||
*/ | ||
vec3.sub = (a, b) => ({ x: a.x - b.x, y: a.y - b.y, z: a.z - b.z }); | ||
vec3.div = (a, b) => ({ x: a.x / (b.x ?? b), y: a.y / (b.y ?? b), z: a.z / (b.z ?? b) }); | ||
@@ -349,0 +381,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
const _vec_times=(f,n)=>Array(n).fill(0).map((_,i)=>f(i));const _vec_chunk=(a,n)=>_vec_times(i=>a.slice(i*n,i*n+n),Math.ceil(a.length/n));const _vec_dot=(a,b)=>a.reduce((n,v,i)=>n+v*b[i],0);const vec2=(x,y)=>{if(!x&&!y){return{x:0,y:0}}if(typeof x==="object"&&"x"in x&&"y"in x){return{x:x.x||0,y:x.y||0}}return{x:x,y:y??x}};vec2.components=a=>[a.x,a.y];vec2.fromComponents=components=>vec2(...components.slice(0,2));vec2.ux=()=>vec2(1,0);vec2.uy=()=>vec2(0,1);vec2.add=(a,b)=>({x:a.x+b.x,y:a.y+b.y});vec2.mul=(a,b)=>({x:a.x*b,y:a.y*b});vec2.sub=(a,b)=>({x:a.x-b.x,y:a.y-b.y});vec2.len=a=>Math.sqrt(a.x*a.x+a.y*a.y);vec2.manhattan=a=>Math.abs(a.x)+Math.abs(a.y);vec2.nor=a=>{let len=vec2.len(a);return len?{x:a.x/len,y:a.y/len}:vec2()};vec2.dot=(a,b)=>a.x*b.x+a.y*b.y;vec2.rot=(a,r)=>{let s=Math.sin(r),c=Math.cos(r);return{x:c*a.x-s*a.y,y:s*a.x+c*a.y}};vec2.rotf=(a,r)=>{switch(r){case 1:return vec2(a.y,-a.x);case-1:return vec2(-a.y,a.x);case 2:case-2:return vec2(-a.x,-a.y);default:return a}};vec2.eq=(a,b)=>a.x===b.x&&a.y===b.y;vec2.rad=a=>Math.atan2(a.y,a.x);vec2.cpy=a=>vec2(a);vec2.map=(a,f)=>({x:f(a.x,"x"),y:f(a.y,"y")});vec2.str=(a,s=", ")=>`${a.x}${s}${a.y}`;vec2.swiz=(a,s="..")=>{const result=[];s.split("").forEach((c,i)=>{switch(c){case"x":case"u":result.push(a.x);break;case"y":case"v":result.push(a.y);break;case"X":case"U":result.push(-a.x);break;case"Y":case"V":result.push(-a.y);break;case"0":result.push(0);break;case"1":result.push(1);break;case".":result.push([a.x,a.y][i]??0);break;default:result.push(0)}});return result};vec2.polar=a=>({r:vec2.len(a),theta:Math.atan2(a.y,a.x)});vec2.fromPolar=(r,theta)=>vec2(r*Math.cos(theta),r*Math.sin(theta));const vec3=(x,y,z)=>{if(!x&&!y&&!z){return{x:0,y:0,z:0}}if(typeof x==="object"&&"x"in x&&"y"in x&&"z"in x){return{x:x.x||0,y:x.y||0,z:x.z||0}}if(typeof x==="object"&&!("z"in x)){return{x:x.x||0,y:x.y||0,z:y||0}}return{x:x,y:y??x,z:z??x}};vec3.components=a=>[a.x,a.y,a.z];vec3.fromComponents=components=>vec3(...components.slice(0,3));vec3.ux=()=>vec3(1,0,0);vec3.uy=()=>vec3(0,1,0);vec3.uz=()=>vec3(0,0,1);vec3.add=(a,b)=>({x:a.x+b.x,y:a.y+b.y,z:a.z+b.z});vec3.mul=(a,b)=>({x:a.x*b,y:a.y*b,z:a.z*b});vec3.sub=(a,b)=>({x:a.x-b.x,y:a.y-b.y,z:a.z-b.z});vec3.len=a=>Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z);vec3.manhattan=a=>Math.abs(a.x)+Math.abs(a.y)+Math.abs(a.z);vec3.nor=a=>{let len=vec3.len(a);return len?{x:a.x/len,y:a.y/len,z:a.z/len}:vec3()};vec3.dot=(a,b)=>a.x*b.x+a.y*b.y+a.z*b.z;vec3.rot=(a,m)=>vec3(vec3.dot(vec3.fromComponents(mat.row(m,1)),a),vec3.dot(vec3.fromComponents(mat.row(m,2)),a),vec3.dot(vec3.fromComponents(mat.row(m,3)),a));vec3.rotx=(a,r)=>vec3(a.x,a.y*Math.cos(r)-a.z*Math.sin(r),a.y*Math.sin(r)+a.z*Math.cos(r));vec3.roty=(a,r)=>vec3(a.x*Math.cos(r)+a.z*Math.sin(r),a.y,-a.x*Math.sin(r)+a.z*Math.cos(r));vec3.rotz=(a,r)=>vec3(a.x*Math.cos(r)-a.y*Math.sin(r),a.x*Math.sin(r)+a.y*Math.cos(r),a.z);vec3.rotq=(v,q)=>{if(q.length!==4){return vec3()}const d=Math.sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]);if(d===0){return vec3()}const uq=[q[0]/d,q[1]/d,q[2]/d,q[3]/d];const u=vec3(...uq.slice(0,3));const s=uq[3];return vec3.add(vec3.add(vec3.mul(u,2*vec3.dot(u,v)),vec3.mul(v,s*s-vec3.dot(u,u))),vec3.mul(vec3.cross(u,v),2*s))};vec3.rota=(a,e)=>vec3.rotz(vec3.roty(vec3.rotx(a,e.x),e.y),e.z);vec3.cross=(a,b)=>vec3(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);vec3.eq=(a,b)=>a.x===b.x&&a.y===b.y&&a.z===b.z;vec3.radx=a=>Math.atan2(a.z,a.y);vec3.rady=a=>Math.atan2(a.x,a.y);vec3.radz=a=>Math.atan2(a.y,a.z);vec3.cpy=a=>vec3(a);vec3.map=(a,f)=>({x:f(a.x,"x"),y:f(a.y,"y"),z:f(a.z,"z")});vec3.str=(a,s=", ")=>`${a.x}${s}${a.y}${s}${a.z}`;vec3.swiz=(a,s="...")=>{const result=[];s.split("").forEach((c,i)=>{switch(c){case"x":case"u":case"r":result.push(a.x);break;case"y":case"v":case"g":result.push(a.y);break;case"z":case"w":case"b":result.push(a.z);break;case"X":case"U":case"R":result.push(-a.x);break;case"Y":case"V":case"G":result.push(-a.y);break;case"Z":case"W":case"B":result.push(-a.z);break;case"0":result.push(0);break;case"1":result.push(1);break;case".":result.push([a.x,a.y,a.z][i]??0);break;default:result.push(0)}});return result};vec3.polar=a=>{let r=vec3.len(a),theta=Math.acos(a.y/r),phi=Math.atan2(a.z,a.x);return{r:r,theta:theta,phi:phi}};vec3.fromPolar=(r,theta,phi)=>{const sinTheta=Math.sin(theta);return vec3(r*sinTheta*Math.cos(phi),r*Math.cos(theta),r*sinTheta*Math.sin(phi))};const mat=(m=4,n=4,entries=[])=>({m:m,n:n,entries:entries.concat(Array(m*n).fill(0)).slice(0,m*n)});mat.identity=n=>mat(n,n,Array(n*n).fill(0).map((v,i)=>+(Math.floor(i/n)===i%n)));mat.get=(a,i,j)=>a.entries[j-1+(i-1)*a.n];mat.set=(a,i,j,v)=>{a.entries[j-1+(i-1)*a.n]=v};mat.row=(a,m)=>{const s=(m-1)*a.n;return a.entries.slice(s,s+a.n)};mat.col=(a,n)=>_vec_times(i=>mat.get(a,i+1,n),a.m);mat.add=(a,b)=>a.m===b.m&&a.n===b.n&&mat.map(a,(v,i)=>v+b.entries[i]);mat.sub=(a,b)=>a.m===b.m&&a.n===b.n&&mat.map(a,(v,i)=>v-b.entries[i]);mat.mul=(a,b)=>{if(a.n!==b.m){return false}const result=mat(a.m,b.n);for(let i=1;i<=a.m;i++){for(let j=1;j<=b.n;j++){mat.set(result,i,j,_vec_dot(mat.row(a,i),mat.col(b,j)))}}return result};mat.scale=(a,b)=>mat.map(a,v=>v*b);mat.trans=a=>mat(a.n,a.m,_vec_times(i=>mat.col(a,i+1),a.n).flat());mat.minor=(a,i,j)=>{if(a.m!==a.n){return false}const entries=[];for(let ii=1;ii<=a.m;ii++){if(ii===i){continue}for(let jj=1;jj<=a.n;jj++){if(jj===j){continue}entries.push(mat.get(a,ii,jj))}}return mat(a.m-1,a.n-1,entries)};mat.det=a=>{if(a.m!==a.n){return false}if(a.m===1){return a.entries[0]}if(a.m===2){return a.entries[0]*a.entries[3]-a.entries[1]*a.entries[2]}let total=0,sign=1;for(let j=1;j<=a.n;j++){total+=sign*a.entries[j-1]*mat.det(mat.minor(a,1,j));sign*=-1}return total};mat.nor=a=>{if(a.m!==a.n){return false}const d=mat.det(a);return mat.map(a,i=>i*d)};mat.adj=a=>{const minors=mat(a.m,a.n);for(let i=1;i<=a.m;i++){for(let j=1;j<=a.n;j++){mat.set(minors,i,j,mat.det(mat.minor(a,i,j)))}}const cofactors=mat.map(minors,(v,i)=>v*(i%2?-1:1));return mat.trans(cofactors)};mat.inv=a=>{if(a.m!==a.n){return false}const d=mat.det(a);if(d===0){return false}return mat.scale(mat.adj(a),1/d)};mat.eq=(a,b)=>a.m===b.m&&a.n===b.n&&mat.str(a)===mat.str(b);mat.cpy=a=>mat(a.m,a.n,[...a.entries]);mat.map=(a,f)=>mat(a.m,a.n,a.entries.map(f));mat.str=(a,ms=", ",ns="\n")=>_vec_chunk(a.entries,a.n).map(r=>r.join(ms)).join(ns);if(typeof module!=="undefined"){module.exports={vec2:vec2,vec3:vec3,mat:mat}} | ||
const _vec_times=(f,n)=>Array(n).fill(0).map((_,i)=>f(i));const _vec_chunk=(a,n)=>_vec_times(i=>a.slice(i*n,i*n+n),Math.ceil(a.length/n));const _vec_dot=(a,b)=>a.reduce((n,v,i)=>n+v*b[i],0);const vec2=(x,y)=>{if(!x&&!y){return{x:0,y:0}}if(typeof x==="object"&&"x"in x&&"y"in x){return{x:x.x||0,y:x.y||0}}return{x:x,y:y??x}};vec2.components=a=>[a.x,a.y];vec2.fromComponents=components=>vec2(...components.slice(0,2));vec2.ux=()=>vec2(1,0);vec2.uy=()=>vec2(0,1);vec2.add=(a,b)=>({x:a.x+(b.x??b),y:a.y+(b.y??b)});vec2.sub=(a,b)=>({x:a.x-(b.x??b),y:a.y-(b.y??b)});vec2.mul=(a,b)=>({x:a.x*(b.x??b),y:a.y*(b.y??b)});vec2.scale=(a,b)=>vec2.mul(a,b);vec2.div=(a,b)=>({x:a.x/(b.x??b),y:a.y/(b.y??b)});vec2.len=a=>Math.sqrt(a.x*a.x+a.y*a.y);vec2.manhattan=a=>Math.abs(a.x)+Math.abs(a.y);vec2.nor=a=>{let len=vec2.len(a);return len?{x:a.x/len,y:a.y/len}:vec2()};vec2.dot=(a,b)=>a.x*b.x+a.y*b.y;vec2.rot=(a,r)=>{let s=Math.sin(r),c=Math.cos(r);return{x:c*a.x-s*a.y,y:s*a.x+c*a.y}};vec2.rotf=(a,r)=>{switch(r){case 1:return vec2(a.y,-a.x);case-1:return vec2(-a.y,a.x);case 2:case-2:return vec2(-a.x,-a.y);default:return a}};vec2.eq=(a,b)=>a.x===b.x&&a.y===b.y;vec2.rad=a=>Math.atan2(a.y,a.x);vec2.cpy=a=>vec2(a);vec2.map=(a,f)=>({x:f(a.x,"x"),y:f(a.y,"y")});vec2.str=(a,s=", ")=>`${a.x}${s}${a.y}`;vec2.swiz=(a,s="..")=>{const result=[];s.split("").forEach((c,i)=>{switch(c){case"x":case"u":result.push(a.x);break;case"y":case"v":result.push(a.y);break;case"X":case"U":result.push(-a.x);break;case"Y":case"V":result.push(-a.y);break;case"0":result.push(0);break;case"1":result.push(1);break;case".":result.push([a.x,a.y][i]??0);break;default:result.push(0)}});return result};vec2.polar=a=>({r:vec2.len(a),theta:Math.atan2(a.y,a.x)});vec2.fromPolar=(r,theta)=>vec2(r*Math.cos(theta),r*Math.sin(theta));const vec3=(x,y,z)=>{if(!x&&!y&&!z){return{x:0,y:0,z:0}}if(typeof x==="object"&&"x"in x&&"y"in x&&"z"in x){return{x:x.x||0,y:x.y||0,z:x.z||0}}if(typeof x==="object"&&!("z"in x)){return{x:x.x||0,y:x.y||0,z:y||0}}return{x:x,y:y??x,z:z??x}};vec3.components=a=>[a.x,a.y,a.z];vec3.fromComponents=components=>vec3(...components.slice(0,3));vec3.ux=()=>vec3(1,0,0);vec3.uy=()=>vec3(0,1,0);vec3.uz=()=>vec3(0,0,1);vec3.add=(a,b)=>({x:a.x+(b.x??b),y:a.y+(b.y??b),z:a.z+(b.z??b)});vec3.sub=(a,b)=>({x:a.x-(b.x??b),y:a.y-(b.y??b),z:a.z-(b.z??b)});vec3.mul=(a,b)=>({x:a.x*(b.x??b),y:a.y*(b.y??b),z:a.z*(b.z??b)});vec3.scale=(a,b)=>vec3.mul(a,b);vec3.div=(a,b)=>({x:a.x/(b.x??b),y:a.y/(b.y??b),z:a.z/(b.z??b)});vec3.len=a=>Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z);vec3.manhattan=a=>Math.abs(a.x)+Math.abs(a.y)+Math.abs(a.z);vec3.nor=a=>{let len=vec3.len(a);return len?{x:a.x/len,y:a.y/len,z:a.z/len}:vec3()};vec3.dot=(a,b)=>a.x*b.x+a.y*b.y+a.z*b.z;vec3.rot=(a,m)=>vec3(vec3.dot(vec3.fromComponents(mat.row(m,1)),a),vec3.dot(vec3.fromComponents(mat.row(m,2)),a),vec3.dot(vec3.fromComponents(mat.row(m,3)),a));vec3.rotx=(a,r)=>vec3(a.x,a.y*Math.cos(r)-a.z*Math.sin(r),a.y*Math.sin(r)+a.z*Math.cos(r));vec3.roty=(a,r)=>vec3(a.x*Math.cos(r)+a.z*Math.sin(r),a.y,-a.x*Math.sin(r)+a.z*Math.cos(r));vec3.rotz=(a,r)=>vec3(a.x*Math.cos(r)-a.y*Math.sin(r),a.x*Math.sin(r)+a.y*Math.cos(r),a.z);vec3.rotq=(v,q)=>{if(q.length!==4){return vec3()}const d=Math.sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]);if(d===0){return vec3()}const uq=[q[0]/d,q[1]/d,q[2]/d,q[3]/d];const u=vec3(...uq.slice(0,3));const s=uq[3];return vec3.add(vec3.add(vec3.mul(u,2*vec3.dot(u,v)),vec3.mul(v,s*s-vec3.dot(u,u))),vec3.mul(vec3.cross(u,v),2*s))};vec3.rota=(a,e)=>vec3.rotz(vec3.roty(vec3.rotx(a,e.x),e.y),e.z);vec3.cross=(a,b)=>vec3(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);vec3.eq=(a,b)=>a.x===b.x&&a.y===b.y&&a.z===b.z;vec3.radx=a=>Math.atan2(a.z,a.y);vec3.rady=a=>Math.atan2(a.x,a.y);vec3.radz=a=>Math.atan2(a.y,a.z);vec3.cpy=a=>vec3(a);vec3.map=(a,f)=>({x:f(a.x,"x"),y:f(a.y,"y"),z:f(a.z,"z")});vec3.str=(a,s=", ")=>`${a.x}${s}${a.y}${s}${a.z}`;vec3.swiz=(a,s="...")=>{const result=[];s.split("").forEach((c,i)=>{switch(c){case"x":case"u":case"r":result.push(a.x);break;case"y":case"v":case"g":result.push(a.y);break;case"z":case"w":case"b":result.push(a.z);break;case"X":case"U":case"R":result.push(-a.x);break;case"Y":case"V":case"G":result.push(-a.y);break;case"Z":case"W":case"B":result.push(-a.z);break;case"0":result.push(0);break;case"1":result.push(1);break;case".":result.push([a.x,a.y,a.z][i]??0);break;default:result.push(0)}});return result};vec3.polar=a=>{let r=vec3.len(a),theta=Math.acos(a.y/r),phi=Math.atan2(a.z,a.x);return{r:r,theta:theta,phi:phi}};vec3.fromPolar=(r,theta,phi)=>{const sinTheta=Math.sin(theta);return vec3(r*sinTheta*Math.cos(phi),r*Math.cos(theta),r*sinTheta*Math.sin(phi))};const mat=(m=4,n=4,entries=[])=>({m:m,n:n,entries:entries.concat(Array(m*n).fill(0)).slice(0,m*n)});mat.identity=n=>mat(n,n,Array(n*n).fill(0).map((v,i)=>+(Math.floor(i/n)===i%n)));mat.get=(a,i,j)=>a.entries[j-1+(i-1)*a.n];mat.set=(a,i,j,v)=>{a.entries[j-1+(i-1)*a.n]=v};mat.row=(a,m)=>{const s=(m-1)*a.n;return a.entries.slice(s,s+a.n)};mat.col=(a,n)=>_vec_times(i=>mat.get(a,i+1,n),a.m);mat.add=(a,b)=>a.m===b.m&&a.n===b.n&&mat.map(a,(v,i)=>v+b.entries[i]);mat.sub=(a,b)=>a.m===b.m&&a.n===b.n&&mat.map(a,(v,i)=>v-b.entries[i]);mat.mul=(a,b)=>{if(a.n!==b.m){return false}const result=mat(a.m,b.n);for(let i=1;i<=a.m;i++){for(let j=1;j<=b.n;j++){mat.set(result,i,j,_vec_dot(mat.row(a,i),mat.col(b,j)))}}return result};mat.scale=(a,b)=>mat.map(a,v=>v*b);mat.trans=a=>mat(a.n,a.m,_vec_times(i=>mat.col(a,i+1),a.n).flat());mat.minor=(a,i,j)=>{if(a.m!==a.n){return false}const entries=[];for(let ii=1;ii<=a.m;ii++){if(ii===i){continue}for(let jj=1;jj<=a.n;jj++){if(jj===j){continue}entries.push(mat.get(a,ii,jj))}}return mat(a.m-1,a.n-1,entries)};mat.det=a=>{if(a.m!==a.n){return false}if(a.m===1){return a.entries[0]}if(a.m===2){return a.entries[0]*a.entries[3]-a.entries[1]*a.entries[2]}let total=0,sign=1;for(let j=1;j<=a.n;j++){total+=sign*a.entries[j-1]*mat.det(mat.minor(a,1,j));sign*=-1}return total};mat.nor=a=>{if(a.m!==a.n){return false}const d=mat.det(a);return mat.map(a,i=>i*d)};mat.adj=a=>{const minors=mat(a.m,a.n);for(let i=1;i<=a.m;i++){for(let j=1;j<=a.n;j++){mat.set(minors,i,j,mat.det(mat.minor(a,i,j)))}}const cofactors=mat.map(minors,(v,i)=>v*(i%2?-1:1));return mat.trans(cofactors)};mat.inv=a=>{if(a.m!==a.n){return false}const d=mat.det(a);if(d===0){return false}return mat.scale(mat.adj(a),1/d)};mat.eq=(a,b)=>a.m===b.m&&a.n===b.n&&mat.str(a)===mat.str(b);mat.cpy=a=>mat(a.m,a.n,[...a.entries]);mat.map=(a,f)=>mat(a.m,a.n,a.entries.map(f));mat.str=(a,ms=", ",ns="\n")=>_vec_chunk(a.entries,a.n).map(r=>r.join(ms)).join(ns);if(typeof module!=="undefined"){module.exports={vec2:vec2,vec3:vec3,mat:mat}} |
Sorry, the diff of this file is too big to display
126934
1437
2290