{"id":"shrjrd/mathcat","name":"mathcat","scope":"shrjrd","platform":"roblox","description":"a collection of math helpers for 3D graphics and simulations ","version":"0.0.12","latest":"0.0.12","versions":["0.0.12"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"f73ee4a4149447db0b1ad087aa53175645421b3ca861c51ad4ffe9f6d134d160","likes":0,"downloads":0,"install":"forest install shrjrd/mathcat","url":"https://forest.dev/p/roblox/shrjrd/mathcat","files":"https://api.forest.dev/ai/package/roblox/shrjrd/mathcat/files","readme":"```bash\nnpm install @rbxts/mathcat\n```\n```bash\nwally install shrjrd/mathcat\n```\n\n# mathcat\n\nmathcat is a collection of math helpers for 3D graphics and simulations.\n\n**Features:**\n\n- Vector, Quaternion, Euler, and Matrix math\n- Easing functions\n- Randomness utilities\n- Noise utilities\n- Simple JSON-serializable data structures (no classes or typed arrays)\n- TypeScript-first, great DX for both JavaScript and TypeScript projects\n- Excellent tree-shaking support\n\n**Acknowledgements:**\n\n- The vec*, quat*, mat* code started as a typescript port of glMatrix (https://glmatrix.net/). This library doesn't aim to stay in sync with glMatrix however.\n- Simplex noise functions are adapted from https://github.com/pmndrs/maath, which were adapted from https://github.com/josephg/noisejs :)\n\n## API Documentation\n\n**types**\n\n<table><tr>\n<td><a href=\"#vec2\"><code>Vec2</code></a></td><td><a href=\"#vec3\"><code>Vec3</code></a></td><td><a href=\"#vec4\"><code>Vec4</code></a></td><td><a href=\"#quat\"><code>Quat</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2\"><code>Quat2</code></a></td><td><a href=\"#mat2\"><code>Mat2</code></a></td><td><a href=\"#mat3\"><code>Mat3</code></a></td><td><a href=\"#mat4\"><code>Mat4</code></a></td>\n</tr><tr>\n<td><a href=\"#mat2d\"><code>Mat2d</code></a></td><td><a href=\"#box3\"><code>Box3</code></a></td><td><a href=\"#obb3\"><code>OBB3</code></a></td><td><a href=\"#eulerorder\"><code>EulerOrder</code></a></td>\n</tr><tr>\n<td><a href=\"#euler\"><code>Euler</code></a></td><td><a href=\"#plane3\"><code>Plane3</code></a></td><td><a href=\"#sphere\"><code>Sphere</code></a></td><td><a href=\"#circle\"><code>Circle</code></a></td>\n</tr><tr>\n<td><a href=\"#ray3\"><code>Ray3</code></a></td><td><a href=\"#raycast3\"><code>Raycast3</code></a></td><td><a href=\"#mutablearraylike\"><code>MutableArrayLike</code></a></td><td></td>\n</tr></table>\n\n**vec2**\n\n<table><tr>\n<td><a href=\"#vec2create\"><code>vec2.create</code></a></td><td><a href=\"#vec2clone\"><code>vec2.clone</code></a></td><td><a href=\"#vec2fromvalues\"><code>vec2.fromValues</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2copy\"><code>vec2.copy</code></a></td><td><a href=\"#vec2set\"><code>vec2.set</code></a></td><td><a href=\"#vec2add\"><code>vec2.add</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2addscalar\"><code>vec2.addScalar</code></a></td><td><a href=\"#vec2subtract\"><code>vec2.subtract</code></a></td><td><a href=\"#vec2subtractscalar\"><code>vec2.subtractScalar</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2multiply\"><code>vec2.multiply</code></a></td><td><a href=\"#vec2divide\"><code>vec2.divide</code></a></td><td><a href=\"#vec2ceil\"><code>vec2.ceil</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2floor\"><code>vec2.floor</code></a></td><td><a href=\"#vec2min\"><code>vec2.min</code></a></td><td><a href=\"#vec2max\"><code>vec2.max</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2round\"><code>vec2.round</code></a></td><td><a href=\"#vec2scale\"><code>vec2.scale</code></a></td><td><a href=\"#vec2scaleandadd\"><code>vec2.scaleAndAdd</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2distance\"><code>vec2.distance</code></a></td><td><a href=\"#vec2squareddistance\"><code>vec2.squaredDistance</code></a></td><td><a href=\"#vec2length\"><code>vec2.length</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2squaredlength\"><code>vec2.squaredLength</code></a></td><td><a href=\"#vec2negate\"><code>vec2.negate</code></a></td><td><a href=\"#vec2inverse\"><code>vec2.inverse</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2normalize\"><code>vec2.normalize</code></a></td><td><a href=\"#vec2dot\"><code>vec2.dot</code></a></td><td><a href=\"#vec2cross\"><code>vec2.cross</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2lerp\"><code>vec2.lerp</code></a></td><td><a href=\"#vec2transformmat2\"><code>vec2.transformMat2</code></a></td><td><a href=\"#vec2transformmat2d\"><code>vec2.transformMat2d</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2transformmat3\"><code>vec2.transformMat3</code></a></td><td><a href=\"#vec2transformmat4\"><code>vec2.transformMat4</code></a></td><td><a href=\"#vec2rotate\"><code>vec2.rotate</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2angle\"><code>vec2.angle</code></a></td><td><a href=\"#vec2zero\"><code>vec2.zero</code></a></td><td><a href=\"#vec2str\"><code>vec2.str</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2exactequals\"><code>vec2.exactEquals</code></a></td><td><a href=\"#vec2equals\"><code>vec2.equals</code></a></td><td><a href=\"#vec2finite\"><code>vec2.finite</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2len\"><code>vec2.len</code></a></td><td><a href=\"#vec2sub\"><code>vec2.sub</code></a></td><td><a href=\"#vec2mul\"><code>vec2.mul</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2div\"><code>vec2.div</code></a></td><td><a href=\"#vec2dist\"><code>vec2.dist</code></a></td><td><a href=\"#vec2sqrdist\"><code>vec2.sqrDist</code></a></td>\n</tr><tr>\n<td><a href=\"#vec2sqrlen\"><code>vec2.sqrLen</code></a></td><td></td><td></td>\n</tr></table>\n\n**vec3**\n\n<table><tr>\n<td><a href=\"#vec3create\"><code>vec3.create</code></a></td><td><a href=\"#vec3clone\"><code>vec3.clone</code></a></td><td><a href=\"#vec3length\"><code>vec3.length</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3fromvalues\"><code>vec3.fromValues</code></a></td><td><a href=\"#vec3copy\"><code>vec3.copy</code></a></td><td><a href=\"#vec3set\"><code>vec3.set</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3setscalar\"><code>vec3.setScalar</code></a></td><td><a href=\"#vec3frombuffer\"><code>vec3.fromBuffer</code></a></td><td><a href=\"#vec3tobuffer\"><code>vec3.toBuffer</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3add\"><code>vec3.add</code></a></td><td><a href=\"#vec3addscalar\"><code>vec3.addScalar</code></a></td><td><a href=\"#vec3subtract\"><code>vec3.subtract</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3subtractscalar\"><code>vec3.subtractScalar</code></a></td><td><a href=\"#vec3multiply\"><code>vec3.multiply</code></a></td><td><a href=\"#vec3divide\"><code>vec3.divide</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3ceil\"><code>vec3.ceil</code></a></td><td><a href=\"#vec3floor\"><code>vec3.floor</code></a></td><td><a href=\"#vec3min\"><code>vec3.min</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3max\"><code>vec3.max</code></a></td><td><a href=\"#vec3round\"><code>vec3.round</code></a></td><td><a href=\"#vec3scale\"><code>vec3.scale</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3scaleandadd\"><code>vec3.scaleAndAdd</code></a></td><td><a href=\"#vec3distance\"><code>vec3.distance</code></a></td><td><a href=\"#vec3squareddistance\"><code>vec3.squaredDistance</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3squaredlength\"><code>vec3.squaredLength</code></a></td><td><a href=\"#vec3negate\"><code>vec3.negate</code></a></td><td><a href=\"#vec3inverse\"><code>vec3.inverse</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3normalize\"><code>vec3.normalize</code></a></td><td><a href=\"#vec3dot\"><code>vec3.dot</code></a></td><td><a href=\"#vec3cross\"><code>vec3.cross</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3perpendicular\"><code>vec3.perpendicular</code></a></td><td><a href=\"#vec3lerp\"><code>vec3.lerp</code></a></td><td><a href=\"#vec3slerp\"><code>vec3.slerp</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3hermite\"><code>vec3.hermite</code></a></td><td><a href=\"#vec3bezier\"><code>vec3.bezier</code></a></td><td><a href=\"#vec3transformmat4\"><code>vec3.transformMat4</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3transformmat3\"><code>vec3.transformMat3</code></a></td><td><a href=\"#vec3transformquat\"><code>vec3.transformQuat</code></a></td><td><a href=\"#vec3rotatex\"><code>vec3.rotateX</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3rotatey\"><code>vec3.rotateY</code></a></td><td><a href=\"#vec3rotatez\"><code>vec3.rotateZ</code></a></td><td><a href=\"#vec3angle\"><code>vec3.angle</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3zero\"><code>vec3.zero</code></a></td><td><a href=\"#vec3str\"><code>vec3.str</code></a></td><td><a href=\"#vec3exactequals\"><code>vec3.exactEquals</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3equals\"><code>vec3.equals</code></a></td><td><a href=\"#vec3finite\"><code>vec3.finite</code></a></td><td><a href=\"#vec3isscaleinsideout\"><code>vec3.isScaleInsideOut</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3sub\"><code>vec3.sub</code></a></td><td><a href=\"#vec3mul\"><code>vec3.mul</code></a></td><td><a href=\"#vec3div\"><code>vec3.div</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3dist\"><code>vec3.dist</code></a></td><td><a href=\"#vec3sqrdist\"><code>vec3.sqrDist</code></a></td><td><a href=\"#vec3len\"><code>vec3.len</code></a></td>\n</tr><tr>\n<td><a href=\"#vec3sqrlen\"><code>vec3.sqrLen</code></a></td><td></td><td></td>\n</tr></table>\n\n**vec4**\n\n<table><tr>\n<td><a href=\"#vec4create\"><code>vec4.create</code></a></td><td><a href=\"#vec4clone\"><code>vec4.clone</code></a></td><td><a href=\"#vec4fromvalues\"><code>vec4.fromValues</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4copy\"><code>vec4.copy</code></a></td><td><a href=\"#vec4set\"><code>vec4.set</code></a></td><td><a href=\"#vec4add\"><code>vec4.add</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4subtract\"><code>vec4.subtract</code></a></td><td><a href=\"#vec4multiply\"><code>vec4.multiply</code></a></td><td><a href=\"#vec4divide\"><code>vec4.divide</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4ceil\"><code>vec4.ceil</code></a></td><td><a href=\"#vec4floor\"><code>vec4.floor</code></a></td><td><a href=\"#vec4min\"><code>vec4.min</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4max\"><code>vec4.max</code></a></td><td><a href=\"#vec4round\"><code>vec4.round</code></a></td><td><a href=\"#vec4scale\"><code>vec4.scale</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4scaleandadd\"><code>vec4.scaleAndAdd</code></a></td><td><a href=\"#vec4distance\"><code>vec4.distance</code></a></td><td><a href=\"#vec4squareddistance\"><code>vec4.squaredDistance</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4length\"><code>vec4.length</code></a></td><td><a href=\"#vec4squaredlength\"><code>vec4.squaredLength</code></a></td><td><a href=\"#vec4negate\"><code>vec4.negate</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4inverse\"><code>vec4.inverse</code></a></td><td><a href=\"#vec4normalize\"><code>vec4.normalize</code></a></td><td><a href=\"#vec4dot\"><code>vec4.dot</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4cross\"><code>vec4.cross</code></a></td><td><a href=\"#vec4lerp\"><code>vec4.lerp</code></a></td><td><a href=\"#vec4transformmat4\"><code>vec4.transformMat4</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4transformquat\"><code>vec4.transformQuat</code></a></td><td><a href=\"#vec4zero\"><code>vec4.zero</code></a></td><td><a href=\"#vec4str\"><code>vec4.str</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4exactequals\"><code>vec4.exactEquals</code></a></td><td><a href=\"#vec4equals\"><code>vec4.equals</code></a></td><td><a href=\"#vec4finite\"><code>vec4.finite</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4sub\"><code>vec4.sub</code></a></td><td><a href=\"#vec4mul\"><code>vec4.mul</code></a></td><td><a href=\"#vec4div\"><code>vec4.div</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4dist\"><code>vec4.dist</code></a></td><td><a href=\"#vec4sqrdist\"><code>vec4.sqrDist</code></a></td><td><a href=\"#vec4len\"><code>vec4.len</code></a></td>\n</tr><tr>\n<td><a href=\"#vec4sqrlen\"><code>vec4.sqrLen</code></a></td><td></td><td></td>\n</tr></table>\n\n**euler**\n\n<table><tr>\n<td><a href=\"#eulercreate\"><code>euler.create</code></a></td><td><a href=\"#eulerfromvalues\"><code>euler.fromValues</code></a></td><td><a href=\"#eulerset\"><code>euler.set</code></a></td>\n</tr><tr>\n<td><a href=\"#eulerfromdegrees\"><code>euler.fromDegrees</code></a></td><td><a href=\"#eulerfromrotationmat4\"><code>euler.fromRotationMat4</code></a></td><td><a href=\"#eulerexactequals\"><code>euler.exactEquals</code></a></td>\n</tr><tr>\n<td><a href=\"#eulerequals\"><code>euler.equals</code></a></td><td><a href=\"#eulerfromquat\"><code>euler.fromQuat</code></a></td><td><a href=\"#eulerreorder\"><code>euler.reorder</code></a></td>\n</tr></table>\n\n**quat**\n\n<table><tr>\n<td><a href=\"#quatcreate\"><code>quat.create</code></a></td><td><a href=\"#quatidentity\"><code>quat.identity</code></a></td><td><a href=\"#quatsetaxisangle\"><code>quat.setAxisAngle</code></a></td>\n</tr><tr>\n<td><a href=\"#quatgetaxisangle\"><code>quat.getAxisAngle</code></a></td><td><a href=\"#quatgetangle\"><code>quat.getAngle</code></a></td><td><a href=\"#quatmultiply\"><code>quat.multiply</code></a></td>\n</tr><tr>\n<td><a href=\"#quatrotatex\"><code>quat.rotateX</code></a></td><td><a href=\"#quatrotatey\"><code>quat.rotateY</code></a></td><td><a href=\"#quatrotatez\"><code>quat.rotateZ</code></a></td>\n</tr><tr>\n<td><a href=\"#quatcalculatew\"><code>quat.calculateW</code></a></td><td><a href=\"#quatexp\"><code>quat.exp</code></a></td><td><a href=\"#quatln\"><code>quat.ln</code></a></td>\n</tr><tr>\n<td><a href=\"#quatpow\"><code>quat.pow</code></a></td><td><a href=\"#quatslerp\"><code>quat.slerp</code></a></td><td><a href=\"#quatinvert\"><code>quat.invert</code></a></td>\n</tr><tr>\n<td><a href=\"#quatconjugate\"><code>quat.conjugate</code></a></td><td><a href=\"#quatfrommat3\"><code>quat.fromMat3</code></a></td><td><a href=\"#quatfrommat4\"><code>quat.fromMat4</code></a></td>\n</tr><tr>\n<td><a href=\"#quatfromeuler\"><code>quat.fromEuler</code></a></td><td><a href=\"#quatfromdegrees\"><code>quat.fromDegrees</code></a></td><td><a href=\"#quatstr\"><code>quat.str</code></a></td>\n</tr><tr>\n<td><a href=\"#quatclone\"><code>quat.clone</code></a></td><td><a href=\"#quatfromvalues\"><code>quat.fromValues</code></a></td><td><a href=\"#quatcopy\"><code>quat.copy</code></a></td>\n</tr><tr>\n<td><a href=\"#quatset\"><code>quat.set</code></a></td><td><a href=\"#quatadd\"><code>quat.add</code></a></td><td><a href=\"#quatscale\"><code>quat.scale</code></a></td>\n</tr><tr>\n<td><a href=\"#quatdot\"><code>quat.dot</code></a></td><td><a href=\"#quatlerp\"><code>quat.lerp</code></a></td><td><a href=\"#quatlength\"><code>quat.length</code></a></td>\n</tr><tr>\n<td><a href=\"#quatlen\"><code>quat.len</code></a></td><td><a href=\"#quatsquaredlength\"><code>quat.squaredLength</code></a></td><td><a href=\"#quatsqrlen\"><code>quat.sqrLen</code></a></td>\n</tr><tr>\n<td><a href=\"#quatmul\"><code>quat.mul</code></a></td><td><a href=\"#quatnormalize\"><code>quat.normalize</code></a></td><td><a href=\"#quatexactequals\"><code>quat.exactEquals</code></a></td>\n</tr><tr>\n<td><a href=\"#quatequals\"><code>quat.equals</code></a></td><td><a href=\"#quatrotationto\"><code>quat.rotationTo</code></a></td><td><a href=\"#quatsqlerp\"><code>quat.sqlerp</code></a></td>\n</tr><tr>\n<td><a href=\"#quatsetaxes\"><code>quat.setAxes</code></a></td><td></td><td></td>\n</tr></table>\n\n**quat2**\n\n<table><tr>\n<td><a href=\"#quat2create\"><code>quat2.create</code></a></td><td><a href=\"#quat2clone\"><code>quat2.clone</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2fromvalues\"><code>quat2.fromValues</code></a></td><td><a href=\"#quat2fromrotationtranslationvalues\"><code>quat2.fromRotationTranslationValues</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2fromrotationtranslation\"><code>quat2.fromRotationTranslation</code></a></td><td><a href=\"#quat2fromtranslation\"><code>quat2.fromTranslation</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2fromrotation\"><code>quat2.fromRotation</code></a></td><td><a href=\"#quat2frommat4\"><code>quat2.fromMat4</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2copy\"><code>quat2.copy</code></a></td><td><a href=\"#quat2identity\"><code>quat2.identity</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2set\"><code>quat2.set</code></a></td><td><a href=\"#quat2getreal\"><code>quat2.getReal</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2getdual\"><code>quat2.getDual</code></a></td><td><a href=\"#quat2setreal\"><code>quat2.setReal</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2setdual\"><code>quat2.setDual</code></a></td><td><a href=\"#quat2gettranslation\"><code>quat2.getTranslation</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2translate\"><code>quat2.translate</code></a></td><td><a href=\"#quat2rotatex\"><code>quat2.rotateX</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2rotatey\"><code>quat2.rotateY</code></a></td><td><a href=\"#quat2rotatez\"><code>quat2.rotateZ</code></a></td>\n</tr><tr>\n<td><a href=\"#quat2rotatebyquatappend\"><code>quat2.rotateByQuatAppend</code></a></td><td><a href=\"#quat2rotatebyquatprepend\"><code>quat2.rotateByQuatPrepend</code></a></td>\n</tr><tr>\n<td><a h","readmeTruncated":true,"readmeFull":"https://api.forest.dev/v1/package/shrjrd/roblox/mathcat/0.0.12/readme"}