@fimbul-works/vec
Version:
A comprehensive TypeScript vector math library providing 2D, 3D, and 4D vector operations with a focus on performance and type safety.
210 lines (156 loc) • 6.97 kB
Markdown
# @fimbul-works/vec
A high-performance TypeScript vector math library providing both **functional** and **object-oriented** APIs for 2D, 3D, and 4D vector operations with a focus on performance, type safety, and immutability.
[](https://www.npmjs.com/package/@fimbul-works/vec)
[](https://github.com/microsoft/TypeScript)
[](https://bundlephobia.com/package/@fimbul-works/vec)
## ✨ Highlights
- **🎯 Two API Styles**: Choose between modern functional API (arrays) or classic OOP API (classes)
- **🛡️ Type Safe**: Full TypeScript support with strict typing and array tuple types
- **📏 Multiple Distance Metrics**: Euclidean, Manhattan, Chebyshev, and Minkowski
- **🎮 Graphics Ready**: Homogeneous coordinates and RGB/RGBA color support
- **🧮 Comprehensive**: Complete set of vector operations for game dev, graphics, and physics
- **🌳 Tree-Shakeable**: Import only what you need with the functional API
## 📦 Installation
```bash
npm install @fimbul-works/vec
```
## 🚀 Quick Start
### Functional API (Recommended)
The **functional API** uses array tuples and is recommended for new projects:
```typescript
// Import the functional API
import { add2D, magnitude2D, dot2D, normalize2D } from "@fimbul-works/vec/2d";
import { add3D, cross3D } from "@fimbul-works/vec/3d";
// Type: ArrayVector2D = [number, number]
const position: ArrayVector2D = [100, 200];
const velocity: ArrayVector2D = [5, 10];
// Immutable operations return new arrays
const newPosition = add2D(position, velocity); // [105, 210]
const speed = magnitude2D(velocity); // 11.18...
// 3D operations
const v1: ArrayVector3D = [1, 2, 3];
const v2: ArrayVector3D = [4, 5, 6];
const sum = add3D(v1, v2); // [5, 7, 9]
const cross = cross3D(v1, v2); // [-3, 6, -3]
// Chain operations functionally
const result = normalize2D(add2D(position, velocity));
```
**Benefits of the Functional API:**
- ✅ Immutable - data never changes unexpectedly
- ✅ Tree-shakeable - smaller bundles
- ✅ Simple - just functions and arrays
- ✅ Pattern-matching ready - works with destructuring
### OOP API (Legacy)
The **OOP API** uses mutable classes and is maintained for backward compatibility:
```typescript
import { Vec2, Vec3, Vec4 } from "@fimbul-works/vec";
// Create and manipulate vectors
const position = new Vec2(100, 200);
const velocity = new Vec2(5, 10);
position.add(velocity); // Mutates position
// Method chaining
const result = new Vec3(1, 0, 0)
.rotateY(Math.PI / 4)
.scale(2)
.normalize();
// 3D graphics with homogeneous coordinates
const point = new Vec4(x, y, z, 1); // Point in 3D space
const vector = new Vec4(dx, dy, dz, 0); // Direction in 3D space
// Color manipulation with RGB accessors
const color = new Vec3(0.8, 0.2, 0.4);
color.r = 1.0; // Set red component
```
## 📖 API Documentation
Complete API documentation generated by TypeDoc:
### Functional API
- **[2D Vector Functions](./docs/ArrayVector2D.md)** - Complete 2D functional API reference
- **[3D Vector Functions](./docs/ArrayVector3D.md)** - Complete 3D functional API reference
- **[4D Vector Functions](./docs/ArrayVector4D.md)** - Complete 4D functional API reference
- **[Spherical Interpolation Functions](./docs/Slerp.md)** - Spherical Interpolation API reference
### OOP API (Legacy)
- **[Vec2 Class](./docs/Vec2.md)** - Complete Vec2 class documentation
- **[Vec3 Class](./docs/Vec3.md)** - Complete Vec3 class documentation
- **[Vec4 Class](./docs/Vec4.md)** - Complete Vec4 class documentation
## 🎯 Common Operations
### Functional API Examples
```typescript
import {
add2D, subtract2D, multiply2D, divide2D,
dot2D, cross2D,
magnitude2D, normalize2D, negate2D,
distance2D, distanceManhattan2D, distanceChebyshev2D,
lerp2D, clamp2D, limitMax2D, limitMin2D,
rotate2D, reflect2D, project2D,
angleBetween2D, angleX2D, angleY2D
} from "@fimbul-works/vec/2d";
// Vector arithmetic
const v1: ArrayVector2D = [3, 4];
const v2: ArrayVector2D = [1, 2];
add2D(v1, v2); // [4, 6] - Addition
subtract2D(v1, v2); // [2, 2] - Subtraction
multiply2D(v1, v2); // [3, 8] - Component-wise multiplication
divide2D(v1, v2); // [3, 2] - Component-wise division
// Products
dot2D(v1, v2); // 11 - Dot product
cross2D(v1, v2); // 2 - 2D cross product (returns scalar)
// Magnitude & normalization
magnitude2D(v1); // 5 - Vector length
normalize2D(v1); // [0.6, 0.8] - Unit vector
negate2D(v1); // [-3, -4] - Opposite direction
// Distance metrics
distance2D(v1, v2); // 3.606 - Euclidean distance
distanceManhattan2D(v1, v2); // 4 - Manhattan distance
distanceChebyshev2D(v1, v2); // 2 - Chebyshev distance
// Interpolation & clamping
lerp2D(v1, v2, 0.5); // [2, 3] - Linear interpolation
clamp2D(v1, 2, 8); // Keeps magnitude between 2 and 8
limitMax2D(v1, 3); // Limits magnitude to maximum of 3
limitMin2D(v1, 6); // Ensures magnitude is at least 6
// Rotation & reflection
rotate2D(v1, Math.PI / 2); // [-4, 3] - Rotate 90°
reflect2D(v1, v2); // Reflection
// Angles
angleBetween2D(v1, v2); // Angle between vectors in radians
angleX2D(v1); // Angle with x-axis
```
### Homogeneous Coordinates (4D)
```typescript
// 3D point: w = 1
const point: ArrayVector4D = [x, y, z, 1];
// 3D direction: w = 0
const direction: ArrayVector4D = [dx, dy, dz, 0];
```
## 🔄 Migration from OOP to Functional
Migrating from the OOP API to the functional API is straightforward:
| OOP (Vec2) | Functional (2D) |
|-----------|-----------------|
| `new Vec2(x, y)` | `[x, y]` as `ArrayVector2D` |
| `Vec2.add(v1, v2)` | `add2D(v1, v2)` |
| `v1.add(v2)` | `add2D(v1, v2)` |
| `v.x` | `v[0]` |
| `v.y` | `v[1]` |
| `v.magnitude` | `magnitude2D(v)` |
| `v.normalize()` | `normalize2D(v)` |
**Key differences:**
- Functional API is **immutable** - returns new arrays instead of mutating
- Uses **array indexing** `[0], [1]` instead of properties `.x, .y`
- Functions are **standalone** instead of class methods
## 📦 Import Paths
```typescript
// Functional API (Recommended)
import { add2D } from "@fimbul-works/vec/2d";
import { add3D } from "@fimbul-works/vec/3d";
import { add4D } from "@fimbul-works/vec/4d";
// OOP API (Legacy)
import { Vec2 } from "@fimbul-works/vec/vec2";
import { Vec3 } from "@fimbul-works/vec/vec3";
import { Vec4 } from "@fimbul-works/vec/vec4";
// Types
import type { ArrayVector2D } from "@fimbul-works/vec/2d";
import type { ArrayVector3D } from "@fimbul-works/vec/3d";
import type { ArrayVector4D } from "@fimbul-works/vec/4d";
```
## 📄 License
MIT License - See [LICENSE](LICENSE) file for details.
---
Built with ⚡ by [FimbulWorks](https://github.com/fimbul-works)